root/drivers/firmware/efi/efi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. setup_noefi
  2. efi_runtime_disabled
  3. parse_efi_cmdline
  4. systab_show
  5. fw_platform_size_show
  6. efi_attr_is_visible
  7. generic_ops_register
  8. generic_ops_unregister
  9. efivar_ssdt_setup
  10. efivar_ssdt_iter
  11. efivar_ssdt_load
  12. efivar_ssdt_load
  13. efisubsys_init
  14. efi_mem_desc_lookup
  15. efi_mem_desc_end
  16. efi_arch_mem_reserve
  17. efi_mem_reserve
  18. match_config_table
  19. efi_config_parse_tables
  20. efi_config_init
  21. efi_load_efivars
  22. __find_uefi_params
  23. fdt_find_uefi_params
  24. efi_get_fdt_params
  25. efi_md_typeattr_format
  26. efi_mem_attributes
  27. efi_mem_type
  28. efi_status_to_err
  29. efi_memreserve_map_root
  30. efi_mem_reserve_iomem
  31. efi_mem_reserve_persistent
  32. efi_memreserve_root_init
  33. update_efi_random_seed
  34. register_update_efi_random_seed

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * efi.c - EFI subsystem
   4  *
   5  * Copyright (C) 2001,2003,2004 Dell <Matt_Domsch@dell.com>
   6  * Copyright (C) 2004 Intel Corporation <matthew.e.tolentino@intel.com>
   7  * Copyright (C) 2013 Tom Gundersen <teg@jklm.no>
   8  *
   9  * This code registers /sys/firmware/efi{,/efivars} when EFI is supported,
  10  * allowing the efivarfs to be mounted or the efivars module to be loaded.
  11  * The existance of /sys/firmware/efi may also be used by userspace to
  12  * determine that the system supports EFI.
  13  */
  14 
  15 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  16 
  17 #include <linux/kobject.h>
  18 #include <linux/module.h>
  19 #include <linux/init.h>
  20 #include <linux/device.h>
  21 #include <linux/efi.h>
  22 #include <linux/of.h>
  23 #include <linux/of_fdt.h>
  24 #include <linux/io.h>
  25 #include <linux/kexec.h>
  26 #include <linux/platform_device.h>
  27 #include <linux/random.h>
  28 #include <linux/reboot.h>
  29 #include <linux/slab.h>
  30 #include <linux/acpi.h>
  31 #include <linux/ucs2_string.h>
  32 #include <linux/memblock.h>
  33 #include <linux/security.h>
  34 
  35 #include <asm/early_ioremap.h>
  36 
  37 struct efi __read_mostly efi = {
  38         .mps                    = EFI_INVALID_TABLE_ADDR,
  39         .acpi                   = EFI_INVALID_TABLE_ADDR,
  40         .acpi20                 = EFI_INVALID_TABLE_ADDR,
  41         .smbios                 = EFI_INVALID_TABLE_ADDR,
  42         .smbios3                = EFI_INVALID_TABLE_ADDR,
  43         .boot_info              = EFI_INVALID_TABLE_ADDR,
  44         .hcdp                   = EFI_INVALID_TABLE_ADDR,
  45         .uga                    = EFI_INVALID_TABLE_ADDR,
  46         .fw_vendor              = EFI_INVALID_TABLE_ADDR,
  47         .runtime                = EFI_INVALID_TABLE_ADDR,
  48         .config_table           = EFI_INVALID_TABLE_ADDR,
  49         .esrt                   = EFI_INVALID_TABLE_ADDR,
  50         .properties_table       = EFI_INVALID_TABLE_ADDR,
  51         .mem_attr_table         = EFI_INVALID_TABLE_ADDR,
  52         .rng_seed               = EFI_INVALID_TABLE_ADDR,
  53         .tpm_log                = EFI_INVALID_TABLE_ADDR,
  54         .tpm_final_log          = EFI_INVALID_TABLE_ADDR,
  55         .mem_reserve            = EFI_INVALID_TABLE_ADDR,
  56 };
  57 EXPORT_SYMBOL(efi);
  58 
  59 struct mm_struct efi_mm = {
  60         .mm_rb                  = RB_ROOT,
  61         .mm_users               = ATOMIC_INIT(2),
  62         .mm_count               = ATOMIC_INIT(1),
  63         .mmap_sem               = __RWSEM_INITIALIZER(efi_mm.mmap_sem),
  64         .page_table_lock        = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
  65         .mmlist                 = LIST_HEAD_INIT(efi_mm.mmlist),
  66         .cpu_bitmap             = { [BITS_TO_LONGS(NR_CPUS)] = 0},
  67 };
  68 
  69 struct workqueue_struct *efi_rts_wq;
  70 
  71 static bool disable_runtime;
  72 static int __init setup_noefi(char *arg)
  73 {
  74         disable_runtime = true;
  75         return 0;
  76 }
  77 early_param("noefi", setup_noefi);
  78 
  79 bool efi_runtime_disabled(void)
  80 {
  81         return disable_runtime;
  82 }
  83 
  84 static int __init parse_efi_cmdline(char *str)
  85 {
  86         if (!str) {
  87                 pr_warn("need at least one option\n");
  88                 return -EINVAL;
  89         }
  90 
  91         if (parse_option_str(str, "debug"))
  92                 set_bit(EFI_DBG, &efi.flags);
  93 
  94         if (parse_option_str(str, "noruntime"))
  95                 disable_runtime = true;
  96 
  97         return 0;
  98 }
  99 early_param("efi", parse_efi_cmdline);
 100 
 101 struct kobject *efi_kobj;
 102 
 103 /*
 104  * Let's not leave out systab information that snuck into
 105  * the efivars driver
 106  * Note, do not add more fields in systab sysfs file as it breaks sysfs
 107  * one value per file rule!
 108  */
 109 static ssize_t systab_show(struct kobject *kobj,
 110                            struct kobj_attribute *attr, char *buf)
 111 {
 112         char *str = buf;
 113 
 114         if (!kobj || !buf)
 115                 return -EINVAL;
 116 
 117         if (efi.mps != EFI_INVALID_TABLE_ADDR)
 118                 str += sprintf(str, "MPS=0x%lx\n", efi.mps);
 119         if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
 120                 str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
 121         if (efi.acpi != EFI_INVALID_TABLE_ADDR)
 122                 str += sprintf(str, "ACPI=0x%lx\n", efi.acpi);
 123         /*
 124          * If both SMBIOS and SMBIOS3 entry points are implemented, the
 125          * SMBIOS3 entry point shall be preferred, so we list it first to
 126          * let applications stop parsing after the first match.
 127          */
 128         if (efi.smbios3 != EFI_INVALID_TABLE_ADDR)
 129                 str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
 130         if (efi.smbios != EFI_INVALID_TABLE_ADDR)
 131                 str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
 132         if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
 133                 str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
 134         if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
 135                 str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info);
 136         if (efi.uga != EFI_INVALID_TABLE_ADDR)
 137                 str += sprintf(str, "UGA=0x%lx\n", efi.uga);
 138 
 139         return str - buf;
 140 }
 141 
 142 static struct kobj_attribute efi_attr_systab = __ATTR_RO_MODE(systab, 0400);
 143 
 144 #define EFI_FIELD(var) efi.var
 145 
 146 #define EFI_ATTR_SHOW(name) \
 147 static ssize_t name##_show(struct kobject *kobj, \
 148                                 struct kobj_attribute *attr, char *buf) \
 149 { \
 150         return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
 151 }
 152 
 153 EFI_ATTR_SHOW(fw_vendor);
 154 EFI_ATTR_SHOW(runtime);
 155 EFI_ATTR_SHOW(config_table);
 156 
 157 static ssize_t fw_platform_size_show(struct kobject *kobj,
 158                                      struct kobj_attribute *attr, char *buf)
 159 {
 160         return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32);
 161 }
 162 
 163 static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
 164 static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
 165 static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
 166 static struct kobj_attribute efi_attr_fw_platform_size =
 167         __ATTR_RO(fw_platform_size);
 168 
 169 static struct attribute *efi_subsys_attrs[] = {
 170         &efi_attr_systab.attr,
 171         &efi_attr_fw_vendor.attr,
 172         &efi_attr_runtime.attr,
 173         &efi_attr_config_table.attr,
 174         &efi_attr_fw_platform_size.attr,
 175         NULL,
 176 };
 177 
 178 static umode_t efi_attr_is_visible(struct kobject *kobj,
 179                                    struct attribute *attr, int n)
 180 {
 181         if (attr == &efi_attr_fw_vendor.attr) {
 182                 if (efi_enabled(EFI_PARAVIRT) ||
 183                                 efi.fw_vendor == EFI_INVALID_TABLE_ADDR)
 184                         return 0;
 185         } else if (attr == &efi_attr_runtime.attr) {
 186                 if (efi.runtime == EFI_INVALID_TABLE_ADDR)
 187                         return 0;
 188         } else if (attr == &efi_attr_config_table.attr) {
 189                 if (efi.config_table == EFI_INVALID_TABLE_ADDR)
 190                         return 0;
 191         }
 192 
 193         return attr->mode;
 194 }
 195 
 196 static const struct attribute_group efi_subsys_attr_group = {
 197         .attrs = efi_subsys_attrs,
 198         .is_visible = efi_attr_is_visible,
 199 };
 200 
 201 static struct efivars generic_efivars;
 202 static struct efivar_operations generic_ops;
 203 
 204 static int generic_ops_register(void)
 205 {
 206         generic_ops.get_variable = efi.get_variable;
 207         generic_ops.set_variable = efi.set_variable;
 208         generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
 209         generic_ops.get_next_variable = efi.get_next_variable;
 210         generic_ops.query_variable_store = efi_query_variable_store;
 211 
 212         return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
 213 }
 214 
 215 static void generic_ops_unregister(void)
 216 {
 217         efivars_unregister(&generic_efivars);
 218 }
 219 
 220 #if IS_ENABLED(CONFIG_ACPI)
 221 #define EFIVAR_SSDT_NAME_MAX    16
 222 static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX] __initdata;
 223 static int __init efivar_ssdt_setup(char *str)
 224 {
 225         int ret = security_locked_down(LOCKDOWN_ACPI_TABLES);
 226 
 227         if (ret)
 228                 return ret;
 229 
 230         if (strlen(str) < sizeof(efivar_ssdt))
 231                 memcpy(efivar_ssdt, str, strlen(str));
 232         else
 233                 pr_warn("efivar_ssdt: name too long: %s\n", str);
 234         return 0;
 235 }
 236 __setup("efivar_ssdt=", efivar_ssdt_setup);
 237 
 238 static __init int efivar_ssdt_iter(efi_char16_t *name, efi_guid_t vendor,
 239                                    unsigned long name_size, void *data)
 240 {
 241         struct efivar_entry *entry;
 242         struct list_head *list = data;
 243         char utf8_name[EFIVAR_SSDT_NAME_MAX];
 244         int limit = min_t(unsigned long, EFIVAR_SSDT_NAME_MAX, name_size);
 245 
 246         ucs2_as_utf8(utf8_name, name, limit - 1);
 247         if (strncmp(utf8_name, efivar_ssdt, limit) != 0)
 248                 return 0;
 249 
 250         entry = kmalloc(sizeof(*entry), GFP_KERNEL);
 251         if (!entry)
 252                 return 0;
 253 
 254         memcpy(entry->var.VariableName, name, name_size);
 255         memcpy(&entry->var.VendorGuid, &vendor, sizeof(efi_guid_t));
 256 
 257         efivar_entry_add(entry, list);
 258 
 259         return 0;
 260 }
 261 
 262 static __init int efivar_ssdt_load(void)
 263 {
 264         LIST_HEAD(entries);
 265         struct efivar_entry *entry, *aux;
 266         unsigned long size;
 267         void *data;
 268         int ret;
 269 
 270         if (!efivar_ssdt[0])
 271                 return 0;
 272 
 273         ret = efivar_init(efivar_ssdt_iter, &entries, true, &entries);
 274 
 275         list_for_each_entry_safe(entry, aux, &entries, list) {
 276                 pr_info("loading SSDT from variable %s-%pUl\n", efivar_ssdt,
 277                         &entry->var.VendorGuid);
 278 
 279                 list_del(&entry->list);
 280 
 281                 ret = efivar_entry_size(entry, &size);
 282                 if (ret) {
 283                         pr_err("failed to get var size\n");
 284                         goto free_entry;
 285                 }
 286 
 287                 data = kmalloc(size, GFP_KERNEL);
 288                 if (!data) {
 289                         ret = -ENOMEM;
 290                         goto free_entry;
 291                 }
 292 
 293                 ret = efivar_entry_get(entry, NULL, &size, data);
 294                 if (ret) {
 295                         pr_err("failed to get var data\n");
 296                         goto free_data;
 297                 }
 298 
 299                 ret = acpi_load_table(data);
 300                 if (ret) {
 301                         pr_err("failed to load table: %d\n", ret);
 302                         goto free_data;
 303                 }
 304 
 305                 goto free_entry;
 306 
 307 free_data:
 308                 kfree(data);
 309 
 310 free_entry:
 311                 kfree(entry);
 312         }
 313 
 314         return ret;
 315 }
 316 #else
 317 static inline int efivar_ssdt_load(void) { return 0; }
 318 #endif
 319 
 320 /*
 321  * We register the efi subsystem with the firmware subsystem and the
 322  * efivars subsystem with the efi subsystem, if the system was booted with
 323  * EFI.
 324  */
 325 static int __init efisubsys_init(void)
 326 {
 327         int error;
 328 
 329         if (!efi_enabled(EFI_BOOT))
 330                 return 0;
 331 
 332         /*
 333          * Since we process only one efi_runtime_service() at a time, an
 334          * ordered workqueue (which creates only one execution context)
 335          * should suffice all our needs.
 336          */
 337         efi_rts_wq = alloc_ordered_workqueue("efi_rts_wq", 0);
 338         if (!efi_rts_wq) {
 339                 pr_err("Creating efi_rts_wq failed, EFI runtime services disabled.\n");
 340                 clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
 341                 return 0;
 342         }
 343 
 344         /* We register the efi directory at /sys/firmware/efi */
 345         efi_kobj = kobject_create_and_add("efi", firmware_kobj);
 346         if (!efi_kobj) {
 347                 pr_err("efi: Firmware registration failed.\n");
 348                 return -ENOMEM;
 349         }
 350 
 351         error = generic_ops_register();
 352         if (error)
 353                 goto err_put;
 354 
 355         if (efi_enabled(EFI_RUNTIME_SERVICES))
 356                 efivar_ssdt_load();
 357 
 358         error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
 359         if (error) {
 360                 pr_err("efi: Sysfs attribute export failed with error %d.\n",
 361                        error);
 362                 goto err_unregister;
 363         }
 364 
 365         error = efi_runtime_map_init(efi_kobj);
 366         if (error)
 367                 goto err_remove_group;
 368 
 369         /* and the standard mountpoint for efivarfs */
 370         error = sysfs_create_mount_point(efi_kobj, "efivars");
 371         if (error) {
 372                 pr_err("efivars: Subsystem registration failed.\n");
 373                 goto err_remove_group;
 374         }
 375 
 376         return 0;
 377 
 378 err_remove_group:
 379         sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
 380 err_unregister:
 381         generic_ops_unregister();
 382 err_put:
 383         kobject_put(efi_kobj);
 384         return error;
 385 }
 386 
 387 subsys_initcall(efisubsys_init);
 388 
 389 /*
 390  * Find the efi memory descriptor for a given physical address.  Given a
 391  * physical address, determine if it exists within an EFI Memory Map entry,
 392  * and if so, populate the supplied memory descriptor with the appropriate
 393  * data.
 394  */
 395 int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md)
 396 {
 397         efi_memory_desc_t *md;
 398 
 399         if (!efi_enabled(EFI_MEMMAP)) {
 400                 pr_err_once("EFI_MEMMAP is not enabled.\n");
 401                 return -EINVAL;
 402         }
 403 
 404         if (!out_md) {
 405                 pr_err_once("out_md is null.\n");
 406                 return -EINVAL;
 407         }
 408 
 409         for_each_efi_memory_desc(md) {
 410                 u64 size;
 411                 u64 end;
 412 
 413                 size = md->num_pages << EFI_PAGE_SHIFT;
 414                 end = md->phys_addr + size;
 415                 if (phys_addr >= md->phys_addr && phys_addr < end) {
 416                         memcpy(out_md, md, sizeof(*out_md));
 417                         return 0;
 418                 }
 419         }
 420         return -ENOENT;
 421 }
 422 
 423 /*
 424  * Calculate the highest address of an efi memory descriptor.
 425  */
 426 u64 __init efi_mem_desc_end(efi_memory_desc_t *md)
 427 {
 428         u64 size = md->num_pages << EFI_PAGE_SHIFT;
 429         u64 end = md->phys_addr + size;
 430         return end;
 431 }
 432 
 433 void __init __weak efi_arch_mem_reserve(phys_addr_t addr, u64 size) {}
 434 
 435 /**
 436  * efi_mem_reserve - Reserve an EFI memory region
 437  * @addr: Physical address to reserve
 438  * @size: Size of reservation
 439  *
 440  * Mark a region as reserved from general kernel allocation and
 441  * prevent it being released by efi_free_boot_services().
 442  *
 443  * This function should be called drivers once they've parsed EFI
 444  * configuration tables to figure out where their data lives, e.g.
 445  * efi_esrt_init().
 446  */
 447 void __init efi_mem_reserve(phys_addr_t addr, u64 size)
 448 {
 449         if (!memblock_is_region_reserved(addr, size))
 450                 memblock_reserve(addr, size);
 451 
 452         /*
 453          * Some architectures (x86) reserve all boot services ranges
 454          * until efi_free_boot_services() because of buggy firmware
 455          * implementations. This means the above memblock_reserve() is
 456          * superfluous on x86 and instead what it needs to do is
 457          * ensure the @start, @size is not freed.
 458          */
 459         efi_arch_mem_reserve(addr, size);
 460 }
 461 
 462 static __initdata efi_config_table_type_t common_tables[] = {
 463         {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
 464         {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
 465         {HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
 466         {MPS_TABLE_GUID, "MPS", &efi.mps},
 467         {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
 468         {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
 469         {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
 470         {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
 471         {EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
 472         {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
 473         {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
 474         {LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
 475         {LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
 476         {LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &efi.mem_reserve},
 477 #ifdef CONFIG_EFI_RCI2_TABLE
 478         {DELLEMC_EFI_RCI2_TABLE_GUID, NULL, &rci2_table_phys},
 479 #endif
 480         {NULL_GUID, NULL, NULL},
 481 };
 482 
 483 static __init int match_config_table(efi_guid_t *guid,
 484                                      unsigned long table,
 485                                      efi_config_table_type_t *table_types)
 486 {
 487         int i;
 488 
 489         if (table_types) {
 490                 for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
 491                         if (!efi_guidcmp(*guid, table_types[i].guid)) {
 492                                 *(table_types[i].ptr) = table;
 493                                 if (table_types[i].name)
 494                                         pr_cont(" %s=0x%lx ",
 495                                                 table_types[i].name, table);
 496                                 return 1;
 497                         }
 498                 }
 499         }
 500 
 501         return 0;
 502 }
 503 
 504 int __init efi_config_parse_tables(void *config_tables, int count, int sz,
 505                                    efi_config_table_type_t *arch_tables)
 506 {
 507         void *tablep;
 508         int i;
 509 
 510         tablep = config_tables;
 511         pr_info("");
 512         for (i = 0; i < count; i++) {
 513                 efi_guid_t guid;
 514                 unsigned long table;
 515 
 516                 if (efi_enabled(EFI_64BIT)) {
 517                         u64 table64;
 518                         guid = ((efi_config_table_64_t *)tablep)->guid;
 519                         table64 = ((efi_config_table_64_t *)tablep)->table;
 520                         table = table64;
 521 #ifndef CONFIG_64BIT
 522                         if (table64 >> 32) {
 523                                 pr_cont("\n");
 524                                 pr_err("Table located above 4GB, disabling EFI.\n");
 525                                 return -EINVAL;
 526                         }
 527 #endif
 528                 } else {
 529                         guid = ((efi_config_table_32_t *)tablep)->guid;
 530                         table = ((efi_config_table_32_t *)tablep)->table;
 531                 }
 532 
 533                 if (!match_config_table(&guid, table, common_tables))
 534                         match_config_table(&guid, table, arch_tables);
 535 
 536                 tablep += sz;
 537         }
 538         pr_cont("\n");
 539         set_bit(EFI_CONFIG_TABLES, &efi.flags);
 540 
 541         if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
 542                 struct linux_efi_random_seed *seed;
 543                 u32 size = 0;
 544 
 545                 seed = early_memremap(efi.rng_seed, sizeof(*seed));
 546                 if (seed != NULL) {
 547                         size = READ_ONCE(seed->size);
 548                         early_memunmap(seed, sizeof(*seed));
 549                 } else {
 550                         pr_err("Could not map UEFI random seed!\n");
 551                 }
 552                 if (size > 0) {
 553                         seed = early_memremap(efi.rng_seed,
 554                                               sizeof(*seed) + size);
 555                         if (seed != NULL) {
 556                                 pr_notice("seeding entropy pool\n");
 557                                 add_bootloader_randomness(seed->bits, size);
 558                                 early_memunmap(seed, sizeof(*seed) + size);
 559                         } else {
 560                                 pr_err("Could not map UEFI random seed!\n");
 561                         }
 562                 }
 563         }
 564 
 565         if (!IS_ENABLED(CONFIG_X86_32) && efi_enabled(EFI_MEMMAP))
 566                 efi_memattr_init();
 567 
 568         efi_tpm_eventlog_init();
 569 
 570         /* Parse the EFI Properties table if it exists */
 571         if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
 572                 efi_properties_table_t *tbl;
 573 
 574                 tbl = early_memremap(efi.properties_table, sizeof(*tbl));
 575                 if (tbl == NULL) {
 576                         pr_err("Could not map Properties table!\n");
 577                         return -ENOMEM;
 578                 }
 579 
 580                 if (tbl->memory_protection_attribute &
 581                     EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
 582                         set_bit(EFI_NX_PE_DATA, &efi.flags);
 583 
 584                 early_memunmap(tbl, sizeof(*tbl));
 585         }
 586 
 587         if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) {
 588                 unsigned long prsv = efi.mem_reserve;
 589 
 590                 while (prsv) {
 591                         struct linux_efi_memreserve *rsv;
 592                         u8 *p;
 593                         int i;
 594 
 595                         /*
 596                          * Just map a full page: that is what we will get
 597                          * anyway, and it permits us to map the entire entry
 598                          * before knowing its size.
 599                          */
 600                         p = early_memremap(ALIGN_DOWN(prsv, PAGE_SIZE),
 601                                            PAGE_SIZE);
 602                         if (p == NULL) {
 603                                 pr_err("Could not map UEFI memreserve entry!\n");
 604                                 return -ENOMEM;
 605                         }
 606 
 607                         rsv = (void *)(p + prsv % PAGE_SIZE);
 608 
 609                         /* reserve the entry itself */
 610                         memblock_reserve(prsv, EFI_MEMRESERVE_SIZE(rsv->size));
 611 
 612                         for (i = 0; i < atomic_read(&rsv->count); i++) {
 613                                 memblock_reserve(rsv->entry[i].base,
 614                                                  rsv->entry[i].size);
 615                         }
 616 
 617                         prsv = rsv->next;
 618                         early_memunmap(p, PAGE_SIZE);
 619                 }
 620         }
 621 
 622         return 0;
 623 }
 624 
 625 int __init efi_config_init(efi_config_table_type_t *arch_tables)
 626 {
 627         void *config_tables;
 628         int sz, ret;
 629 
 630         if (efi.systab->nr_tables == 0)
 631                 return 0;
 632 
 633         if (efi_enabled(EFI_64BIT))
 634                 sz = sizeof(efi_config_table_64_t);
 635         else
 636                 sz = sizeof(efi_config_table_32_t);
 637 
 638         /*
 639          * Let's see what config tables the firmware passed to us.
 640          */
 641         config_tables = early_memremap(efi.systab->tables,
 642                                        efi.systab->nr_tables * sz);
 643         if (config_tables == NULL) {
 644                 pr_err("Could not map Configuration table!\n");
 645                 return -ENOMEM;
 646         }
 647 
 648         ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
 649                                       arch_tables);
 650 
 651         early_memunmap(config_tables, efi.systab->nr_tables * sz);
 652         return ret;
 653 }
 654 
 655 #ifdef CONFIG_EFI_VARS_MODULE
 656 static int __init efi_load_efivars(void)
 657 {
 658         struct platform_device *pdev;
 659 
 660         if (!efi_enabled(EFI_RUNTIME_SERVICES))
 661                 return 0;
 662 
 663         pdev = platform_device_register_simple("efivars", 0, NULL, 0);
 664         return PTR_ERR_OR_ZERO(pdev);
 665 }
 666 device_initcall(efi_load_efivars);
 667 #endif
 668 
 669 #ifdef CONFIG_EFI_PARAMS_FROM_FDT
 670 
 671 #define UEFI_PARAM(name, prop, field)                      \
 672         {                                                  \
 673                 { name },                                  \
 674                 { prop },                                  \
 675                 offsetof(struct efi_fdt_params, field),    \
 676                 FIELD_SIZEOF(struct efi_fdt_params, field) \
 677         }
 678 
 679 struct params {
 680         const char name[32];
 681         const char propname[32];
 682         int offset;
 683         int size;
 684 };
 685 
 686 static __initdata struct params fdt_params[] = {
 687         UEFI_PARAM("System Table", "linux,uefi-system-table", system_table),
 688         UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap),
 689         UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size),
 690         UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size),
 691         UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
 692 };
 693 
 694 static __initdata struct params xen_fdt_params[] = {
 695         UEFI_PARAM("System Table", "xen,uefi-system-table", system_table),
 696         UEFI_PARAM("MemMap Address", "xen,uefi-mmap-start", mmap),
 697         UEFI_PARAM("MemMap Size", "xen,uefi-mmap-size", mmap_size),
 698         UEFI_PARAM("MemMap Desc. Size", "xen,uefi-mmap-desc-size", desc_size),
 699         UEFI_PARAM("MemMap Desc. Version", "xen,uefi-mmap-desc-ver", desc_ver)
 700 };
 701 
 702 #define EFI_FDT_PARAMS_SIZE     ARRAY_SIZE(fdt_params)
 703 
 704 static __initdata struct {
 705         const char *uname;
 706         const char *subnode;
 707         struct params *params;
 708 } dt_params[] = {
 709         { "hypervisor", "uefi", xen_fdt_params },
 710         { "chosen", NULL, fdt_params },
 711 };
 712 
 713 struct param_info {
 714         int found;
 715         void *params;
 716         const char *missing;
 717 };
 718 
 719 static int __init __find_uefi_params(unsigned long node,
 720                                      struct param_info *info,
 721                                      struct params *params)
 722 {
 723         const void *prop;
 724         void *dest;
 725         u64 val;
 726         int i, len;
 727 
 728         for (i = 0; i < EFI_FDT_PARAMS_SIZE; i++) {
 729                 prop = of_get_flat_dt_prop(node, params[i].propname, &len);
 730                 if (!prop) {
 731                         info->missing = params[i].name;
 732                         return 0;
 733                 }
 734 
 735                 dest = info->params + params[i].offset;
 736                 info->found++;
 737 
 738                 val = of_read_number(prop, len / sizeof(u32));
 739 
 740                 if (params[i].size == sizeof(u32))
 741                         *(u32 *)dest = val;
 742                 else
 743                         *(u64 *)dest = val;
 744 
 745                 if (efi_enabled(EFI_DBG))
 746                         pr_info("  %s: 0x%0*llx\n", params[i].name,
 747                                 params[i].size * 2, val);
 748         }
 749 
 750         return 1;
 751 }
 752 
 753 static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
 754                                        int depth, void *data)
 755 {
 756         struct param_info *info = data;
 757         int i;
 758 
 759         for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
 760                 const char *subnode = dt_params[i].subnode;
 761 
 762                 if (depth != 1 || strcmp(uname, dt_params[i].uname) != 0) {
 763                         info->missing = dt_params[i].params[0].name;
 764                         continue;
 765                 }
 766 
 767                 if (subnode) {
 768                         int err = of_get_flat_dt_subnode_by_name(node, subnode);
 769 
 770                         if (err < 0)
 771                                 return 0;
 772 
 773                         node = err;
 774                 }
 775 
 776                 return __find_uefi_params(node, info, dt_params[i].params);
 777         }
 778 
 779         return 0;
 780 }
 781 
 782 int __init efi_get_fdt_params(struct efi_fdt_params *params)
 783 {
 784         struct param_info info;
 785         int ret;
 786 
 787         pr_info("Getting EFI parameters from FDT:\n");
 788 
 789         info.found = 0;
 790         info.params = params;
 791 
 792         ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
 793         if (!info.found)
 794                 pr_info("UEFI not found.\n");
 795         else if (!ret)
 796                 pr_err("Can't find '%s' in device tree!\n",
 797                        info.missing);
 798 
 799         return ret;
 800 }
 801 #endif /* CONFIG_EFI_PARAMS_FROM_FDT */
 802 
 803 static __initdata char memory_type_name[][20] = {
 804         "Reserved",
 805         "Loader Code",
 806         "Loader Data",
 807         "Boot Code",
 808         "Boot Data",
 809         "Runtime Code",
 810         "Runtime Data",
 811         "Conventional Memory",
 812         "Unusable Memory",
 813         "ACPI Reclaim Memory",
 814         "ACPI Memory NVS",
 815         "Memory Mapped I/O",
 816         "MMIO Port Space",
 817         "PAL Code",
 818         "Persistent Memory",
 819 };
 820 
 821 char * __init efi_md_typeattr_format(char *buf, size_t size,
 822                                      const efi_memory_desc_t *md)
 823 {
 824         char *pos;
 825         int type_len;
 826         u64 attr;
 827 
 828         pos = buf;
 829         if (md->type >= ARRAY_SIZE(memory_type_name))
 830                 type_len = snprintf(pos, size, "[type=%u", md->type);
 831         else
 832                 type_len = snprintf(pos, size, "[%-*s",
 833                                     (int)(sizeof(memory_type_name[0]) - 1),
 834                                     memory_type_name[md->type]);
 835         if (type_len >= size)
 836                 return buf;
 837 
 838         pos += type_len;
 839         size -= type_len;
 840 
 841         attr = md->attribute;
 842         if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT |
 843                      EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_RO |
 844                      EFI_MEMORY_WP | EFI_MEMORY_RP | EFI_MEMORY_XP |
 845                      EFI_MEMORY_NV |
 846                      EFI_MEMORY_RUNTIME | EFI_MEMORY_MORE_RELIABLE))
 847                 snprintf(pos, size, "|attr=0x%016llx]",
 848                          (unsigned long long)attr);
 849         else
 850                 snprintf(pos, size,
 851                          "|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
 852                          attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
 853                          attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
 854                          attr & EFI_MEMORY_NV      ? "NV"  : "",
 855                          attr & EFI_MEMORY_XP      ? "XP"  : "",
 856                          attr & EFI_MEMORY_RP      ? "RP"  : "",
 857                          attr & EFI_MEMORY_WP      ? "WP"  : "",
 858                          attr & EFI_MEMORY_RO      ? "RO"  : "",
 859                          attr & EFI_MEMORY_UCE     ? "UCE" : "",
 860                          attr & EFI_MEMORY_WB      ? "WB"  : "",
 861                          attr & EFI_MEMORY_WT      ? "WT"  : "",
 862                          attr & EFI_MEMORY_WC      ? "WC"  : "",
 863                          attr & EFI_MEMORY_UC      ? "UC"  : "");
 864         return buf;
 865 }
 866 
 867 /*
 868  * IA64 has a funky EFI memory map that doesn't work the same way as
 869  * other architectures.
 870  */
 871 #ifndef CONFIG_IA64
 872 /*
 873  * efi_mem_attributes - lookup memmap attributes for physical address
 874  * @phys_addr: the physical address to lookup
 875  *
 876  * Search in the EFI memory map for the region covering
 877  * @phys_addr. Returns the EFI memory attributes if the region
 878  * was found in the memory map, 0 otherwise.
 879  */
 880 u64 efi_mem_attributes(unsigned long phys_addr)
 881 {
 882         efi_memory_desc_t *md;
 883 
 884         if (!efi_enabled(EFI_MEMMAP))
 885                 return 0;
 886 
 887         for_each_efi_memory_desc(md) {
 888                 if ((md->phys_addr <= phys_addr) &&
 889                     (phys_addr < (md->phys_addr +
 890                     (md->num_pages << EFI_PAGE_SHIFT))))
 891                         return md->attribute;
 892         }
 893         return 0;
 894 }
 895 
 896 /*
 897  * efi_mem_type - lookup memmap type for physical address
 898  * @phys_addr: the physical address to lookup
 899  *
 900  * Search in the EFI memory map for the region covering @phys_addr.
 901  * Returns the EFI memory type if the region was found in the memory
 902  * map, EFI_RESERVED_TYPE (zero) otherwise.
 903  */
 904 int efi_mem_type(unsigned long phys_addr)
 905 {
 906         const efi_memory_desc_t *md;
 907 
 908         if (!efi_enabled(EFI_MEMMAP))
 909                 return -ENOTSUPP;
 910 
 911         for_each_efi_memory_desc(md) {
 912                 if ((md->phys_addr <= phys_addr) &&
 913                     (phys_addr < (md->phys_addr +
 914                                   (md->num_pages << EFI_PAGE_SHIFT))))
 915                         return md->type;
 916         }
 917         return -EINVAL;
 918 }
 919 #endif
 920 
 921 int efi_status_to_err(efi_status_t status)
 922 {
 923         int err;
 924 
 925         switch (status) {
 926         case EFI_SUCCESS:
 927                 err = 0;
 928                 break;
 929         case EFI_INVALID_PARAMETER:
 930                 err = -EINVAL;
 931                 break;
 932         case EFI_OUT_OF_RESOURCES:
 933                 err = -ENOSPC;
 934                 break;
 935         case EFI_DEVICE_ERROR:
 936                 err = -EIO;
 937                 break;
 938         case EFI_WRITE_PROTECTED:
 939                 err = -EROFS;
 940                 break;
 941         case EFI_SECURITY_VIOLATION:
 942                 err = -EACCES;
 943                 break;
 944         case EFI_NOT_FOUND:
 945                 err = -ENOENT;
 946                 break;
 947         case EFI_ABORTED:
 948                 err = -EINTR;
 949                 break;
 950         default:
 951                 err = -EINVAL;
 952         }
 953 
 954         return err;
 955 }
 956 
 957 static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
 958 static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
 959 
 960 static int __init efi_memreserve_map_root(void)
 961 {
 962         if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
 963                 return -ENODEV;
 964 
 965         efi_memreserve_root = memremap(efi.mem_reserve,
 966                                        sizeof(*efi_memreserve_root),
 967                                        MEMREMAP_WB);
 968         if (WARN_ON_ONCE(!efi_memreserve_root))
 969                 return -ENOMEM;
 970         return 0;
 971 }
 972 
 973 static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)
 974 {
 975         struct resource *res, *parent;
 976 
 977         res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
 978         if (!res)
 979                 return -ENOMEM;
 980 
 981         res->name       = "reserved";
 982         res->flags      = IORESOURCE_MEM;
 983         res->start      = addr;
 984         res->end        = addr + size - 1;
 985 
 986         /* we expect a conflict with a 'System RAM' region */
 987         parent = request_resource_conflict(&iomem_resource, res);
 988         return parent ? request_resource(parent, res) : 0;
 989 }
 990 
 991 int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
 992 {
 993         struct linux_efi_memreserve *rsv;
 994         unsigned long prsv;
 995         int rc, index;
 996 
 997         if (efi_memreserve_root == (void *)ULONG_MAX)
 998                 return -ENODEV;
 999 
1000         if (!efi_memreserve_root) {
1001                 rc = efi_memreserve_map_root();
1002                 if (rc)
1003                         return rc;
1004         }
1005 
1006         /* first try to find a slot in an existing linked list entry */
1007         for (prsv = efi_memreserve_root->next; prsv; prsv = rsv->next) {
1008                 rsv = memremap(prsv, sizeof(*rsv), MEMREMAP_WB);
1009                 index = atomic_fetch_add_unless(&rsv->count, 1, rsv->size);
1010                 if (index < rsv->size) {
1011                         rsv->entry[index].base = addr;
1012                         rsv->entry[index].size = size;
1013 
1014                         memunmap(rsv);
1015                         return efi_mem_reserve_iomem(addr, size);
1016                 }
1017                 memunmap(rsv);
1018         }
1019 
1020         /* no slot found - allocate a new linked list entry */
1021         rsv = (struct linux_efi_memreserve *)__get_free_page(GFP_ATOMIC);
1022         if (!rsv)
1023                 return -ENOMEM;
1024 
1025         rc = efi_mem_reserve_iomem(__pa(rsv), SZ_4K);
1026         if (rc) {
1027                 free_page((unsigned long)rsv);
1028                 return rc;
1029         }
1030 
1031         /*
1032          * The memremap() call above assumes that a linux_efi_memreserve entry
1033          * never crosses a page boundary, so let's ensure that this remains true
1034          * even when kexec'ing a 4k pages kernel from a >4k pages kernel, by
1035          * using SZ_4K explicitly in the size calculation below.
1036          */
1037         rsv->size = EFI_MEMRESERVE_COUNT(SZ_4K);
1038         atomic_set(&rsv->count, 1);
1039         rsv->entry[0].base = addr;
1040         rsv->entry[0].size = size;
1041 
1042         spin_lock(&efi_mem_reserve_persistent_lock);
1043         rsv->next = efi_memreserve_root->next;
1044         efi_memreserve_root->next = __pa(rsv);
1045         spin_unlock(&efi_mem_reserve_persistent_lock);
1046 
1047         return efi_mem_reserve_iomem(addr, size);
1048 }
1049 
1050 static int __init efi_memreserve_root_init(void)
1051 {
1052         if (efi_memreserve_root)
1053                 return 0;
1054         if (efi_memreserve_map_root())
1055                 efi_memreserve_root = (void *)ULONG_MAX;
1056         return 0;
1057 }
1058 early_initcall(efi_memreserve_root_init);
1059 
1060 #ifdef CONFIG_KEXEC
1061 static int update_efi_random_seed(struct notifier_block *nb,
1062                                   unsigned long code, void *unused)
1063 {
1064         struct linux_efi_random_seed *seed;
1065         u32 size = 0;
1066 
1067         if (!kexec_in_progress)
1068                 return NOTIFY_DONE;
1069 
1070         seed = memremap(efi.rng_seed, sizeof(*seed), MEMREMAP_WB);
1071         if (seed != NULL) {
1072                 size = min(seed->size, EFI_RANDOM_SEED_SIZE);
1073                 memunmap(seed);
1074         } else {
1075                 pr_err("Could not map UEFI random seed!\n");
1076         }
1077         if (size > 0) {
1078                 seed = memremap(efi.rng_seed, sizeof(*seed) + size,
1079                                 MEMREMAP_WB);
1080                 if (seed != NULL) {
1081                         seed->size = size;
1082                         get_random_bytes(seed->bits, seed->size);
1083                         memunmap(seed);
1084                 } else {
1085                         pr_err("Could not map UEFI random seed!\n");
1086                 }
1087         }
1088         return NOTIFY_DONE;
1089 }
1090 
1091 static struct notifier_block efi_random_seed_nb = {
1092         .notifier_call = update_efi_random_seed,
1093 };
1094 
1095 static int register_update_efi_random_seed(void)
1096 {
1097         if (efi.rng_seed == EFI_INVALID_TABLE_ADDR)
1098                 return 0;
1099         return register_reboot_notifier(&efi_random_seed_nb);
1100 }
1101 late_initcall(register_update_efi_random_seed);
1102 #endif

/* [<][>][^][v][top][bottom][index][help] */