Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4572292imu; Tue, 15 Jan 2019 02:17:14 -0800 (PST) X-Google-Smtp-Source: ALg8bN5WCcqKH8jvLjnvAsmcg5qAgG9K2/RuMee4wDg27E/iF3gDRln5gsTZKcJldMTDzW6m0Knb X-Received: by 2002:a63:ec13:: with SMTP id j19mr3172010pgh.6.1547547434063; Tue, 15 Jan 2019 02:17:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547547434; cv=none; d=google.com; s=arc-20160816; b=U19l38r2KPGB0k76CVUejJjjDA1H944E0m31swZ9wySJ0q4SUXWC+XZlb/a7kM7cFS 28mN7XGsdIa3G73kt8iNi1DmrWmBD6kOT4RKzqfo+HUH1cA0qhWJtn4olWIXR3rOjrUN uCcD1Ui8F+3SwZXabGVrwcv4Jx3qcOUKo8rrTb4AUnNYp/YbTCbtTycmV5kdDLofls91 1aDw0KqNX9Zzw1x8uHcWiIwo3vM0Mcw6j2hU1v35wsf0bIMhpetVRRKAs6LwygL3yMW7 A/Ioh4TYPsLPJV2hX6JE6409rS9SXvc/EzHJDJxn6Z7ndASrs8ENdYd9cEgk/qTh/UYa BfWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=zaPU6UF9T2qFOHyYQvs64WIkPXRRBIwPOt0HXQ63DXA=; b=opY7L6HzfQ315rJPO1GlhjKK7qaCFX7qycXk0SF8mo06pM8YQbNoIPrQWiImKEvv/O 1gQG2FLvpRnc9FCcDEbCrI1igFcpwjHNkG3aY9ewHSjsVUOu2maLL38lxbnnem2Zq84Q /iq5w2Xp7hKZS3TJQ/WiFn3UICPY0uO04nAE+dZO+oXZa3nY3JjT3A2/4DxUJbVD+q1Y /zuIg4wWVqbm6aSc3RECkcMC1eGGiix8flCOvluoTxwRG7+bySsVY1/oFZQcu1/g2dq1 jkUXyMBeqz5gEb+FRneXb89iezO5AEPQ1KpkcqRRbhh2Jvc13p2+a4kieGWg6m2q1VuZ l+8w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 37si2910373plv.243.2019.01.15.02.16.58; Tue, 15 Jan 2019 02:17:14 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728272AbfAOKAD (ORCPT + 99 others); Tue, 15 Jan 2019 05:00:03 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36040 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726842AbfAOKAC (ORCPT ); Tue, 15 Jan 2019 05:00:02 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA00F8AE48; Tue, 15 Jan 2019 10:00:00 +0000 (UTC) Received: from kasong-desktop-nay-redhat-com.nay.redhat.com (unknown [10.66.128.41]) by smtp.corp.redhat.com (Postfix) with ESMTP id DC8785C543; Tue, 15 Jan 2019 09:59:36 +0000 (UTC) From: Kairui Song 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 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 Message-Id: <20190115095834.22617-3-kasong@redhat.com> In-Reply-To: <20190115095834.22617-1-kasong@redhat.com> References: <20190115095834.22617-1-kasong@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 15 Jan 2019 10:00:01 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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= 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 Signed-off-by: Kairui Song --- 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 #include #include +#include #include #include @@ -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