From: Kairui Song <kasong@redhat.com> To: linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, x86@kernel.org, dyoung@redhat.com, bhe@redhat.com, kexec@lists.infradead.org, akpm@linux-foundation.org, robert.moore@intel.com, erik.schmauss@intel.com, rafael.j.wysocki@intel.com, lenb@kernel.org, Kairui Song <kasong@redhat.com> Subject: [PATCH v2 2/2] x86, kexec_file_load: make it work with efi=noruntime or efi=old_map Date: Tue, 15 Jan 2019 17:58:34 +0800 [thread overview] Message-ID: <20190115095834.22617-3-kasong@redhat.com> (raw) In-Reply-To: <20190115095834.22617-1-kasong@redhat.com> When efi=noruntime or efi=oldmap is used, EFI services won't be available in the second kernel, therefore the second kernel will not be able to get the ACPI RSDP address from firmware by calling EFI services and won't boot. Previously we are expecting the user to set the acpi_rsdp=<addr> on kernel command line for second kernel as there was no way to pass RSDP address to second kernel. After commit e6e094e053af ('x86/acpi, x86/boot: Take RSDP address from boot params if available'), now it's possible to set an acpi_rsdp_addr parameter in the boot_params passed to second kernel, this commit make use of it, detect and set the RSDP address when it's required for second kernel to boot. Tested with an EFI enabled KVM VM with efi=noruntime. Suggested-by: Dave Young <dyoung@redhat.com> Signed-off-by: Kairui Song <kasong@redhat.com> --- arch/x86/kernel/kexec-bzimage64.c | 21 +++++++++++++++++++++ drivers/acpi/acpica/tbxfroot.c | 3 +-- include/acpi/acpixf.h | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index 53917a3ebf94..0a90dcbd041f 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -20,6 +20,7 @@ #include <linux/mm.h> #include <linux/efi.h> #include <linux/verification.h> +#include <linux/acpi.h> #include <asm/bootparam.h> #include <asm/setup.h> @@ -255,8 +256,28 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, /* Setup EFI state */ setup_efi_state(params, params_load_addr, efi_map_offset, efi_map_sz, efi_setup_data_offset); + +#ifdef CONFIG_ACPI + /* Setup ACPI RSDP pointer in case EFI is not available in second kernel */ + if (!acpi_disabled && (!efi_enabled(EFI_RUNTIME_SERVICES) || efi_enabled(EFI_OLD_MEMMAP))) { + /* Copied from acpi_os_get_root_pointer accordingly */ + params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr; + if (!params->acpi_rsdp_addr) { + if (efi_enabled(EFI_CONFIG_TABLES)) { + if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) + params->acpi_rsdp_addr = efi.acpi20; + else if (efi.acpi != EFI_INVALID_TABLE_ADDR) + params->acpi_rsdp_addr = efi.acpi; + } else if (IS_ENABLED(CONFIG_ACPI_LEGACY_TABLES_LOOKUP)) { + acpi_find_root_pointer(¶ms->acpi_rsdp_addr); + } + } + if (!params->acpi_rsdp_addr) + pr_warn("RSDP is not available for second kernel\n"); + } #endif +#endif /* Setup EDD info */ memcpy(params->eddbuf, boot_params.eddbuf, EDDMAXNR * sizeof(struct edd_info)); diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c index 483d0ce5180a..dac1e34a931c 100644 --- a/drivers/acpi/acpica/tbxfroot.c +++ b/drivers/acpi/acpica/tbxfroot.c @@ -108,8 +108,7 @@ acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp) * ******************************************************************************/ -acpi_status ACPI_INIT_FUNCTION -acpi_find_root_pointer(acpi_physical_address *table_address) +acpi_status acpi_find_root_pointer(acpi_physical_address *table_address) { u8 *table_ptr; u8 *mem_rover; diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 7aa38b648564..869d75ecaf7d 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h @@ -474,7 +474,7 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void)) -ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION +ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_find_root_pointer(acpi_physical_address *rsdp_address)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status -- 2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: Kairui Song <kasong@redhat.com> To: linux-kernel@vger.kernel.org Cc: rafael.j.wysocki@intel.com, Kairui Song <kasong@redhat.com>, bhe@redhat.com, erik.schmauss@intel.com, x86@kernel.org, kexec@lists.infradead.org, robert.moore@intel.com, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tglx@linutronix.de, dyoung@redhat.com, akpm@linux-foundation.org, lenb@kernel.org Subject: [PATCH v2 2/2] x86, kexec_file_load: make it work with efi=noruntime or efi=old_map Date: Tue, 15 Jan 2019 17:58:34 +0800 [thread overview] Message-ID: <20190115095834.22617-3-kasong@redhat.com> (raw) In-Reply-To: <20190115095834.22617-1-kasong@redhat.com> When efi=noruntime or efi=oldmap is used, EFI services won't be available in the second kernel, therefore the second kernel will not be able to get the ACPI RSDP address from firmware by calling EFI services and won't boot. Previously we are expecting the user to set the acpi_rsdp=<addr> on kernel command line for second kernel as there was no way to pass RSDP address to second kernel. After commit e6e094e053af ('x86/acpi, x86/boot: Take RSDP address from boot params if available'), now it's possible to set an acpi_rsdp_addr parameter in the boot_params passed to second kernel, this commit make use of it, detect and set the RSDP address when it's required for second kernel to boot. Tested with an EFI enabled KVM VM with efi=noruntime. Suggested-by: Dave Young <dyoung@redhat.com> Signed-off-by: Kairui Song <kasong@redhat.com> --- arch/x86/kernel/kexec-bzimage64.c | 21 +++++++++++++++++++++ drivers/acpi/acpica/tbxfroot.c | 3 +-- include/acpi/acpixf.h | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index 53917a3ebf94..0a90dcbd041f 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -20,6 +20,7 @@ #include <linux/mm.h> #include <linux/efi.h> #include <linux/verification.h> +#include <linux/acpi.h> #include <asm/bootparam.h> #include <asm/setup.h> @@ -255,8 +256,28 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, /* Setup EFI state */ setup_efi_state(params, params_load_addr, efi_map_offset, efi_map_sz, efi_setup_data_offset); + +#ifdef CONFIG_ACPI + /* Setup ACPI RSDP pointer in case EFI is not available in second kernel */ + if (!acpi_disabled && (!efi_enabled(EFI_RUNTIME_SERVICES) || efi_enabled(EFI_OLD_MEMMAP))) { + /* Copied from acpi_os_get_root_pointer accordingly */ + params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr; + if (!params->acpi_rsdp_addr) { + if (efi_enabled(EFI_CONFIG_TABLES)) { + if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) + params->acpi_rsdp_addr = efi.acpi20; + else if (efi.acpi != EFI_INVALID_TABLE_ADDR) + params->acpi_rsdp_addr = efi.acpi; + } else if (IS_ENABLED(CONFIG_ACPI_LEGACY_TABLES_LOOKUP)) { + acpi_find_root_pointer(¶ms->acpi_rsdp_addr); + } + } + if (!params->acpi_rsdp_addr) + pr_warn("RSDP is not available for second kernel\n"); + } #endif +#endif /* Setup EDD info */ memcpy(params->eddbuf, boot_params.eddbuf, EDDMAXNR * sizeof(struct edd_info)); diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c index 483d0ce5180a..dac1e34a931c 100644 --- a/drivers/acpi/acpica/tbxfroot.c +++ b/drivers/acpi/acpica/tbxfroot.c @@ -108,8 +108,7 @@ acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp) * ******************************************************************************/ -acpi_status ACPI_INIT_FUNCTION -acpi_find_root_pointer(acpi_physical_address *table_address) +acpi_status acpi_find_root_pointer(acpi_physical_address *table_address) { u8 *table_ptr; u8 *mem_rover; diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 7aa38b648564..869d75ecaf7d 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h @@ -474,7 +474,7 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void)) -ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION +ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_find_root_pointer(acpi_physical_address *rsdp_address)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status -- 2.20.1 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2019-01-15 10:00 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-01-15 9:58 [PATCH 0/2] make kexec work with efi=noruntime or efi=old_map Kairui Song 2019-01-15 9:58 ` Kairui Song 2019-01-15 9:58 ` [PATCH v2 1/2] x86, kexec_file_load: Don't setup EFI info if EFI runtime is not enabled Kairui Song 2019-01-15 9:58 ` Kairui Song 2019-01-15 9:58 ` Kairui Song [this message] 2019-01-15 9:58 ` [PATCH v2 2/2] x86, kexec_file_load: make it work with efi=noruntime or efi=old_map Kairui Song 2019-01-15 23:10 ` Borislav Petkov 2019-01-15 23:10 ` Borislav Petkov 2019-01-16 3:32 ` Dave Young 2019-01-16 3:32 ` Dave Young 2019-01-16 5:09 ` Kairui Song 2019-01-16 5:09 ` Kairui Song 2019-01-16 6:51 ` Dave Young 2019-01-16 6:51 ` Dave Young 2019-01-16 22:24 ` Rafael J. Wysocki 2019-01-16 22:24 ` Rafael J. Wysocki 2019-01-16 7:08 ` Kairui Song 2019-01-16 7:08 ` Kairui Song 2019-01-16 9:46 ` Borislav Petkov 2019-01-16 9:46 ` Borislav Petkov 2019-01-17 7:41 ` Kairui Song 2019-01-17 7:41 ` Kairui Song 2019-01-17 7:49 ` Chao Fan 2019-01-17 7:49 ` Chao Fan 2019-01-17 8:20 ` Kairui Song 2019-01-17 8:20 ` Kairui Song 2019-01-17 8:54 ` Dave Young 2019-01-17 8:54 ` Dave Young 2019-01-17 8:53 ` Dave Young 2019-01-17 8:53 ` Dave Young 2019-01-17 9:39 ` Rafael J. Wysocki 2019-01-17 9:39 ` Rafael J. Wysocki 2019-01-18 4:47 ` Kairui Song 2019-01-18 4:47 ` Kairui Song 2019-01-18 9:45 ` Rafael J. Wysocki 2019-01-18 9:45 ` Rafael J. Wysocki 2019-01-18 10:26 ` Borislav Petkov 2019-01-18 10:26 ` Borislav Petkov 2019-01-21 1:18 ` Chao Fan 2019-01-21 1:18 ` Chao Fan 2019-01-21 8:29 ` Borislav Petkov 2019-01-21 8:29 ` Borislav Petkov 2019-01-21 8:43 ` Chao Fan 2019-01-21 8:43 ` Chao Fan 2019-01-21 9:19 ` Borislav Petkov 2019-01-21 9:19 ` Borislav Petkov 2019-01-22 3:32 ` Chao Fan 2019-01-22 3:32 ` Chao Fan 2019-01-22 12:17 ` Borislav Petkov 2019-01-22 12:17 ` Borislav Petkov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190115095834.22617-3-kasong@redhat.com \ --to=kasong@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=bhe@redhat.com \ --cc=bp@alien8.de \ --cc=dyoung@redhat.com \ --cc=erik.schmauss@intel.com \ --cc=hpa@zytor.com \ --cc=kexec@lists.infradead.org \ --cc=lenb@kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@redhat.com \ --cc=rafael.j.wysocki@intel.com \ --cc=robert.moore@intel.com \ --cc=tglx@linutronix.de \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.