Linux Audio

Check our new training course

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