Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp35397imu; Thu, 10 Jan 2019 17:26:11 -0800 (PST) X-Google-Smtp-Source: ALg8bN46Trt60hfstNq88KNT4uoduTieeMhalYXHXziBP4EjKOYSWJLS8gw4cDwgrRLC/fLslucx X-Received: by 2002:a17:902:4601:: with SMTP id o1mr12630530pld.243.1547169971447; Thu, 10 Jan 2019 17:26:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547169971; cv=none; d=google.com; s=arc-20160816; b=CsQgKc6OBJ6rQTTrDnXrfHHIEVJXBe9j5o8FJapGEWXg/J7wQNroHV8Dj6pOSXBaLk lchO4+CnxY7VS1DPvYyp96W6fMTW+OYtY1MF26q8RL1mZPxbQ+ZXnfm16pF+2rgLc8uW cnVHZXDWzSqY12H0LF6VD9epfd3lJASpz46ZV9o8HaRBXug0hgh5f98dmtj6i26F32VX oABtdBv3bdaUQxIiiQ5NA/qZyb38OX1ACrtsopAVlt4EVD3nufxLWD8TBX2j59CeOD5s GfOO5y4IG6fIc44k+a+HMKdKrd/xSRPeIH7VYeJYsK1WdbJpb8Ehi8Y8K5IZht+26crt TJbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=IVrIRNkcySdWtrgOEOCMEpKNDMjT9WDWeGINuw7i3tI=; b=wpcIvDT3zp6qPIH1tdiDbq1MOgpnIY0BqRiFleaeGFT+wXLt/df5fPFkZFLBVINfOO gO2zEwPdjDj/WaQXgohh5+wprGfWP0dji0jJNGCfQ1/gIKCI082AlsLn+EPCROyYLk0C Y2HRo8rV3/lYCM0CXdZoTMFPeRuTbcQvSdheOf4Ain9XHsgisTsmZcvN1LDB7/9guC0q bz2hak15P2bqkA7FjUDVFEfGyYcq6GDLU70DMOLGbPx7aVoEuqZtFwLO2ysPt6Rk5SaS OHGXh0jQNW2UPDHwOzzn9vNR4ovqzg+MNa0lrIVhHymeRH4oLClStiwMusaVwfIZGryt xBuA== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f65si13174443pfb.194.2019.01.10.17.25.55; Thu, 10 Jan 2019 17:26:11 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729184AbfAKBYv (ORCPT + 99 others); Thu, 10 Jan 2019 20:24:51 -0500 Received: from mail.cn.fujitsu.com ([183.91.158.132]:15592 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726369AbfAKBYv (ORCPT ); Thu, 10 Jan 2019 20:24:51 -0500 X-IronPort-AV: E=Sophos;i="5.56,463,1539619200"; d="scan'208";a="51752292" Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 11 Jan 2019 09:24:49 +0800 Received: from G08CNEXCHPEKD01.g08.fujitsu.local (unknown [10.167.33.80]) by cn.fujitsu.com (Postfix) with ESMTP id 5C2A14BAD7CC; Fri, 11 Jan 2019 09:24:49 +0800 (CST) Received: from localhost.localdomain (10.167.225.56) by G08CNEXCHPEKD01.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 11 Jan 2019 09:24:48 +0800 Date: Fri, 11 Jan 2019 09:23:53 +0800 From: Chao Fan To: Borislav Petkov CC: , , , , , , , , , Subject: Re: [PATCH v15 3/6] x86/boot: Introduce efi_get_rsdp_addr() to find RSDP from EFI table Message-ID: <20190111012353.GD2216@localhost.localdomain> References: <20190107032243.25324-1-fanc.fnst@cn.fujitsu.com> <20190107032243.25324-4-fanc.fnst@cn.fujitsu.com> <20190110211523.GG17621@zn.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20190110211523.GG17621@zn.tnic> User-Agent: Mutt/1.10.1 (2018-07-13) X-Originating-IP: [10.167.225.56] X-yoursite-MailScanner-ID: 5C2A14BAD7CC.A08FF X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: fanc.fnst@cn.fujitsu.com X-Spam-Status: No Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jan 10, 2019 at 10:15:23PM +0100, Borislav Petkov wrote: >On Mon, Jan 07, 2019 at 11:22:40AM +0800, Chao Fan wrote: >> Memory information in SRAT is necessary to fix the conflict between >> KASLR and memory-hotremove. So RSDP and SRAT should be parsed. >> >> When booting form KEXEC/EFI/BIOS, the methods to compute RSDP >> are different. When booting from EFI, EFI table points to RSDP. >> So parse the EFI table and find the RSDP. >> >> Signed-off-by: Chao Fan >> --- >> arch/x86/boot/compressed/acpi.c | 83 +++++++++++++++++++++++++++++++++ >> 1 file changed, 83 insertions(+) >> >> diff --git a/arch/x86/boot/compressed/acpi.c b/arch/x86/boot/compressed/acpi.c >> index 7ca5001d7639..f74c5d033d79 100644 >> --- a/arch/x86/boot/compressed/acpi.c >> +++ b/arch/x86/boot/compressed/acpi.c >> @@ -5,6 +5,8 @@ >> #include "../string.h" >> >> #include >> +#include >> +#include >> >> /* >> * Max length of 64-bit hex address string is 19, prefix "0x" + 16 hex >> @@ -28,3 +30,84 @@ static acpi_physical_address get_acpi_rsdp(void) >> #endif >> return 0; >> } >> + >> +/* Search EFI table for RSDP. */ >> +static acpi_physical_address efi_get_rsdp_addr(void) >> +{ >> + acpi_physical_address rsdp_addr = 0; > > ><---- newline here. > Will add it. >> +#ifdef CONFIG_EFI >> + efi_system_table_t *systab; >> + struct efi_info *ei; >> + bool efi_64; >> + char *sig; >> + int size; >> + int i; >> + >> + ei = &boot_params->efi_info; >> + sig = (char *)&ei->efi_loader_signature; >> + >> + if (!strncmp(sig, EFI64_LOADER_SIGNATURE, 4)) { >> + efi_64 = true; >> + } else if (!strncmp(sig, EFI32_LOADER_SIGNATURE, 4)) { >> + efi_64 = false; >> + } else { >> + debug_putstr("Wrong EFI loader signature.\n"); >> + return 0; >> + } >> + >> + /* Get systab from boot params. Based on efi_init(). */ >> +#ifdef CONFIG_X86_64 >> + systab = (efi_system_table_t *)(ei->efi_systab | ((__u64)ei->efi_systab_hi<<32)); >> +#else >> + if (ei->efi_systab_hi || ei->efi_memmap_hi) { >> + debug_putstr("Error getting RSDP address: EFI system table located above 4GB.\n"); >> + return 0; >> + } >> + systab = (efi_system_table_t *)ei->efi_systab; >> +#endif >> + >> + if (!systab) >> + error("EFI system table is not found."); > >s/is// Will drop the 'is'. > >> + >> + /* >> + * Get EFI tables from systab. Based on efi_config_init() and >> + * efi_config_parse_tables(). >> + */ >> + size = efi_64 ? sizeof(efi_config_table_64_t) : >> + sizeof(efi_config_table_32_t); >> + >> + for (i = 0; i < systab->nr_tables; i++) { >> + void *config_tables; >> + unsigned long table; >> + efi_guid_t guid; >> + >> + config_tables = (void *)(systab->tables + size * i); >> + if (efi_64) { >> + efi_config_table_64_t *tmp_table; >> + u64 table64; >> + >> + tmp_table = config_tables; >> + guid = tmp_table->guid; >> + table64 = tmp_table->table; >> + table = table64; > >That table64 looks superfluous. Yes, 'table64' looks superfluous here, but after these lines, there is: if (!IS_ENABLED(CONFIG_X86_64) && table64 >> 32) { so the 'table64' is useful here for i386. 'table' is unsigned long, it can't do the right shift. But the 'table64' who is u64 can do that right shift. Thanks, Chao Fan > >-- >Regards/Gruss, > Boris. > >Good mailing practices for 400: avoid top-posting and trim the reply. > >