efi/x86: Add RNG seed EFI table to unencrypted mapping check
[linux-2.6-microblaze.git] / drivers / firmware / efi / efi.c
index 621220a..1e79f77 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/device.h>
 #include <linux/efi.h>
 #include <linux/of.h>
-#include <linux/of_fdt.h>
 #include <linux/io.h>
 #include <linux/kexec.h>
 #include <linux/platform_device.h>
 #include <asm/early_ioremap.h>
 
 struct efi __read_mostly efi = {
-       .mps                    = EFI_INVALID_TABLE_ADDR,
+       .runtime_supported_mask = EFI_RT_SUPPORTED_ALL,
        .acpi                   = EFI_INVALID_TABLE_ADDR,
        .acpi20                 = EFI_INVALID_TABLE_ADDR,
        .smbios                 = EFI_INVALID_TABLE_ADDR,
        .smbios3                = EFI_INVALID_TABLE_ADDR,
-       .boot_info              = EFI_INVALID_TABLE_ADDR,
-       .hcdp                   = EFI_INVALID_TABLE_ADDR,
-       .uga                    = EFI_INVALID_TABLE_ADDR,
-       .fw_vendor              = EFI_INVALID_TABLE_ADDR,
-       .runtime                = EFI_INVALID_TABLE_ADDR,
-       .config_table           = EFI_INVALID_TABLE_ADDR,
        .esrt                   = EFI_INVALID_TABLE_ADDR,
-       .properties_table       = EFI_INVALID_TABLE_ADDR,
-       .mem_attr_table         = EFI_INVALID_TABLE_ADDR,
-       .rng_seed               = EFI_INVALID_TABLE_ADDR,
        .tpm_log                = EFI_INVALID_TABLE_ADDR,
        .tpm_final_log          = EFI_INVALID_TABLE_ADDR,
-       .mem_reserve            = EFI_INVALID_TABLE_ADDR,
 };
 EXPORT_SYMBOL(efi);
 
+unsigned long __ro_after_init efi_rng_seed = EFI_INVALID_TABLE_ADDR;
+static unsigned long __initdata mem_reserve = EFI_INVALID_TABLE_ADDR;
+static unsigned long __initdata rt_prop = EFI_INVALID_TABLE_ADDR;
+
 struct mm_struct efi_mm = {
        .mm_rb                  = RB_ROOT,
        .mm_users               = ATOMIC_INIT(2),
@@ -122,8 +115,6 @@ static ssize_t systab_show(struct kobject *kobj,
        if (!kobj || !buf)
                return -EINVAL;
 
-       if (efi.mps != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "MPS=0x%lx\n", efi.mps);
        if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
                str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
        if (efi.acpi != EFI_INVALID_TABLE_ADDR)
@@ -137,30 +128,17 @@ static ssize_t systab_show(struct kobject *kobj,
                str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
        if (efi.smbios != EFI_INVALID_TABLE_ADDR)
                str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
-       if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
-       if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info);
-       if (efi.uga != EFI_INVALID_TABLE_ADDR)
-               str += sprintf(str, "UGA=0x%lx\n", efi.uga);
-
-       return str - buf;
-}
 
-static struct kobj_attribute efi_attr_systab = __ATTR_RO_MODE(systab, 0400);
+       if (IS_ENABLED(CONFIG_IA64) || IS_ENABLED(CONFIG_X86)) {
+               extern char *efi_systab_show_arch(char *str);
 
-#define EFI_FIELD(var) efi.var
+               str = efi_systab_show_arch(str);
+       }
 
-#define EFI_ATTR_SHOW(name) \
-static ssize_t name##_show(struct kobject *kobj, \
-                               struct kobj_attribute *attr, char *buf) \
-{ \
-       return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
+       return str - buf;
 }
 
-EFI_ATTR_SHOW(fw_vendor);
-EFI_ATTR_SHOW(runtime);
-EFI_ATTR_SHOW(config_table);
+static struct kobj_attribute efi_attr_systab = __ATTR_RO_MODE(systab, 0400);
 
 static ssize_t fw_platform_size_show(struct kobject *kobj,
                                     struct kobj_attribute *attr, char *buf)
@@ -168,36 +146,24 @@ static ssize_t fw_platform_size_show(struct kobject *kobj,
        return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32);
 }
 
-static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
-static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
-static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
+extern __weak struct kobj_attribute efi_attr_fw_vendor;
+extern __weak struct kobj_attribute efi_attr_runtime;
+extern __weak struct kobj_attribute efi_attr_config_table;
 static struct kobj_attribute efi_attr_fw_platform_size =
        __ATTR_RO(fw_platform_size);
 
 static struct attribute *efi_subsys_attrs[] = {
        &efi_attr_systab.attr,
+       &efi_attr_fw_platform_size.attr,
        &efi_attr_fw_vendor.attr,
        &efi_attr_runtime.attr,
        &efi_attr_config_table.attr,
-       &efi_attr_fw_platform_size.attr,
        NULL,
 };
 
-static umode_t efi_attr_is_visible(struct kobject *kobj,
-                                  struct attribute *attr, int n)
+umode_t __weak efi_attr_is_visible(struct kobject *kobj, struct attribute *attr,
+                                  int n)
 {
-       if (attr == &efi_attr_fw_vendor.attr) {
-               if (efi_enabled(EFI_PARAVIRT) ||
-                               efi.fw_vendor == EFI_INVALID_TABLE_ADDR)
-                       return 0;
-       } else if (attr == &efi_attr_runtime.attr) {
-               if (efi.runtime == EFI_INVALID_TABLE_ADDR)
-                       return 0;
-       } else if (attr == &efi_attr_config_table.attr) {
-               if (efi.config_table == EFI_INVALID_TABLE_ADDR)
-                       return 0;
-       }
-
        return attr->mode;
 }
 
@@ -337,18 +303,27 @@ static int __init efisubsys_init(void)
        if (!efi_enabled(EFI_BOOT))
                return 0;
 
-       /*
-        * Since we process only one efi_runtime_service() at a time, an
-        * ordered workqueue (which creates only one execution context)
-        * should suffice all our needs.
-        */
-       efi_rts_wq = alloc_ordered_workqueue("efi_rts_wq", 0);
-       if (!efi_rts_wq) {
-               pr_err("Creating efi_rts_wq failed, EFI runtime services disabled.\n");
-               clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
-               return 0;
+       if (!efi_enabled(EFI_RUNTIME_SERVICES))
+               efi.runtime_supported_mask = 0;
+
+       if (efi.runtime_supported_mask) {
+               /*
+                * Since we process only one efi_runtime_service() at a time, an
+                * ordered workqueue (which creates only one execution context)
+                * should suffice for all our needs.
+                */
+               efi_rts_wq = alloc_ordered_workqueue("efi_rts_wq", 0);
+               if (!efi_rts_wq) {
+                       pr_err("Creating efi_rts_wq failed, EFI runtime services disabled.\n");
+                       clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
+                       efi.runtime_supported_mask = 0;
+                       return 0;
+               }
        }
 
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_TIME_SERVICES))
+               platform_device_register_simple("rtc-efi", 0, NULL, 0);
+
        /* We register the efi directory at /sys/firmware/efi */
        efi_kobj = kobject_create_and_add("efi", firmware_kobj);
        if (!efi_kobj) {
@@ -356,12 +331,13 @@ static int __init efisubsys_init(void)
                return -ENOMEM;
        }
 
-       error = generic_ops_register();
-       if (error)
-               goto err_put;
-
-       if (efi_enabled(EFI_RUNTIME_SERVICES))
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES)) {
                efivar_ssdt_load();
+               error = generic_ops_register();
+               if (error)
+                       goto err_put;
+               platform_device_register_simple("efivars", 0, NULL, 0);
+       }
 
        error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
        if (error) {
@@ -386,7 +362,8 @@ static int __init efisubsys_init(void)
 err_remove_group:
        sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
 err_unregister:
-       generic_ops_unregister();
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
+               generic_ops_unregister();
 err_put:
        kobject_put(efi_kobj);
        return error;
@@ -467,30 +444,27 @@ void __init efi_mem_reserve(phys_addr_t addr, u64 size)
        efi_arch_mem_reserve(addr, size);
 }
 
-static __initdata efi_config_table_type_t common_tables[] = {
+static const efi_config_table_type_t common_tables[] __initconst = {
        {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
        {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
-       {HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
-       {MPS_TABLE_GUID, "MPS", &efi.mps},
        {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
        {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
-       {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
        {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
-       {EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
-       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
-       {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
+       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi_mem_attr_table},
+       {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi_rng_seed},
        {LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
        {LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
-       {LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &efi.mem_reserve},
+       {LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &mem_reserve},
+       {EFI_RT_PROPERTIES_TABLE_GUID, "RTPROP", &rt_prop},
 #ifdef CONFIG_EFI_RCI2_TABLE
        {DELLEMC_EFI_RCI2_TABLE_GUID, NULL, &rci2_table_phys},
 #endif
        {NULL_GUID, NULL, NULL},
 };
 
-static __init int match_config_table(efi_guid_t *guid,
+static __init int match_config_table(const efi_guid_t *guid,
                                     unsigned long table,
-                                    efi_config_table_type_t *table_types)
+                                    const efi_config_table_type_t *table_types)
 {
        int i;
 
@@ -509,48 +483,47 @@ static __init int match_config_table(efi_guid_t *guid,
        return 0;
 }
 
-int __init efi_config_parse_tables(void *config_tables, int count, int sz,
-                                  efi_config_table_type_t *arch_tables)
+int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
+                                  int count,
+                                  const efi_config_table_type_t *arch_tables)
 {
-       void *tablep;
+       const efi_config_table_64_t *tbl64 = (void *)config_tables;
+       const efi_config_table_32_t *tbl32 = (void *)config_tables;
+       const efi_guid_t *guid;
+       unsigned long table;
        int i;
 
-       tablep = config_tables;
        pr_info("");
        for (i = 0; i < count; i++) {
-               efi_guid_t guid;
-               unsigned long table;
-
-               if (efi_enabled(EFI_64BIT)) {
-                       u64 table64;
-                       guid = ((efi_config_table_64_t *)tablep)->guid;
-                       table64 = ((efi_config_table_64_t *)tablep)->table;
-                       table = table64;
-#ifndef CONFIG_64BIT
-                       if (table64 >> 32) {
+               if (!IS_ENABLED(CONFIG_X86)) {
+                       guid = &config_tables[i].guid;
+                       table = (unsigned long)config_tables[i].table;
+               } else if (efi_enabled(EFI_64BIT)) {
+                       guid = &tbl64[i].guid;
+                       table = tbl64[i].table;
+
+                       if (IS_ENABLED(CONFIG_X86_32) &&
+                           tbl64[i].table > U32_MAX) {
                                pr_cont("\n");
                                pr_err("Table located above 4GB, disabling EFI.\n");
                                return -EINVAL;
                        }
-#endif
                } else {
-                       guid = ((efi_config_table_32_t *)tablep)->guid;
-                       table = ((efi_config_table_32_t *)tablep)->table;
+                       guid = &tbl32[i].guid;
+                       table = tbl32[i].table;
                }
 
-               if (!match_config_table(&guid, table, common_tables))
-                       match_config_table(&guid, table, arch_tables);
-
-               tablep += sz;
+               if (!match_config_table(guid, table, common_tables))
+                       match_config_table(guid, table, arch_tables);
        }
        pr_cont("\n");
        set_bit(EFI_CONFIG_TABLES, &efi.flags);
 
-       if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
+       if (efi_rng_seed != EFI_INVALID_TABLE_ADDR) {
                struct linux_efi_random_seed *seed;
                u32 size = 0;
 
-               seed = early_memremap(efi.rng_seed, sizeof(*seed));
+               seed = early_memremap(efi_rng_seed, sizeof(*seed));
                if (seed != NULL) {
                        size = seed->size;
                        early_memunmap(seed, sizeof(*seed));
@@ -558,7 +531,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
                        pr_err("Could not map UEFI random seed!\n");
                }
                if (size > 0) {
-                       seed = early_memremap(efi.rng_seed,
+                       seed = early_memremap(efi_rng_seed,
                                              sizeof(*seed) + size);
                        if (seed != NULL) {
                                pr_notice("seeding entropy pool\n");
@@ -575,25 +548,8 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
 
        efi_tpm_eventlog_init();
 
-       /* Parse the EFI Properties table if it exists */
-       if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
-               efi_properties_table_t *tbl;
-
-               tbl = early_memremap(efi.properties_table, sizeof(*tbl));
-               if (tbl == NULL) {
-                       pr_err("Could not map Properties table!\n");
-                       return -ENOMEM;
-               }
-
-               if (tbl->memory_protection_attribute &
-                   EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
-                       set_bit(EFI_NX_PE_DATA, &efi.flags);
-
-               early_memunmap(tbl, sizeof(*tbl));
-       }
-
-       if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) {
-               unsigned long prsv = efi.mem_reserve;
+       if (mem_reserve != EFI_INVALID_TABLE_ADDR) {
+               unsigned long prsv = mem_reserve;
 
                while (prsv) {
                        struct linux_efi_memreserve *rsv;
@@ -627,186 +583,78 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
                }
        }
 
-       return 0;
-}
-
-int __init efi_config_init(efi_config_table_type_t *arch_tables)
-{
-       void *config_tables;
-       int sz, ret;
-
-       if (efi.systab->nr_tables == 0)
-               return 0;
+       if (rt_prop != EFI_INVALID_TABLE_ADDR) {
+               efi_rt_properties_table_t *tbl;
 
-       if (efi_enabled(EFI_64BIT))
-               sz = sizeof(efi_config_table_64_t);
-       else
-               sz = sizeof(efi_config_table_32_t);
-
-       /*
-        * Let's see what config tables the firmware passed to us.
-        */
-       config_tables = early_memremap(efi.systab->tables,
-                                      efi.systab->nr_tables * sz);
-       if (config_tables == NULL) {
-               pr_err("Could not map Configuration table!\n");
-               return -ENOMEM;
+               tbl = early_memremap(rt_prop, sizeof(*tbl));
+               if (tbl) {
+                       efi.runtime_supported_mask &= tbl->runtime_services_supported;
+                       early_memunmap(tbl, sizeof(*tbl));
+               }
        }
 
-       ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
-                                     arch_tables);
-
-       early_memunmap(config_tables, efi.systab->nr_tables * sz);
-       return ret;
+       return 0;
 }
 
-#ifdef CONFIG_EFI_VARS_MODULE
-static int __init efi_load_efivars(void)
+int __init efi_systab_check_header(const efi_table_hdr_t *systab_hdr,
+                                  int min_major_version)
 {
-       struct platform_device *pdev;
-
-       if (!efi_enabled(EFI_RUNTIME_SERVICES))
-               return 0;
-
-       pdev = platform_device_register_simple("efivars", 0, NULL, 0);
-       return PTR_ERR_OR_ZERO(pdev);
-}
-device_initcall(efi_load_efivars);
-#endif
-
-#ifdef CONFIG_EFI_PARAMS_FROM_FDT
-
-#define UEFI_PARAM(name, prop, field)                     \
-       {                                                  \
-               { name },                                  \
-               { prop },                                  \
-               offsetof(struct efi_fdt_params, field),    \
-               sizeof_field(struct efi_fdt_params, field) \
+       if (systab_hdr->signature != EFI_SYSTEM_TABLE_SIGNATURE) {
+               pr_err("System table signature incorrect!\n");
+               return -EINVAL;
        }
 
-struct params {
-       const char name[32];
-       const char propname[32];
-       int offset;
-       int size;
-};
-
-static __initdata struct params fdt_params[] = {
-       UEFI_PARAM("System Table", "linux,uefi-system-table", system_table),
-       UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap),
-       UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size),
-       UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size),
-       UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
-};
-
-static __initdata struct params xen_fdt_params[] = {
-       UEFI_PARAM("System Table", "xen,uefi-system-table", system_table),
-       UEFI_PARAM("MemMap Address", "xen,uefi-mmap-start", mmap),
-       UEFI_PARAM("MemMap Size", "xen,uefi-mmap-size", mmap_size),
-       UEFI_PARAM("MemMap Desc. Size", "xen,uefi-mmap-desc-size", desc_size),
-       UEFI_PARAM("MemMap Desc. Version", "xen,uefi-mmap-desc-ver", desc_ver)
-};
-
-#define EFI_FDT_PARAMS_SIZE    ARRAY_SIZE(fdt_params)
+       if ((systab_hdr->revision >> 16) < min_major_version)
+               pr_err("Warning: System table version %d.%02d, expected %d.00 or greater!\n",
+                      systab_hdr->revision >> 16,
+                      systab_hdr->revision & 0xffff,
+                      min_major_version);
 
-static __initdata struct {
-       const char *uname;
-       const char *subnode;
-       struct params *params;
-} dt_params[] = {
-       { "hypervisor", "uefi", xen_fdt_params },
-       { "chosen", NULL, fdt_params },
-};
-
-struct param_info {
-       int found;
-       void *params;
-       const char *missing;
-};
+       return 0;
+}
 
-static int __init __find_uefi_params(unsigned long node,
-                                    struct param_info *info,
-                                    struct params *params)
+#ifndef CONFIG_IA64
+static const efi_char16_t *__init map_fw_vendor(unsigned long fw_vendor,
+                                               size_t size)
 {
-       const void *prop;
-       void *dest;
-       u64 val;
-       int i, len;
-
-       for (i = 0; i < EFI_FDT_PARAMS_SIZE; i++) {
-               prop = of_get_flat_dt_prop(node, params[i].propname, &len);
-               if (!prop) {
-                       info->missing = params[i].name;
-                       return 0;
-               }
-
-               dest = info->params + params[i].offset;
-               info->found++;
+       const efi_char16_t *ret;
 
-               val = of_read_number(prop, len / sizeof(u32));
-
-               if (params[i].size == sizeof(u32))
-                       *(u32 *)dest = val;
-               else
-                       *(u64 *)dest = val;
-
-               if (efi_enabled(EFI_DBG))
-                       pr_info("  %s: 0x%0*llx\n", params[i].name,
-                               params[i].size * 2, val);
-       }
-
-       return 1;
+       ret = early_memremap_ro(fw_vendor, size);
+       if (!ret)
+               pr_err("Could not map the firmware vendor!\n");
+       return ret;
 }
 
-static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
-                                      int depth, void *data)
+static void __init unmap_fw_vendor(const void *fw_vendor, size_t size)
 {
-       struct param_info *info = data;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
-               const char *subnode = dt_params[i].subnode;
-
-               if (depth != 1 || strcmp(uname, dt_params[i].uname) != 0) {
-                       info->missing = dt_params[i].params[0].name;
-                       continue;
-               }
-
-               if (subnode) {
-                       int err = of_get_flat_dt_subnode_by_name(node, subnode);
-
-                       if (err < 0)
-                               return 0;
-
-                       node = err;
-               }
-
-               return __find_uefi_params(node, info, dt_params[i].params);
-       }
-
-       return 0;
+       early_memunmap((void *)fw_vendor, size);
 }
+#else
+#define map_fw_vendor(p, s)    __va(p)
+#define unmap_fw_vendor(v, s)
+#endif
 
-int __init efi_get_fdt_params(struct efi_fdt_params *params)
+void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
+                                    unsigned long fw_vendor)
 {
-       struct param_info info;
-       int ret;
-
-       pr_info("Getting EFI parameters from FDT:\n");
+       char vendor[100] = "unknown";
+       const efi_char16_t *c16;
+       size_t i;
 
-       info.found = 0;
-       info.params = params;
+       c16 = map_fw_vendor(fw_vendor, sizeof(vendor) * sizeof(efi_char16_t));
+       if (c16) {
+               for (i = 0; i < sizeof(vendor) - 1 && c16[i]; ++i)
+                       vendor[i] = c16[i];
+               vendor[i] = '\0';
 
-       ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
-       if (!info.found)
-               pr_info("UEFI not found.\n");
-       else if (!ret)
-               pr_err("Can't find '%s' in device tree!\n",
-                      info.missing);
+               unmap_fw_vendor(c16, sizeof(vendor) * sizeof(efi_char16_t));
+       }
 
-       return ret;
+       pr_info("EFI v%u.%.02u by %s\n",
+               systab_hdr->revision >> 16,
+               systab_hdr->revision & 0xffff,
+               vendor);
 }
-#endif /* CONFIG_EFI_PARAMS_FROM_FDT */
 
 static __initdata char memory_type_name[][20] = {
        "Reserved",
@@ -968,10 +816,10 @@ static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
 
 static int __init efi_memreserve_map_root(void)
 {
-       if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
+       if (mem_reserve == EFI_INVALID_TABLE_ADDR)
                return -ENODEV;
 
-       efi_memreserve_root = memremap(efi.mem_reserve,
+       efi_memreserve_root = memremap(mem_reserve,
                                       sizeof(*efi_memreserve_root),
                                       MEMREMAP_WB);
        if (WARN_ON_ONCE(!efi_memreserve_root))
@@ -1076,7 +924,7 @@ static int update_efi_random_seed(struct notifier_block *nb,
        if (!kexec_in_progress)
                return NOTIFY_DONE;
 
-       seed = memremap(efi.rng_seed, sizeof(*seed), MEMREMAP_WB);
+       seed = memremap(efi_rng_seed, sizeof(*seed), MEMREMAP_WB);
        if (seed != NULL) {
                size = min(seed->size, EFI_RANDOM_SEED_SIZE);
                memunmap(seed);
@@ -1084,7 +932,7 @@ static int update_efi_random_seed(struct notifier_block *nb,
                pr_err("Could not map UEFI random seed!\n");
        }
        if (size > 0) {
-               seed = memremap(efi.rng_seed, sizeof(*seed) + size,
+               seed = memremap(efi_rng_seed, sizeof(*seed) + size,
                                MEMREMAP_WB);
                if (seed != NULL) {
                        seed->size = size;
@@ -1101,9 +949,9 @@ static struct notifier_block efi_random_seed_nb = {
        .notifier_call = update_efi_random_seed,
 };
 
-static int register_update_efi_random_seed(void)
+static int __init register_update_efi_random_seed(void)
 {
-       if (efi.rng_seed == EFI_INVALID_TABLE_ADDR)
+       if (efi_rng_seed == EFI_INVALID_TABLE_ADDR)
                return 0;
        return register_reboot_notifier(&efi_random_seed_nb);
 }