~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/platform/efi/efi.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php