From: Chao Fan <fanc.fnst@cn.fujitsu.com>
To: Ingo Molnar <mingo@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <x86@kernel.org>, <bp@alien8.de>,
<tglx@linutronix.de>, <mingo@redhat.com>, <hpa@zytor.com>,
<keescook@chromium.org>, <bhe@redhat.com>,
<msys.mizuma@gmail.com>, <indou.takao@jp.fujitsu.com>,
<caoj.fnst@cn.fujitsu.com>
Subject: Re: [PATCH v14 2/5] x86/boot: Introduce efi_get_rsdp_addr() to find RSDP from EFI table
Date: Tue, 18 Dec 2018 09:45:26 +0800 [thread overview]
Message-ID: <20181218014526.GC31775@localhost.localdomain> (raw)
In-Reply-To: <20181217173032.GB90818@gmail.com>
On Mon, Dec 17, 2018 at 06:30:32PM +0100, Ingo Molnar wrote:
>
>* Chao Fan <fanc.fnst@cn.fujitsu.com> 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 <fanc.fnst@cn.fujitsu.com>
>> ---
>> arch/x86/boot/compressed/acpi.c | 79 +++++++++++++++++++++++++++++++++
>> 1 file changed, 79 insertions(+)
>>
>> diff --git a/arch/x86/boot/compressed/acpi.c b/arch/x86/boot/compressed/acpi.c
>> index 44f19546c169..4151881d8713 100644
>> --- a/arch/x86/boot/compressed/acpi.c
>> +++ b/arch/x86/boot/compressed/acpi.c
>> @@ -28,3 +28,82 @@ 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;
>> +#ifdef CONFIG_EFI
>> + efi_system_table_t *systab;
>> + struct efi_info *e;
>
>'e' is pretty meaningless, the canonical name for efi_info local
>variables is typically 'ei' (although this is not consistent across the
>code).
OK, will change it.
>
>> + bool efi_64;
>
>Is this a flag that shows whether the EFI loader is 64-bit?
Yes, I use the signature to decide the size of EFI table.
It's used here:
+ size = efi_64 ? sizeof(efi_config_table_64_t) :
+ sizeof(efi_config_table_32_t);
>
>> + char *sig;
>> + int size;
>> + int i;
>> +
>> + e = &boot_params->efi_info;
>> + sig = (char *)&e->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 *)(e->efi_systab | ((__u64)e->efi_systab_hi<<32));
>> +#else
>> + if (e->efi_systab_hi || e->efi_memmap_hi) {
>> + debug_putstr("Error getting RSDP address: EFI system table located above 4GB.\n");
>> + return 0;
>> + }
>> + systab = (efi_system_table_t *)e->efi_systab;
>> +#endif
>> +
>> + if (!systab)
>> + return 0;
>
>Is it normal that EFI provides no 'systab'?
I think not normal, to make sure the code run normally.
We will use it below like: i < systab->nr_tables, if
systab is wrong, the code will fail to work.
>
>> + /*
>> + * 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;
>> +
>> + tmp_table = (efi_config_table_64_t *)config_tables;
>
>Since 'config_tables' is a void * there's no need to cast the type.
>
>> + guid = tmp_table->guid;
>> + table = tmp_table->table;
>> +
>> + if (!IS_ENABLED(CONFIG_X86_64) && table >> 32) {
>> + debug_putstr("Error getting RSDP address: EFI config table located above 4GB.\n");
>> + return 0;
>> + }
>> + } else {
>> + efi_config_table_32_t *tmp_table;
>> +
>> + tmp_table = (efi_config_table_32_t *)config_tables;
>
>Ditto.
>
>> + guid = tmp_table->guid;
>> + table = tmp_table->table;
>> + }
>
>So it looks like
>
>> +
>> + if (!(efi_guidcmp(guid, ACPI_TABLE_GUID)))
>> + rsdp_addr = (acpi_physical_address)table;
>> + else if (!(efi_guidcmp(guid, ACPI_20_TABLE_GUID)))
>> + return (acpi_physical_address)table;
>
>'return' is not a function.
Got it, will clean the type cast.
Thanks,
Chao Fan
>
>Thanks,
>
> Ingo
>
>
next prev parent reply other threads:[~2018-12-18 1:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-14 9:30 [PATCH v14 0/5] x86/boot/KASLR: Parse ACPI table and limit KASLR to choosing immovable memory Chao Fan
2018-12-14 9:30 ` [PATCH v14 1/5] x86/boot: Introduce get_acpi_rsdp() to parse RSDP in cmdline from KEXEC Chao Fan
2018-12-17 17:25 ` Ingo Molnar
2018-12-17 18:31 ` Thomas Gleixner
2018-12-17 18:48 ` Ingo Molnar
2018-12-18 1:27 ` Chao Fan
2018-12-18 11:28 ` Borislav Petkov
2018-12-19 1:18 ` Chao Fan
2018-12-14 9:30 ` [PATCH v14 2/5] x86/boot: Introduce efi_get_rsdp_addr() to find RSDP from EFI table Chao Fan
2018-12-17 17:30 ` Ingo Molnar
2018-12-17 17:36 ` Ingo Molnar
2018-12-25 7:43 ` Chao Fan
2018-12-17 18:32 ` Thomas Gleixner
2018-12-17 18:49 ` Ingo Molnar
2018-12-18 1:45 ` Chao Fan [this message]
2018-12-14 9:30 ` [PATCH v14 3/5] x86/boot: Introduce bios_get_rsdp_addr() to search RSDP in memory Chao Fan
2018-12-17 17:38 ` Ingo Molnar
2018-12-18 2:28 ` Chao Fan
2018-12-14 9:30 ` [PATCH v14 4/5] x86/boot: Parse SRAT address from RSDP and store immovable memory Chao Fan
2018-12-17 17:41 ` Ingo Molnar
2018-12-18 3:17 ` Chao Fan
2018-12-14 9:30 ` [PATCH v14 5/5] x86/boot/KASLR: Limit KASLR to extracting kernel in " Chao Fan
2018-12-17 17:43 ` Ingo Molnar
2018-12-18 2:49 ` Chao Fan
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=20181218014526.GC31775@localhost.localdomain \
--to=fanc.fnst@cn.fujitsu.com \
--cc=bhe@redhat.com \
--cc=bp@alien8.de \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=hpa@zytor.com \
--cc=indou.takao@jp.fujitsu.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=msys.mizuma@gmail.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: link
Be 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.