Re: [PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table

2018-10-18 Thread Chao Fan
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

>
>
>




Re: [PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table

2018-10-17 Thread Baoquan He
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?



Re: [PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table

2018-10-17 Thread Chao Fan
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.
>> 
>
>




Re: [PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table

2018-10-17 Thread Baoquan He
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.
> 


[PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table

2018-10-17 Thread Chao Fan
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 
---
 arch/x86/boot/compressed/acpitb.c | 96 +++
 1 file changed, 96 insertions(+)
 create mode 100644 arch/x86/boot/compressed/acpitb.c

diff --git a/arch/x86/boot/compressed/acpitb.c 
b/arch/x86/boot/compressed/acpitb.c
new file mode 100644
index ..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 
+#include 
+#include 
+#include 
+
+/* 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 = _params->efi_info;
+   sig = (char *)>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
+}
-- 
2.17.2