| 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | /* |
| 3 | * Common EFI (Extensible Firmware Interface) support functions |
| 4 | * Based on Extensible Firmware Interface Specification version 1.0 |
| 5 | * |
| 6 | * Copyright (C) 1999 VA Linux Systems |
| 7 | * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> |
| 8 | * Copyright (C) 1999-2002 Hewlett-Packard Co. |
| 9 | * David Mosberger-Tang <davidm@hpl.hp.com> |
| 10 | * Stephane Eranian <eranian@hpl.hp.com> |
| 11 | * Copyright (C) 2005-2008 Intel Co. |
| 12 | * Fenghua Yu <fenghua.yu@intel.com> |
| 13 | * Bibo Mao <bibo.mao@intel.com> |
| 14 | * Chandramouli Narayanan <mouli@linux.intel.com> |
| 15 | * Huang Ying <ying.huang@intel.com> |
| 16 | * Copyright (C) 2013 SuSE Labs |
| 17 | * Borislav Petkov <bp@suse.de> - runtime services VA mapping |
| 18 | * |
| 19 | * Copied from efi_32.c to eliminate the duplicated code between EFI |
| 20 | * 32/64 support code. --ying 2007-10-26 |
| 21 | * |
| 22 | * All EFI Runtime Services are not implemented yet as EFI only |
| 23 | * supports physical mode addressing on SoftSDV. This is to be fixed |
| 24 | * in a future version. --drummond 1999-07-20 |
| 25 | * |
| 26 | * Implemented EFI runtime services and virtual mode calls. --davidm |
| 27 | * |
| 28 | * Goutham Rao: <goutham.rao@intel.com> |
| 29 | * Skip non-WB memory and ignore empty memory ranges. |
| 30 | */ |
| 31 | |
| 32 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 33 | |
| 34 | #include <linux/kernel.h> |
| 35 | #include <linux/init.h> |
| 36 | #include <linux/efi.h> |
| 37 | #include <linux/efi-bgrt.h> |
| 38 | #include <linux/export.h> |
| 39 | #include <linux/memblock.h> |
| 40 | #include <linux/slab.h> |
| 41 | #include <linux/spinlock.h> |
| 42 | #include <linux/uaccess.h> |
| 43 | #include <linux/time.h> |
| 44 | #include <linux/io.h> |
| 45 | #include <linux/reboot.h> |
| 46 | #include <linux/bcd.h> |
| 47 | |
| 48 | #include <asm/setup.h> |
| 49 | #include <asm/efi.h> |
| 50 | #include <asm/e820/api.h> |
| 51 | #include <asm/time.h> |
| 52 | #include <asm/tlbflush.h> |
| 53 | #include <asm/x86_init.h> |
| 54 | #include <asm/uv/uv.h> |
| 55 | |
| 56 | static unsigned long efi_systab_phys __initdata; |
| 57 | static unsigned long efi_runtime, efi_nr_tables; |
| 58 | |
| 59 | unsigned long efi_fw_vendor, efi_config_table; |
| 60 | |
| 61 | static const efi_config_table_type_t arch_tables[] __initconst = { |
| 62 | #ifdef CONFIG_X86_UV |
| 63 | {UV_SYSTEM_TABLE_GUID, &uv_systab_phys, "UVsystab" }, |
| 64 | #endif |
| 65 | {}, |
| 66 | }; |
| 67 | |
| 68 | static const unsigned long * const efi_tables[] = { |
| 69 | &efi.acpi, |
| 70 | &efi.acpi20, |
| 71 | &efi.smbios, |
| 72 | &efi.smbios3, |
| 73 | #ifdef CONFIG_X86_UV |
| 74 | &uv_systab_phys, |
| 75 | #endif |
| 76 | &efi_fw_vendor, |
| 77 | &efi_runtime, |
| 78 | &efi_config_table, |
| 79 | &efi.esrt, |
| 80 | &efi_mem_attr_table, |
| 81 | #ifdef CONFIG_EFI_RCI2_TABLE |
| 82 | &rci2_table_phys, |
| 83 | #endif |
| 84 | &efi.tpm_log, |
| 85 | &efi.tpm_final_log, |
| 86 | &efi_rng_seed, |
| 87 | #ifdef CONFIG_LOAD_UEFI_KEYS |
| 88 | &efi.mokvar_table, |
| 89 | #endif |
| 90 | #ifdef CONFIG_EFI_COCO_SECRET |
| 91 | &efi.coco_secret, |
| 92 | #endif |
| 93 | #ifdef CONFIG_UNACCEPTED_MEMORY |
| 94 | &efi.unaccepted, |
| 95 | #endif |
| 96 | }; |
| 97 | |
| 98 | u64 efi_setup; /* efi setup_data physical address */ |
| 99 | |
| 100 | static int add_efi_memmap __initdata; |
| 101 | static int __init setup_add_efi_memmap(char *arg) |
| 102 | { |
| 103 | add_efi_memmap = 1; |
| 104 | return 0; |
| 105 | } |
| 106 | early_param("add_efi_memmap" , setup_add_efi_memmap); |
| 107 | |
| 108 | /* |
| 109 | * Tell the kernel about the EFI memory map. This might include |
| 110 | * more than the max 128 entries that can fit in the passed in e820 |
| 111 | * legacy (zeropage) memory map, but the kernel's e820 table can hold |
| 112 | * E820_MAX_ENTRIES. |
| 113 | */ |
| 114 | |
| 115 | static void __init do_add_efi_memmap(void) |
| 116 | { |
| 117 | efi_memory_desc_t *md; |
| 118 | |
| 119 | if (!efi_enabled(EFI_MEMMAP)) |
| 120 | return; |
| 121 | |
| 122 | for_each_efi_memory_desc(md) { |
| 123 | unsigned long long start = md->phys_addr; |
| 124 | unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; |
| 125 | int e820_type; |
| 126 | |
| 127 | switch (md->type) { |
| 128 | case EFI_LOADER_CODE: |
| 129 | case EFI_LOADER_DATA: |
| 130 | case EFI_BOOT_SERVICES_CODE: |
| 131 | case EFI_BOOT_SERVICES_DATA: |
| 132 | case EFI_CONVENTIONAL_MEMORY: |
| 133 | if (efi_soft_reserve_enabled() |
| 134 | && (md->attribute & EFI_MEMORY_SP)) |
| 135 | e820_type = E820_TYPE_SOFT_RESERVED; |
| 136 | else if (md->attribute & EFI_MEMORY_WB) |
| 137 | e820_type = E820_TYPE_RAM; |
| 138 | else |
| 139 | e820_type = E820_TYPE_RESERVED; |
| 140 | break; |
| 141 | case EFI_ACPI_RECLAIM_MEMORY: |
| 142 | e820_type = E820_TYPE_ACPI; |
| 143 | break; |
| 144 | case EFI_ACPI_MEMORY_NVS: |
| 145 | e820_type = E820_TYPE_NVS; |
| 146 | break; |
| 147 | case EFI_UNUSABLE_MEMORY: |
| 148 | e820_type = E820_TYPE_UNUSABLE; |
| 149 | break; |
| 150 | case EFI_PERSISTENT_MEMORY: |
| 151 | e820_type = E820_TYPE_PMEM; |
| 152 | break; |
| 153 | default: |
| 154 | /* |
| 155 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE |
| 156 | * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO |
| 157 | * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE |
| 158 | */ |
| 159 | e820_type = E820_TYPE_RESERVED; |
| 160 | break; |
| 161 | } |
| 162 | |
| 163 | e820__range_add(start, size, type: e820_type); |
| 164 | } |
| 165 | e820__update_table(table: e820_table); |
| 166 | } |
| 167 | |
| 168 | /* |
| 169 | * Given add_efi_memmap defaults to 0 and there is no alternative |
| 170 | * e820 mechanism for soft-reserved memory, import the full EFI memory |
| 171 | * map if soft reservations are present and enabled. Otherwise, the |
| 172 | * mechanism to disable the kernel's consideration of EFI_MEMORY_SP is |
| 173 | * the efi=nosoftreserve option. |
| 174 | */ |
| 175 | static bool do_efi_soft_reserve(void) |
| 176 | { |
| 177 | efi_memory_desc_t *md; |
| 178 | |
| 179 | if (!efi_enabled(EFI_MEMMAP)) |
| 180 | return false; |
| 181 | |
| 182 | if (!efi_soft_reserve_enabled()) |
| 183 | return false; |
| 184 | |
| 185 | for_each_efi_memory_desc(md) |
| 186 | if (md->type == EFI_CONVENTIONAL_MEMORY && |
| 187 | (md->attribute & EFI_MEMORY_SP)) |
| 188 | return true; |
| 189 | return false; |
| 190 | } |
| 191 | |
| 192 | int __init efi_memblock_x86_reserve_range(void) |
| 193 | { |
| 194 | struct efi_info *e = &boot_params.efi_info; |
| 195 | struct efi_memory_map_data data; |
| 196 | phys_addr_t pmap; |
| 197 | int rv; |
| 198 | |
| 199 | if (efi_enabled(EFI_PARAVIRT)) |
| 200 | return 0; |
| 201 | |
| 202 | /* Can't handle firmware tables above 4GB on i386 */ |
| 203 | if (IS_ENABLED(CONFIG_X86_32) && e->efi_memmap_hi > 0) { |
| 204 | pr_err("Memory map is above 4GB, disabling EFI.\n" ); |
| 205 | return -EINVAL; |
| 206 | } |
| 207 | pmap = (phys_addr_t)(e->efi_memmap | ((u64)e->efi_memmap_hi << 32)); |
| 208 | |
| 209 | data.phys_map = pmap; |
| 210 | data.size = e->efi_memmap_size; |
| 211 | data.desc_size = e->efi_memdesc_size; |
| 212 | data.desc_version = e->efi_memdesc_version; |
| 213 | |
| 214 | if (!efi_enabled(EFI_PARAVIRT)) { |
| 215 | rv = efi_memmap_init_early(data: &data); |
| 216 | if (rv) |
| 217 | return rv; |
| 218 | } |
| 219 | |
| 220 | if (add_efi_memmap || do_efi_soft_reserve()) |
| 221 | do_add_efi_memmap(); |
| 222 | |
| 223 | WARN(efi.memmap.desc_version != 1, |
| 224 | "Unexpected EFI_MEMORY_DESCRIPTOR version %ld" , |
| 225 | efi.memmap.desc_version); |
| 226 | |
| 227 | memblock_reserve(base: pmap, size: efi.memmap.nr_map * efi.memmap.desc_size); |
| 228 | set_bit(EFI_PRESERVE_BS_REGIONS, addr: &efi.flags); |
| 229 | |
| 230 | return 0; |
| 231 | } |
| 232 | |
| 233 | #define OVERFLOW_ADDR_SHIFT (64 - EFI_PAGE_SHIFT) |
| 234 | #define OVERFLOW_ADDR_MASK (U64_MAX << OVERFLOW_ADDR_SHIFT) |
| 235 | #define U64_HIGH_BIT (~(U64_MAX >> 1)) |
| 236 | |
| 237 | static bool __init efi_memmap_entry_valid(const efi_memory_desc_t *md, int i) |
| 238 | { |
| 239 | u64 end = (md->num_pages << EFI_PAGE_SHIFT) + md->phys_addr - 1; |
| 240 | u64 end_hi = 0; |
| 241 | char buf[64]; |
| 242 | |
| 243 | if (md->num_pages == 0) { |
| 244 | end = 0; |
| 245 | } else if (md->num_pages > EFI_PAGES_MAX || |
| 246 | EFI_PAGES_MAX - md->num_pages < |
| 247 | (md->phys_addr >> EFI_PAGE_SHIFT)) { |
| 248 | end_hi = (md->num_pages & OVERFLOW_ADDR_MASK) |
| 249 | >> OVERFLOW_ADDR_SHIFT; |
| 250 | |
| 251 | if ((md->phys_addr & U64_HIGH_BIT) && !(end & U64_HIGH_BIT)) |
| 252 | end_hi += 1; |
| 253 | } else { |
| 254 | return true; |
| 255 | } |
| 256 | |
| 257 | pr_warn_once(FW_BUG "Invalid EFI memory map entries:\n" ); |
| 258 | |
| 259 | if (end_hi) { |
| 260 | pr_warn("mem%02u: %s range=[0x%016llx-0x%llx%016llx] (invalid)\n" , |
| 261 | i, efi_md_typeattr_format(buf, sizeof(buf), md), |
| 262 | md->phys_addr, end_hi, end); |
| 263 | } else { |
| 264 | pr_warn("mem%02u: %s range=[0x%016llx-0x%016llx] (invalid)\n" , |
| 265 | i, efi_md_typeattr_format(buf, sizeof(buf), md), |
| 266 | md->phys_addr, end); |
| 267 | } |
| 268 | return false; |
| 269 | } |
| 270 | |
| 271 | static void __init efi_clean_memmap(void) |
| 272 | { |
| 273 | efi_memory_desc_t *out = efi.memmap.map; |
| 274 | const efi_memory_desc_t *in = out; |
| 275 | const efi_memory_desc_t *end = efi.memmap.map_end; |
| 276 | int i, n_removal; |
| 277 | |
| 278 | for (i = n_removal = 0; in < end; i++) { |
| 279 | if (efi_memmap_entry_valid(md: in, i)) { |
| 280 | if (out != in) |
| 281 | memcpy(to: out, from: in, len: efi.memmap.desc_size); |
| 282 | out = (void *)out + efi.memmap.desc_size; |
| 283 | } else { |
| 284 | n_removal++; |
| 285 | } |
| 286 | in = (void *)in + efi.memmap.desc_size; |
| 287 | } |
| 288 | |
| 289 | if (n_removal > 0) { |
| 290 | struct efi_memory_map_data data = { |
| 291 | .phys_map = efi.memmap.phys_map, |
| 292 | .desc_version = efi.memmap.desc_version, |
| 293 | .desc_size = efi.memmap.desc_size, |
| 294 | .size = efi.memmap.desc_size * (efi.memmap.nr_map - n_removal), |
| 295 | .flags = 0, |
| 296 | }; |
| 297 | |
| 298 | pr_warn("Removing %d invalid memory map entries.\n" , n_removal); |
| 299 | efi_memmap_install(data: &data); |
| 300 | } |
| 301 | } |
| 302 | |
| 303 | /* |
| 304 | * Firmware can use EfiMemoryMappedIO to request that MMIO regions be |
| 305 | * mapped by the OS so they can be accessed by EFI runtime services, but |
| 306 | * should have no other significance to the OS (UEFI r2.10, sec 7.2). |
| 307 | * However, most bootloaders and EFI stubs convert EfiMemoryMappedIO |
| 308 | * regions to E820_TYPE_RESERVED entries, which prevent Linux from |
| 309 | * allocating space from them (see remove_e820_regions()). |
| 310 | * |
| 311 | * Some platforms use EfiMemoryMappedIO entries for PCI MMCONFIG space and |
| 312 | * PCI host bridge windows, which means Linux can't allocate BAR space for |
| 313 | * hot-added devices. |
| 314 | * |
| 315 | * Remove large EfiMemoryMappedIO regions from the E820 map to avoid this |
| 316 | * problem. |
| 317 | * |
| 318 | * Retain small EfiMemoryMappedIO regions because on some platforms, these |
| 319 | * describe non-window space that's included in host bridge _CRS. If we |
| 320 | * assign that space to PCI devices, they don't work. |
| 321 | */ |
| 322 | static void __init efi_remove_e820_mmio(void) |
| 323 | { |
| 324 | efi_memory_desc_t *md; |
| 325 | u64 size, start, end; |
| 326 | int i = 0; |
| 327 | |
| 328 | for_each_efi_memory_desc(md) { |
| 329 | if (md->type == EFI_MEMORY_MAPPED_IO) { |
| 330 | size = md->num_pages << EFI_PAGE_SHIFT; |
| 331 | start = md->phys_addr; |
| 332 | end = start + size - 1; |
| 333 | if (size >= 256*1024) { |
| 334 | pr_info("Remove mem%02u: MMIO range=[0x%08llx-0x%08llx] (%lluMB) from e820 map\n" , |
| 335 | i, start, end, size >> 20); |
| 336 | e820__range_remove(start, size, |
| 337 | old_type: E820_TYPE_RESERVED, check_type: 1); |
| 338 | } else { |
| 339 | pr_info("Not removing mem%02u: MMIO range=[0x%08llx-0x%08llx] (%lluKB) from e820 map\n" , |
| 340 | i, start, end, size >> 10); |
| 341 | } |
| 342 | } |
| 343 | i++; |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | void __init efi_print_memmap(void) |
| 348 | { |
| 349 | efi_memory_desc_t *md; |
| 350 | int i = 0; |
| 351 | |
| 352 | for_each_efi_memory_desc(md) { |
| 353 | char buf[64]; |
| 354 | |
| 355 | pr_info("mem%02u: %s range=[0x%016llx-0x%016llx] (%lluMB)\n" , |
| 356 | i++, efi_md_typeattr_format(buf, sizeof(buf), md), |
| 357 | md->phys_addr, |
| 358 | md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1, |
| 359 | (md->num_pages >> (20 - EFI_PAGE_SHIFT))); |
| 360 | } |
| 361 | } |
| 362 | |
| 363 | static int __init efi_systab_init(unsigned long phys) |
| 364 | { |
| 365 | int size = efi_enabled(EFI_64BIT) ? sizeof(efi_system_table_64_t) |
| 366 | : sizeof(efi_system_table_32_t); |
| 367 | const efi_table_hdr_t *hdr; |
| 368 | bool over4g = false; |
| 369 | void *p; |
| 370 | int ret; |
| 371 | |
| 372 | hdr = p = early_memremap_ro(phys_addr: phys, size); |
| 373 | if (p == NULL) { |
| 374 | pr_err("Couldn't map the system table!\n" ); |
| 375 | return -ENOMEM; |
| 376 | } |
| 377 | |
| 378 | ret = efi_systab_check_header(systab_hdr: hdr); |
| 379 | if (ret) { |
| 380 | early_memunmap(addr: p, size); |
| 381 | return ret; |
| 382 | } |
| 383 | |
| 384 | if (efi_enabled(EFI_64BIT)) { |
| 385 | const efi_system_table_64_t *systab64 = p; |
| 386 | |
| 387 | efi_runtime = systab64->runtime; |
| 388 | over4g = systab64->runtime > U32_MAX; |
| 389 | |
| 390 | if (efi_setup) { |
| 391 | struct efi_setup_data *data; |
| 392 | |
| 393 | data = early_memremap_ro(phys_addr: efi_setup, size: sizeof(*data)); |
| 394 | if (!data) { |
| 395 | early_memunmap(addr: p, size); |
| 396 | return -ENOMEM; |
| 397 | } |
| 398 | |
| 399 | efi_fw_vendor = (unsigned long)data->fw_vendor; |
| 400 | efi_config_table = (unsigned long)data->tables; |
| 401 | |
| 402 | over4g |= data->fw_vendor > U32_MAX || |
| 403 | data->tables > U32_MAX; |
| 404 | |
| 405 | early_memunmap(addr: data, size: sizeof(*data)); |
| 406 | } else { |
| 407 | efi_fw_vendor = systab64->fw_vendor; |
| 408 | efi_config_table = systab64->tables; |
| 409 | |
| 410 | over4g |= systab64->fw_vendor > U32_MAX || |
| 411 | systab64->tables > U32_MAX; |
| 412 | } |
| 413 | efi_nr_tables = systab64->nr_tables; |
| 414 | } else { |
| 415 | const efi_system_table_32_t *systab32 = p; |
| 416 | |
| 417 | efi_fw_vendor = systab32->fw_vendor; |
| 418 | efi_runtime = systab32->runtime; |
| 419 | efi_config_table = systab32->tables; |
| 420 | efi_nr_tables = systab32->nr_tables; |
| 421 | } |
| 422 | |
| 423 | efi.runtime_version = hdr->revision; |
| 424 | |
| 425 | efi_systab_report_header(systab_hdr: hdr, fw_vendor: efi_fw_vendor); |
| 426 | early_memunmap(addr: p, size); |
| 427 | |
| 428 | if (IS_ENABLED(CONFIG_X86_32) && over4g) { |
| 429 | pr_err("EFI data located above 4GB, disabling EFI.\n" ); |
| 430 | return -EINVAL; |
| 431 | } |
| 432 | |
| 433 | return 0; |
| 434 | } |
| 435 | |
| 436 | static int __init efi_config_init(const efi_config_table_type_t *arch_tables) |
| 437 | { |
| 438 | void *config_tables; |
| 439 | int sz, ret; |
| 440 | |
| 441 | if (efi_nr_tables == 0) |
| 442 | return 0; |
| 443 | |
| 444 | if (efi_enabled(EFI_64BIT)) |
| 445 | sz = sizeof(efi_config_table_64_t); |
| 446 | else |
| 447 | sz = sizeof(efi_config_table_32_t); |
| 448 | |
| 449 | /* |
| 450 | * Let's see what config tables the firmware passed to us. |
| 451 | */ |
| 452 | config_tables = early_memremap(phys_addr: efi_config_table, size: efi_nr_tables * sz); |
| 453 | if (config_tables == NULL) { |
| 454 | pr_err("Could not map Configuration table!\n" ); |
| 455 | return -ENOMEM; |
| 456 | } |
| 457 | |
| 458 | ret = efi_config_parse_tables(config_tables, count: efi_nr_tables, |
| 459 | arch_tables); |
| 460 | |
| 461 | early_memunmap(addr: config_tables, size: efi_nr_tables * sz); |
| 462 | return ret; |
| 463 | } |
| 464 | |
| 465 | void __init efi_init(void) |
| 466 | { |
| 467 | if (IS_ENABLED(CONFIG_X86_32) && |
| 468 | (boot_params.efi_info.efi_systab_hi || |
| 469 | boot_params.efi_info.efi_memmap_hi)) { |
| 470 | pr_info("Table located above 4GB, disabling EFI.\n" ); |
| 471 | return; |
| 472 | } |
| 473 | |
| 474 | efi_systab_phys = boot_params.efi_info.efi_systab | |
| 475 | ((__u64)boot_params.efi_info.efi_systab_hi << 32); |
| 476 | |
| 477 | if (efi_systab_init(phys: efi_systab_phys)) |
| 478 | return; |
| 479 | |
| 480 | if (efi_reuse_config(tables: efi_config_table, nr_tables: efi_nr_tables)) |
| 481 | return; |
| 482 | |
| 483 | if (efi_config_init(arch_tables)) |
| 484 | return; |
| 485 | |
| 486 | /* |
| 487 | * Note: We currently don't support runtime services on an EFI |
| 488 | * that doesn't match the kernel 32/64-bit mode. |
| 489 | */ |
| 490 | |
| 491 | if (!efi_runtime_supported()) |
| 492 | pr_err("No EFI runtime due to 32/64-bit mismatch with kernel\n" ); |
| 493 | |
| 494 | if (!efi_runtime_supported() || efi_runtime_disabled()) { |
| 495 | efi_memmap_unmap(); |
| 496 | return; |
| 497 | } |
| 498 | |
| 499 | set_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 500 | efi_clean_memmap(); |
| 501 | |
| 502 | efi_remove_e820_mmio(); |
| 503 | |
| 504 | if (efi_enabled(EFI_DBG)) |
| 505 | efi_print_memmap(); |
| 506 | } |
| 507 | |
| 508 | /* Merge contiguous regions of the same type and attribute */ |
| 509 | static void __init efi_merge_regions(void) |
| 510 | { |
| 511 | efi_memory_desc_t *md, *prev_md = NULL; |
| 512 | |
| 513 | for_each_efi_memory_desc(md) { |
| 514 | u64 prev_size; |
| 515 | |
| 516 | if (!prev_md) { |
| 517 | prev_md = md; |
| 518 | continue; |
| 519 | } |
| 520 | |
| 521 | if (prev_md->type != md->type || |
| 522 | prev_md->attribute != md->attribute) { |
| 523 | prev_md = md; |
| 524 | continue; |
| 525 | } |
| 526 | |
| 527 | prev_size = prev_md->num_pages << EFI_PAGE_SHIFT; |
| 528 | |
| 529 | if (md->phys_addr == (prev_md->phys_addr + prev_size)) { |
| 530 | prev_md->num_pages += md->num_pages; |
| 531 | md->type = EFI_RESERVED_TYPE; |
| 532 | md->attribute = 0; |
| 533 | continue; |
| 534 | } |
| 535 | prev_md = md; |
| 536 | } |
| 537 | } |
| 538 | |
| 539 | static void *realloc_pages(void *old_memmap, int old_shift) |
| 540 | { |
| 541 | void *ret; |
| 542 | |
| 543 | ret = (void *)__get_free_pages(GFP_KERNEL, old_shift + 1); |
| 544 | if (!ret) |
| 545 | goto out; |
| 546 | |
| 547 | /* |
| 548 | * A first-time allocation doesn't have anything to copy. |
| 549 | */ |
| 550 | if (!old_memmap) |
| 551 | return ret; |
| 552 | |
| 553 | memcpy(to: ret, from: old_memmap, PAGE_SIZE << old_shift); |
| 554 | |
| 555 | out: |
| 556 | free_pages(addr: (unsigned long)old_memmap, order: old_shift); |
| 557 | return ret; |
| 558 | } |
| 559 | |
| 560 | /* |
| 561 | * Iterate the EFI memory map in reverse order because the regions |
| 562 | * will be mapped top-down. The end result is the same as if we had |
| 563 | * mapped things forward, but doesn't require us to change the |
| 564 | * existing implementation of efi_map_region(). |
| 565 | */ |
| 566 | static inline void *efi_map_next_entry_reverse(void *entry) |
| 567 | { |
| 568 | /* Initial call */ |
| 569 | if (!entry) |
| 570 | return efi.memmap.map_end - efi.memmap.desc_size; |
| 571 | |
| 572 | entry -= efi.memmap.desc_size; |
| 573 | if (entry < efi.memmap.map) |
| 574 | return NULL; |
| 575 | |
| 576 | return entry; |
| 577 | } |
| 578 | |
| 579 | /* |
| 580 | * efi_map_next_entry - Return the next EFI memory map descriptor |
| 581 | * @entry: Previous EFI memory map descriptor |
| 582 | * |
| 583 | * This is a helper function to iterate over the EFI memory map, which |
| 584 | * we do in different orders depending on the current configuration. |
| 585 | * |
| 586 | * To begin traversing the memory map @entry must be %NULL. |
| 587 | * |
| 588 | * Returns %NULL when we reach the end of the memory map. |
| 589 | */ |
| 590 | static void *efi_map_next_entry(void *entry) |
| 591 | { |
| 592 | if (efi_enabled(EFI_64BIT)) { |
| 593 | /* |
| 594 | * Starting in UEFI v2.5 the EFI_PROPERTIES_TABLE |
| 595 | * config table feature requires us to map all entries |
| 596 | * in the same order as they appear in the EFI memory |
| 597 | * map. That is to say, entry N must have a lower |
| 598 | * virtual address than entry N+1. This is because the |
| 599 | * firmware toolchain leaves relative references in |
| 600 | * the code/data sections, which are split and become |
| 601 | * separate EFI memory regions. Mapping things |
| 602 | * out-of-order leads to the firmware accessing |
| 603 | * unmapped addresses. |
| 604 | * |
| 605 | * Since we need to map things this way whether or not |
| 606 | * the kernel actually makes use of |
| 607 | * EFI_PROPERTIES_TABLE, let's just switch to this |
| 608 | * scheme by default for 64-bit. |
| 609 | */ |
| 610 | return efi_map_next_entry_reverse(entry); |
| 611 | } |
| 612 | |
| 613 | /* Initial call */ |
| 614 | if (!entry) |
| 615 | return efi.memmap.map; |
| 616 | |
| 617 | entry += efi.memmap.desc_size; |
| 618 | if (entry >= efi.memmap.map_end) |
| 619 | return NULL; |
| 620 | |
| 621 | return entry; |
| 622 | } |
| 623 | |
| 624 | static bool should_map_region(efi_memory_desc_t *md) |
| 625 | { |
| 626 | /* |
| 627 | * Runtime regions always require runtime mappings (obviously). |
| 628 | */ |
| 629 | if (md->attribute & EFI_MEMORY_RUNTIME) |
| 630 | return true; |
| 631 | |
| 632 | /* |
| 633 | * 32-bit EFI doesn't suffer from the bug that requires us to |
| 634 | * reserve boot services regions, and mixed mode support |
| 635 | * doesn't exist for 32-bit kernels. |
| 636 | */ |
| 637 | if (IS_ENABLED(CONFIG_X86_32)) |
| 638 | return false; |
| 639 | |
| 640 | /* |
| 641 | * EFI specific purpose memory may be reserved by default |
| 642 | * depending on kernel config and boot options. |
| 643 | */ |
| 644 | if (md->type == EFI_CONVENTIONAL_MEMORY && |
| 645 | efi_soft_reserve_enabled() && |
| 646 | (md->attribute & EFI_MEMORY_SP)) |
| 647 | return false; |
| 648 | |
| 649 | /* |
| 650 | * Map all of RAM so that we can access arguments in the 1:1 |
| 651 | * mapping when making EFI runtime calls. |
| 652 | */ |
| 653 | if (efi_is_mixed()) { |
| 654 | if (md->type == EFI_CONVENTIONAL_MEMORY || |
| 655 | md->type == EFI_LOADER_DATA || |
| 656 | md->type == EFI_LOADER_CODE) |
| 657 | return true; |
| 658 | } |
| 659 | |
| 660 | /* |
| 661 | * Map boot services regions as a workaround for buggy |
| 662 | * firmware that accesses them even when they shouldn't. |
| 663 | * |
| 664 | * See efi_{reserve,free}_boot_services(). |
| 665 | */ |
| 666 | if (md->type == EFI_BOOT_SERVICES_CODE || |
| 667 | md->type == EFI_BOOT_SERVICES_DATA) |
| 668 | return true; |
| 669 | |
| 670 | return false; |
| 671 | } |
| 672 | |
| 673 | /* |
| 674 | * Map the efi memory ranges of the runtime services and update new_mmap with |
| 675 | * virtual addresses. |
| 676 | */ |
| 677 | static void * __init efi_map_regions(int *count, int *pg_shift) |
| 678 | { |
| 679 | void *p, *new_memmap = NULL; |
| 680 | unsigned long left = 0; |
| 681 | unsigned long desc_size; |
| 682 | efi_memory_desc_t *md; |
| 683 | |
| 684 | desc_size = efi.memmap.desc_size; |
| 685 | |
| 686 | p = NULL; |
| 687 | while ((p = efi_map_next_entry(entry: p))) { |
| 688 | md = p; |
| 689 | |
| 690 | if (!should_map_region(md)) |
| 691 | continue; |
| 692 | |
| 693 | efi_map_region(md); |
| 694 | |
| 695 | if (left < desc_size) { |
| 696 | new_memmap = realloc_pages(old_memmap: new_memmap, old_shift: *pg_shift); |
| 697 | if (!new_memmap) |
| 698 | return NULL; |
| 699 | |
| 700 | left += PAGE_SIZE << *pg_shift; |
| 701 | (*pg_shift)++; |
| 702 | } |
| 703 | |
| 704 | memcpy(to: new_memmap + (*count * desc_size), from: md, len: desc_size); |
| 705 | |
| 706 | left -= desc_size; |
| 707 | (*count)++; |
| 708 | } |
| 709 | |
| 710 | return new_memmap; |
| 711 | } |
| 712 | |
| 713 | static void __init kexec_enter_virtual_mode(void) |
| 714 | { |
| 715 | #ifdef CONFIG_KEXEC_CORE |
| 716 | efi_memory_desc_t *md; |
| 717 | unsigned int num_pages; |
| 718 | |
| 719 | /* |
| 720 | * We don't do virtual mode, since we don't do runtime services, on |
| 721 | * non-native EFI. |
| 722 | */ |
| 723 | if (efi_is_mixed()) { |
| 724 | efi_memmap_unmap(); |
| 725 | clear_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 726 | return; |
| 727 | } |
| 728 | |
| 729 | if (efi_alloc_page_tables()) { |
| 730 | pr_err("Failed to allocate EFI page tables\n" ); |
| 731 | clear_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 732 | return; |
| 733 | } |
| 734 | |
| 735 | /* |
| 736 | * Map efi regions which were passed via setup_data. The virt_addr is a |
| 737 | * fixed addr which was used in first kernel of a kexec boot. |
| 738 | */ |
| 739 | for_each_efi_memory_desc(md) |
| 740 | efi_map_region_fixed(md); /* FIXME: add error handling */ |
| 741 | |
| 742 | /* |
| 743 | * Unregister the early EFI memmap from efi_init() and install |
| 744 | * the new EFI memory map. |
| 745 | */ |
| 746 | efi_memmap_unmap(); |
| 747 | |
| 748 | if (efi_memmap_init_late(addr: efi.memmap.phys_map, |
| 749 | size: efi.memmap.desc_size * efi.memmap.nr_map)) { |
| 750 | pr_err("Failed to remap late EFI memory map\n" ); |
| 751 | clear_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 752 | return; |
| 753 | } |
| 754 | |
| 755 | num_pages = ALIGN(efi.memmap.nr_map * efi.memmap.desc_size, PAGE_SIZE); |
| 756 | num_pages >>= PAGE_SHIFT; |
| 757 | |
| 758 | if (efi_setup_page_tables(pa_memmap: efi.memmap.phys_map, num_pages)) { |
| 759 | clear_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 760 | return; |
| 761 | } |
| 762 | |
| 763 | efi_sync_low_kernel_mappings(); |
| 764 | efi_native_runtime_setup(); |
| 765 | efi_runtime_update_mappings(); |
| 766 | #endif |
| 767 | } |
| 768 | |
| 769 | /* |
| 770 | * This function will switch the EFI runtime services to virtual mode. |
| 771 | * Essentially, we look through the EFI memmap and map every region that |
| 772 | * has the runtime attribute bit set in its memory descriptor into the |
| 773 | * efi_pgd page table. |
| 774 | * |
| 775 | * The new method does a pagetable switch in a preemption-safe manner |
| 776 | * so that we're in a different address space when calling a runtime |
| 777 | * function. For function arguments passing we do copy the PUDs of the |
| 778 | * kernel page table into efi_pgd prior to each call. |
| 779 | * |
| 780 | * Specially for kexec boot, efi runtime maps in previous kernel should |
| 781 | * be passed in via setup_data. In that case runtime ranges will be mapped |
| 782 | * to the same virtual addresses as the first kernel, see |
| 783 | * kexec_enter_virtual_mode(). |
| 784 | */ |
| 785 | static void __init __efi_enter_virtual_mode(void) |
| 786 | { |
| 787 | int count = 0, pg_shift = 0; |
| 788 | void *new_memmap = NULL; |
| 789 | efi_status_t status; |
| 790 | unsigned long pa; |
| 791 | |
| 792 | if (efi_alloc_page_tables()) { |
| 793 | pr_err("Failed to allocate EFI page tables\n" ); |
| 794 | goto err; |
| 795 | } |
| 796 | |
| 797 | efi_merge_regions(); |
| 798 | new_memmap = efi_map_regions(count: &count, pg_shift: &pg_shift); |
| 799 | if (!new_memmap) { |
| 800 | pr_err("Error reallocating memory, EFI runtime non-functional!\n" ); |
| 801 | goto err; |
| 802 | } |
| 803 | |
| 804 | pa = __pa(new_memmap); |
| 805 | |
| 806 | /* |
| 807 | * Unregister the early EFI memmap from efi_init() and install |
| 808 | * the new EFI memory map that we are about to pass to the |
| 809 | * firmware via SetVirtualAddressMap(). |
| 810 | */ |
| 811 | efi_memmap_unmap(); |
| 812 | |
| 813 | if (efi_memmap_init_late(addr: pa, size: efi.memmap.desc_size * count)) { |
| 814 | pr_err("Failed to remap late EFI memory map\n" ); |
| 815 | goto err; |
| 816 | } |
| 817 | |
| 818 | if (efi_enabled(EFI_DBG)) { |
| 819 | pr_info("EFI runtime memory map:\n" ); |
| 820 | efi_print_memmap(); |
| 821 | } |
| 822 | |
| 823 | if (efi_setup_page_tables(pa_memmap: pa, num_pages: 1 << pg_shift)) |
| 824 | goto err; |
| 825 | |
| 826 | efi_sync_low_kernel_mappings(); |
| 827 | |
| 828 | status = efi_set_virtual_address_map(memory_map_size: efi.memmap.desc_size * count, |
| 829 | descriptor_size: efi.memmap.desc_size, |
| 830 | descriptor_version: efi.memmap.desc_version, |
| 831 | virtual_map: (efi_memory_desc_t *)pa, |
| 832 | systab_phys: efi_systab_phys); |
| 833 | if (status != EFI_SUCCESS) { |
| 834 | pr_err("Unable to switch EFI into virtual mode (status=%lx)!\n" , |
| 835 | status); |
| 836 | goto err; |
| 837 | } |
| 838 | |
| 839 | efi_check_for_embedded_firmwares(); |
| 840 | efi_free_boot_services(); |
| 841 | |
| 842 | if (!efi_is_mixed()) |
| 843 | efi_native_runtime_setup(); |
| 844 | else |
| 845 | efi_thunk_runtime_setup(); |
| 846 | |
| 847 | /* |
| 848 | * Apply more restrictive page table mapping attributes now that |
| 849 | * SVAM() has been called and the firmware has performed all |
| 850 | * necessary relocation fixups for the new virtual addresses. |
| 851 | */ |
| 852 | efi_runtime_update_mappings(); |
| 853 | |
| 854 | /* clean DUMMY object */ |
| 855 | efi_delete_dummy_variable(); |
| 856 | return; |
| 857 | |
| 858 | err: |
| 859 | clear_bit(EFI_RUNTIME_SERVICES, addr: &efi.flags); |
| 860 | } |
| 861 | |
| 862 | void __init efi_enter_virtual_mode(void) |
| 863 | { |
| 864 | if (efi_enabled(EFI_PARAVIRT)) |
| 865 | return; |
| 866 | |
| 867 | efi.runtime = (efi_runtime_services_t *)efi_runtime; |
| 868 | |
| 869 | if (efi_setup) |
| 870 | kexec_enter_virtual_mode(); |
| 871 | else |
| 872 | __efi_enter_virtual_mode(); |
| 873 | |
| 874 | efi_dump_pagetable(); |
| 875 | } |
| 876 | |
| 877 | bool efi_is_table_address(unsigned long phys_addr) |
| 878 | { |
| 879 | unsigned int i; |
| 880 | |
| 881 | if (phys_addr == EFI_INVALID_TABLE_ADDR) |
| 882 | return false; |
| 883 | |
| 884 | for (i = 0; i < ARRAY_SIZE(efi_tables); i++) |
| 885 | if (*(efi_tables[i]) == phys_addr) |
| 886 | return true; |
| 887 | |
| 888 | return false; |
| 889 | } |
| 890 | |
| 891 | #define EFI_FIELD(var) efi_ ## var |
| 892 | |
| 893 | #define EFI_ATTR_SHOW(name) \ |
| 894 | static ssize_t name##_show(struct kobject *kobj, \ |
| 895 | struct kobj_attribute *attr, char *buf) \ |
| 896 | { \ |
| 897 | return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \ |
| 898 | } |
| 899 | |
| 900 | EFI_ATTR_SHOW(fw_vendor); |
| 901 | EFI_ATTR_SHOW(runtime); |
| 902 | EFI_ATTR_SHOW(config_table); |
| 903 | |
| 904 | struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor); |
| 905 | struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime); |
| 906 | struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table); |
| 907 | |
| 908 | umode_t efi_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n) |
| 909 | { |
| 910 | if (attr == &efi_attr_fw_vendor.attr) { |
| 911 | if (efi_enabled(EFI_PARAVIRT) || |
| 912 | efi_fw_vendor == EFI_INVALID_TABLE_ADDR) |
| 913 | return 0; |
| 914 | } else if (attr == &efi_attr_runtime.attr) { |
| 915 | if (efi_runtime == EFI_INVALID_TABLE_ADDR) |
| 916 | return 0; |
| 917 | } else if (attr == &efi_attr_config_table.attr) { |
| 918 | if (efi_config_table == EFI_INVALID_TABLE_ADDR) |
| 919 | return 0; |
| 920 | } |
| 921 | return attr->mode; |
| 922 | } |
| 923 | |
| 924 | enum efi_secureboot_mode __x86_ima_efi_boot_mode(void) |
| 925 | { |
| 926 | return boot_params.secure_boot; |
| 927 | } |
| 928 | |