Messages in this thread Patch in this message | | | From | Chao Fan <> | Subject | [PATCH v12 1/5] x86/boot: Add get_acpi_rsdp() to parse RSDP in cmdline from KEXEC | Date | Thu, 29 Nov 2018 16:16:27 +0800 |
| |
To fix the conflict between KASLR and memory-hotremove, memory information in SRAT table is necessary.
ACPI SRAT (System/Static Resource Affinity Table) can show the details about memory ranges, including ranges of memory provided by hot-added memory devices. SRAT table must be introduced by RSDP pointer (Root System Description Pointer). So RSDP should be found firstly.
When booting form KEXEC/EFI/BIOS, the methods to find RSDP pointer are different. When booting from KEXEC, 'acpi_rsdp' may have been added to cmdline, so parse the cmdline and find the RSDP pointer.
Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com> --- arch/x86/boot/compressed/acpitb.c | 33 +++++++++++++++++++++++++++++++ arch/x86/boot/compressed/misc.c | 5 +++++ arch/x86/boot/compressed/misc.h | 4 ++++ lib/kstrtox.c | 5 +++++ 4 files changed, 47 insertions(+) create mode 100644 arch/x86/boot/compressed/acpitb.c
diff --git a/arch/x86/boot/compressed/acpitb.c b/arch/x86/boot/compressed/acpitb.c new file mode 100644 index 000000000000..614c45655cff --- /dev/null +++ b/arch/x86/boot/compressed/acpitb.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0 +#define BOOT_CTYPE_H +#include "misc.h" +#include "error.h" + +#include <linux/efi.h> +#include <asm/efi.h> +#include <linux/numa.h> +#include <linux/acpi.h> + +#define STATIC +#include <linux/decompress/mm.h> + +/* Store the immovable memory regions. */ +struct mem_vector immovable_mem[MAX_NUMNODES*2]; +#endif + +static acpi_physical_address get_acpi_rsdp(void) +{ +#ifdef CONFIG_KEXEC + unsigned long long res; + int len = 0; + char *val; + + val = malloc(19); + len = cmdline_find_option("acpi_rsdp", val, 19); + if (len > 0) { + val[len] = 0; + return (acpi_physical_address)kstrtoull(val, 16, &res); + } + return 0; +#endif +} diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 8dd1d5ccae58..e51713fe3add 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -12,6 +12,7 @@ * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996 */ +#define BOOT_CTYPE_H #include "misc.h" #include "error.h" #include "pgtable.h" @@ -426,3 +427,7 @@ void fortify_panic(const char *name) { error("detected buffer overflow"); } + +#ifdef BOOT_STRING +#include "../../../../lib/kstrtox.c" +#endif diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h index a1d5918765f3..809c31effa4b 100644 --- a/arch/x86/boot/compressed/misc.h +++ b/arch/x86/boot/compressed/misc.h @@ -116,3 +116,7 @@ static inline void console_init(void) void set_sev_encryption_mask(void); #endif + +/* acpitb.c */ +#define BOOT_STRING +extern int kstrtoull(const char *s, unsigned int base, unsigned long long *res); diff --git a/lib/kstrtox.c b/lib/kstrtox.c index 1006bf70bf74..a0ac1b2257b8 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c @@ -126,6 +126,9 @@ int kstrtoull(const char *s, unsigned int base, unsigned long long *res) } EXPORT_SYMBOL(kstrtoull); +/* Make compressed period code be able to use kstrtoull(). */ +#ifndef BOOT_STRING + /** * kstrtoll - convert a string to a long long * @s: The start of the string. The string must be null-terminated, and may also @@ -408,3 +411,5 @@ kstrto_from_user(kstrtou16_from_user, kstrtou16, u16); kstrto_from_user(kstrtos16_from_user, kstrtos16, s16); kstrto_from_user(kstrtou8_from_user, kstrtou8, u8); kstrto_from_user(kstrtos8_from_user, kstrtos8, s8); + +#endif /* BOOT_STRING */ -- 2.19.1
| |