On 10/17/18 at 06:20pm, Chao Fan wrote: > If KEXEC write the RSDP pointer to cmdline, parse the cmdline > and use it. > Imitate from early_param of "acpi_rsdp". > > Signed-off-by: Chao Fan <fanc.fnst@xxxxxxxxxxxxxx> > --- > arch/x86/boot/compressed/acpitb.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/arch/x86/boot/compressed/acpitb.c b/arch/x86/boot/compressed/acpitb.c > index 50fa65cf824d..37b1f4407be8 100644 > --- a/arch/x86/boot/compressed/acpitb.c > +++ b/arch/x86/boot/compressed/acpitb.c > @@ -8,6 +8,9 @@ > #include <linux/numa.h> > #include <linux/acpi.h> > > +#define STATIC > +#include <linux/decompress/mm.h> > + > /* Search EFI table for RSDP table. */ > static void efi_get_rsdp_addr(acpi_physical_address *rsdp_addr) > { > @@ -200,3 +203,23 @@ static void bios_get_rsdp_addr(acpi_physical_address *rsdp_addr) > *rsdp_addr = (acpi_physical_address)address; > } > } > + > +static void get_acpi_rsdp(acpi_physical_address *rsdp_addr) > +{ > +#ifdef CONFIG_KEXEC > + unsigned long long res; > + int len = 0; > + char *val; > + > + val = malloc(20); Why is the length 20? Defined a macro? > + len = cmdline_find_option("acpi_rsdp", val, 20); > + > + if (len == -1) > + return; > + > + if (len > 0) { > + val[len] = 0; > + *rsdp_addr = (acpi_physical_address)kstrtoull(val, 0, &res); > + } > +#endif > +} > -- > 2.17.2 > > >