efi: Move mem_attr_table out of struct efi
authorArd Biesheuvel <ardb@kernel.org>
Wed, 22 Jan 2020 14:05:12 +0000 (15:05 +0100)
committerArd Biesheuvel <ardb@kernel.org>
Sun, 23 Feb 2020 20:59:42 +0000 (21:59 +0100)
The memory attributes table is only used at init time by the core EFI
code, so there is no need to carry its address in struct efi that is
shared with the world. So move it out, and make it __ro_after_init as
well, considering that the value is set during early boot.

Tested-by: Tony Luck <tony.luck@intel.com> # arch/ia64
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/x86/platform/efi/efi.c
drivers/firmware/efi/efi.c
drivers/firmware/efi/memattr.c
include/linux/efi.h

index 421f082535c5f1574e8ce85e4d1732f90755a076..22dc3678cdba2d69fdb8fa531d4d24271f709634 100644 (file)
@@ -83,7 +83,7 @@ static const unsigned long * const efi_tables[] = {
        &efi.config_table,
        &efi.esrt,
        &prop_phys,
-       &efi.mem_attr_table,
+       &efi_mem_attr_table,
 #ifdef CONFIG_EFI_RCI2_TABLE
        &rci2_table_phys,
 #endif
index bbb6246d08be5dcaeb14e92fc524bb8298ca2cea..1fc4e174f11d60fcc53717bb475e85036a46ee4a 100644 (file)
@@ -43,7 +43,6 @@ struct efi __read_mostly efi = {
        .runtime                = EFI_INVALID_TABLE_ADDR,
        .config_table           = EFI_INVALID_TABLE_ADDR,
        .esrt                   = EFI_INVALID_TABLE_ADDR,
-       .mem_attr_table         = EFI_INVALID_TABLE_ADDR,
        .tpm_log                = EFI_INVALID_TABLE_ADDR,
        .tpm_final_log          = EFI_INVALID_TABLE_ADDR,
        .mem_reserve            = EFI_INVALID_TABLE_ADDR,
@@ -467,7 +466,7 @@ static __initdata efi_config_table_type_t common_tables[] = {
        {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
        {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
        {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
-       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
+       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi_mem_attr_table},
        {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &rng_seed},
        {LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
        {LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
index 58452fde92cc0ebe837e602cc89691458aa2524f..5737cb0fcd44efbbbe3c6b3e84b93ede544af6a3 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/early_ioremap.h>
 
 static int __initdata tbl_size;
+unsigned long __ro_after_init efi_mem_attr_table = EFI_INVALID_TABLE_ADDR;
 
 /*
  * Reserve the memory associated with the Memory Attributes configuration
@@ -22,13 +23,13 @@ int __init efi_memattr_init(void)
 {
        efi_memory_attributes_table_t *tbl;
 
-       if (efi.mem_attr_table == EFI_INVALID_TABLE_ADDR)
+       if (efi_mem_attr_table == EFI_INVALID_TABLE_ADDR)
                return 0;
 
-       tbl = early_memremap(efi.mem_attr_table, sizeof(*tbl));
+       tbl = early_memremap(efi_mem_attr_table, sizeof(*tbl));
        if (!tbl) {
                pr_err("Failed to map EFI Memory Attributes table @ 0x%lx\n",
-                      efi.mem_attr_table);
+                      efi_mem_attr_table);
                return -ENOMEM;
        }
 
@@ -39,7 +40,7 @@ int __init efi_memattr_init(void)
        }
 
        tbl_size = sizeof(*tbl) + tbl->num_entries * tbl->desc_size;
-       memblock_reserve(efi.mem_attr_table, tbl_size);
+       memblock_reserve(efi_mem_attr_table, tbl_size);
        set_bit(EFI_MEM_ATTR, &efi.flags);
 
 unmap:
@@ -147,10 +148,10 @@ int __init efi_memattr_apply_permissions(struct mm_struct *mm,
        if (WARN_ON(!efi_enabled(EFI_MEMMAP)))
                return 0;
 
-       tbl = memremap(efi.mem_attr_table, tbl_size, MEMREMAP_WB);
+       tbl = memremap(efi_mem_attr_table, tbl_size, MEMREMAP_WB);
        if (!tbl) {
                pr_err("Failed to map EFI Memory Attributes table @ 0x%lx\n",
-                      efi.mem_attr_table);
+                      efi_mem_attr_table);
                return -ENOMEM;
        }
 
index 36380542e0549105d4c9da9d333816aa14a9413f..b093fce1cf598dec31619e2a0fd6a7dddca8ca33 100644 (file)
@@ -539,7 +539,6 @@ extern struct efi {
        unsigned long runtime;          /* runtime table */
        unsigned long config_table;     /* config tables */
        unsigned long esrt;             /* ESRT table */
-       unsigned long mem_attr_table;   /* memory attributes table */
        unsigned long tpm_log;          /* TPM2 Event Log table */
        unsigned long tpm_final_log;    /* TPM2 Final Events Log table */
        unsigned long mem_reserve;      /* Linux EFI memreserve table */
@@ -641,6 +640,8 @@ extern void __init efi_fake_memmap(void);
 static inline void efi_fake_memmap(void) { }
 #endif
 
+extern unsigned long efi_mem_attr_table;
+
 /*
  * efi_memattr_perm_setter - arch specific callback function passed into
  *                           efi_memattr_apply_permissions() that updates the