crashkernel=x@y option may fail to reserve the required memory region if KASLR puts kernel into the region. To avoid this uncertainty, making KASLR skip the required region.
Signed-off-by: Pingfan Liu <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: Baoquan He <[email protected]> Cc: Will Deacon <[email protected]> Cc: Nicolas Pitre <[email protected]> Cc: Pingfan Liu <[email protected]> Cc: Chao Fan <[email protected]> Cc: "Kirill A. Shutemov" <[email protected]> Cc: Ard Biesheuvel <[email protected]> Cc: [email protected] --- v1 -> v2: fix some trival format arch/x86/boot/compressed/kaslr.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c index 9ed9709..e185318 100644 --- a/arch/x86/boot/compressed/kaslr.c +++ b/arch/x86/boot/compressed/kaslr.c @@ -109,6 +109,7 @@ enum mem_avoid_index { MEM_AVOID_BOOTPARAMS, MEM_AVOID_MEMMAP_BEGIN, MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1, + MEM_AVOID_CRASHKERNEL, MEM_AVOID_MAX, }; @@ -240,6 +241,25 @@ static void parse_gb_huge_pages(char *param, char *val) } } +/* parse crashkernel=x@y option */ +static void mem_avoid_crashkernel_simple(char *option) +{ + unsigned long long crash_size, crash_base; + char *cur = option; + + crash_size = memparse(option, &cur); + if (option == cur) + return; + + if (*cur == '@') { + option = cur + 1; + crash_base = memparse(option, &cur); + if (option == cur) + return; + mem_avoid[MEM_AVOID_CRASHKERNEL].start = crash_base; + mem_avoid[MEM_AVOID_CRASHKERNEL].size = crash_size; + } +} static void handle_mem_options(void) { @@ -250,7 +270,7 @@ static void handle_mem_options(void) u64 mem_size; if (!strstr(args, "memmap=") && !strstr(args, "mem=") && - !strstr(args, "hugepages")) + !strstr(args, "hugepages") && !strstr(args, "crashkernel=")) return; tmp_cmdline = malloc(len + 1); @@ -286,6 +306,8 @@ static void handle_mem_options(void) goto out; mem_limit = mem_size; + } else if (strstr(param, "crashkernel")) { + mem_avoid_crashkernel_simple(val); } } @@ -414,7 +436,7 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size, /* We don't need to set a mapping for setup_data. */ - /* Mark the memmap regions we need to avoid */ + /* Mark the regions we need to avoid */ handle_mem_options(); #ifdef CONFIG_X86_VERBOSE_BOOTUP -- 2.7.4

