lkml.org 
[lkml]   [2018]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 3/4] x86/boot/KASLR: Walk srat tables to filter immovable memory
    Date
    If 'CONFIG_MEMORY_HOTREMOVE' specified, walk the acpi srat memory
    tables, store the immovable memory regions, so that kaslr can get
    the information abouth where can be selected or not.
    If 'CONFIG_MEMORY_HOTREMOVE' not specified, go on the old code.

    Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com>
    ---
    arch/x86/boot/compressed/kaslr.c | 55 ++++++++++++++++++++++++++++++++
    1 file changed, 55 insertions(+)

    diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
    index 531c9876f573..c3634ef5cc01 100644
    --- a/arch/x86/boot/compressed/kaslr.c
    +++ b/arch/x86/boot/compressed/kaslr.c
    @@ -31,6 +31,7 @@

    #include "misc.h"
    #include "error.h"
    +#include "acpitb.h"
    #include "../string.h"

    #include <generated/compile.h>
    @@ -104,6 +105,14 @@ static bool memmap_too_large;
    /* Store memory limit specified by "mem=nn[KMG]" or "memmap=nn[KMG]" */
    unsigned long long mem_limit = ULLONG_MAX;

    +#ifdef CONFIG_MEMORY_HOTREMOVE
    +/* Store the immovable memory regions */
    +struct mem_vector immovable_mem[MAX_NUMNODES*2];
    +
    +/* Store the account of immovable memory regions */
    +static int num_immovable_mem;
    +#endif
    +

    enum mem_avoid_index {
    MEM_AVOID_ZO_RANGE = 0,
    @@ -298,6 +307,47 @@ static int handle_mem_options(void)
    return 0;
    }

    +#ifdef CONFIG_MEMORY_HOTREMOVE
    +/*
    + * According to ACPI table, filter the immvoable memory regions
    + * and store them in immovable_mem[].
    + */
    +static void handle_immovable_mem(void)
    +{
    + struct acpi_table_header *table_header;
    + struct acpi_subtable_header *table;
    + struct acpi_srat_mem_affinity *ma;
    + unsigned long table_size;
    + unsigned long table_end;
    + int i = 0;
    +
    + table_header = get_acpi_srat_table();
    +
    + if (!table_header)
    + return;
    +
    + table_end = (unsigned long)table_header + table_header->length;
    +
    + table = (struct acpi_subtable_header *)
    + ((unsigned long)table_header + sizeof(struct acpi_table_srat));
    +
    + table_size = sizeof(struct acpi_subtable_header);
    + while (((unsigned long)table) + table->length < table_end) {
    + if (table->type == 1) {
    + ma = (struct acpi_srat_mem_affinity *)table;
    + if (!(ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)) {
    + immovable_mem[i].start = ma->base_address;
    + immovable_mem[i].size = ma->length;
    + i++;
    + }
    + }
    + table = (struct acpi_subtable_header *)
    + ((unsigned long)table + table->length);
    + }
    + num_immovable_mem = i;
    +}
    +#endif
    +
    /*
    * In theory, KASLR can put the kernel anywhere in the range of [16M, 64T).
    * The mem_avoid array is used to store the ranges that need to be avoided
    @@ -421,6 +471,11 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size,
    /* Mark the memmap regions we need to avoid */
    handle_mem_options();

    +#ifdef CONFIG_MEMORY_HOTREMOVE
    + /* Mark the immovable regions we need to choose */
    + handle_immovable_mem();
    +#endif
    +
    #ifdef CONFIG_X86_VERBOSE_BOOTUP
    /* Make sure video RAM can be used. */
    add_identity_map(0, PMD_SIZE);
    --
    2.17.1


    \
     
     \ /
      Last update: 2018-07-17 12:07    [W:2.345 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site