Message ID | 20181017102012.872-4-fanc.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Series | x86/boot/KASLR: Parse ACPI table and limit kaslr in immovable memory | expand |
On 10/17/18 at 06:20pm, Chao Fan wrote: > There is a bug that kaslr may randomly choose some positions > which are located in movable memory regions. This will break memory > hotplug feature and make the movable memory chosen by KASLR can't be > removed. So dig SRAT table from ACPI tables to get memory information. This patch is only adding a function efi_get_rsdp_addr() which will be used in later patch. Do we need to describe bug here? Can we focus on what is this function, and why it's written like that, and why it's here? > > Imitate the ACPI code of parsing ACPI tables to dig and read ACPI > tables. Since some operations are not needed here, functions are > simplified. Functions will be used to dig only SRAT tables to get > information of memory, so that KASLR can the memory in immovable node. >
On Thu, Oct 18, 2018 at 12:35:39PM +0800, Baoquan He wrote: >On 10/17/18 at 06:20pm, Chao Fan wrote: >> There is a bug that kaslr may randomly choose some positions >> which are located in movable memory regions. This will break memory >> hotplug feature and make the movable memory chosen by KASLR can't be >> removed. So dig SRAT table from ACPI tables to get memory information. > >This patch is only adding a function efi_get_rsdp_addr() which will be >used in later patch. Do we need to describe bug here? Yes, it's the first mail of this serial, so I add more log. > >Can we focus on what is this function, and why it's written like that, >and why it's here? Sure. I am just afraid lack of log. Thanks, Chao Fan >> >> Imitate the ACPI code of parsing ACPI tables to dig and read ACPI >> tables. Since some operations are not needed here, functions are >> simplified. Functions will be used to dig only SRAT tables to get >> information of memory, so that KASLR can the memory in immovable node. >> > >
On 10/18/18 at 01:54pm, Chao Fan wrote: > On Thu, Oct 18, 2018 at 12:35:39PM +0800, Baoquan He wrote: > >On 10/17/18 at 06:20pm, Chao Fan wrote: > >> There is a bug that kaslr may randomly choose some positions > >> which are located in movable memory regions. This will break memory > >> hotplug feature and make the movable memory chosen by KASLR can't be > >> removed. So dig SRAT table from ACPI tables to get memory information. > > > >This patch is only adding a function efi_get_rsdp_addr() which will be > >used in later patch. Do we need to describe bug here? > > Yes, it's the first mail of this serial, so I add more log. patch 3/8?
On Thu, Oct 18, 2018 at 01:56:44PM +0800, Baoquan He wrote: >On 10/18/18 at 01:54pm, Chao Fan wrote: >> On Thu, Oct 18, 2018 at 12:35:39PM +0800, Baoquan He wrote: >> >On 10/17/18 at 06:20pm, Chao Fan wrote: >> >> There is a bug that kaslr may randomly choose some positions >> >> which are located in movable memory regions. This will break memory >> >> hotplug feature and make the movable memory chosen by KASLR can't be >> >> removed. So dig SRAT table from ACPI tables to get memory information. >> > >> >This patch is only adding a function efi_get_rsdp_addr() which will be >> >used in later patch. Do we need to describe bug here? >> >> Yes, it's the first mail of this serial, so I add more log. > >patch 3/8? Since 1/8 and 2/8 are two functions introduced. I will consider more about the log. Thanks, Chao Fan > > >
diff --git a/arch/x86/boot/compressed/acpitb.c b/arch/x86/boot/compressed/acpitb.c new file mode 100644 index 000000000000..56b54b0e0889 --- /dev/null +++ b/arch/x86/boot/compressed/acpitb.c @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: GPL-2.0 +#define BOOT_CTYPE_H +#include "misc.h" +#include "error.h" + +#include <linux/efi.h> +#include <asm/efi.h> +#include <linux/numa.h> +#include <linux/acpi.h> + +/* Search EFI table for RSDP table. */ +static void efi_get_rsdp_addr(acpi_physical_address *rsdp_addr) +{ +#ifdef CONFIG_EFI + efi_system_table_t *systab; + bool efi_64 = false; + void *config_tables; + struct efi_info *e; + 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; + } + + /* 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("Table located above 4GB. EFI should be disabled.\n"); + return; + } + systab = (efi_system_table_t *)e->efi_systab; +#endif + + if (!systab) + return; + + /* + * Get EFI tables from systab. Based on efi_config_init() and + * efi_config_parse_tables(). Only dig out the config_table. + */ + size = efi_64 ? sizeof(efi_config_table_64_t) : + sizeof(efi_config_table_32_t); + + for (i = 0; i < systab->nr_tables; i++) { + efi_guid_t guid; + unsigned long table; + + 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; + guid = tmp_table->guid; + table = tmp_table->table; +#ifndef CONFIG_64BIT + if (table >> 32) { + debug_putstr("Table located above 4G. EFI should be disabled.\n"); + return; + } +#endif + } else { + efi_config_table_32_t *tmp_table; + + tmp_table = (efi_config_table_32_t *)config_tables; + guid = tmp_table->guid; + table = tmp_table->table; + } + + /* + * Get RSDP from EFI tables. + * If ACPI20 table found, use it. + * If ACPI20 table not found, but ACPI table found, + * use the ACPI table. + */ + if (!(efi_guidcmp(guid, ACPI_TABLE_GUID))) { + *rsdp_addr = (acpi_physical_address)table; + } else if (!(efi_guidcmp(guid, ACPI_20_TABLE_GUID))) { + *rsdp_addr = (acpi_physical_address)table; + return; + } + } +#endif +}
There is a bug that kaslr may randomly choose some positions which are located in movable memory regions. This will break memory hotplug feature and make the movable memory chosen by KASLR can't be removed. So dig SRAT table from ACPI tables to get memory information. Imitate the ACPI code of parsing ACPI tables to dig and read ACPI tables. Since some operations are not needed here, functions are simplified. Functions will be used to dig only SRAT tables to get information of memory, so that KASLR can the memory in immovable node. This function works for EFI. Dig RSDP from EFI tabler, based on efi_init(). Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com> --- arch/x86/boot/compressed/acpitb.c | 96 +++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 arch/x86/boot/compressed/acpitb.c