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