Messages in this thread Patch in this message | | | From | Pingfan Liu <> | Subject | [PATCHv2] x86/boot/KASLR: skip the specified crashkernel reserved region | Date | Wed, 13 Mar 2019 12:19:31 +0800 |
| |
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 <kernelfans@gmail.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Baoquan He <bhe@redhat.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Nicolas Pitre <nico@linaro.org> Cc: Pingfan Liu <kernelfans@gmail.com> Cc: Chao Fan <fanc.fnst@cn.fujitsu.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: linux-kernel@vger.kernel.org --- 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
| |