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