cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vars.c (31512B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Originally from efivars.c
      4 *
      5 * Copyright (C) 2001,2003,2004 Dell <Matt_Domsch@dell.com>
      6 * Copyright (C) 2004 Intel Corporation <matthew.e.tolentino@intel.com>
      7 */
      8
      9#include <linux/capability.h>
     10#include <linux/types.h>
     11#include <linux/errno.h>
     12#include <linux/init.h>
     13#include <linux/mm.h>
     14#include <linux/module.h>
     15#include <linux/string.h>
     16#include <linux/smp.h>
     17#include <linux/efi.h>
     18#include <linux/sysfs.h>
     19#include <linux/device.h>
     20#include <linux/slab.h>
     21#include <linux/ctype.h>
     22#include <linux/ucs2_string.h>
     23
     24/* Private pointer to registered efivars */
     25static struct efivars *__efivars;
     26
     27/*
     28 * efivars_lock protects three things:
     29 * 1) efivarfs_list and efivars_sysfs_list
     30 * 2) ->ops calls
     31 * 3) (un)registration of __efivars
     32 */
     33static DEFINE_SEMAPHORE(efivars_lock);
     34
     35static bool
     36validate_device_path(efi_char16_t *var_name, int match, u8 *buffer,
     37		     unsigned long len)
     38{
     39	struct efi_generic_dev_path *node;
     40	int offset = 0;
     41
     42	node = (struct efi_generic_dev_path *)buffer;
     43
     44	if (len < sizeof(*node))
     45		return false;
     46
     47	while (offset <= len - sizeof(*node) &&
     48	       node->length >= sizeof(*node) &&
     49		node->length <= len - offset) {
     50		offset += node->length;
     51
     52		if ((node->type == EFI_DEV_END_PATH ||
     53		     node->type == EFI_DEV_END_PATH2) &&
     54		    node->sub_type == EFI_DEV_END_ENTIRE)
     55			return true;
     56
     57		node = (struct efi_generic_dev_path *)(buffer + offset);
     58	}
     59
     60	/*
     61	 * If we're here then either node->length pointed past the end
     62	 * of the buffer or we reached the end of the buffer without
     63	 * finding a device path end node.
     64	 */
     65	return false;
     66}
     67
     68static bool
     69validate_boot_order(efi_char16_t *var_name, int match, u8 *buffer,
     70		    unsigned long len)
     71{
     72	/* An array of 16-bit integers */
     73	if ((len % 2) != 0)
     74		return false;
     75
     76	return true;
     77}
     78
     79static bool
     80validate_load_option(efi_char16_t *var_name, int match, u8 *buffer,
     81		     unsigned long len)
     82{
     83	u16 filepathlength;
     84	int i, desclength = 0, namelen;
     85
     86	namelen = ucs2_strnlen(var_name, EFI_VAR_NAME_LEN);
     87
     88	/* Either "Boot" or "Driver" followed by four digits of hex */
     89	for (i = match; i < match+4; i++) {
     90		if (var_name[i] > 127 ||
     91		    hex_to_bin(var_name[i] & 0xff) < 0)
     92			return true;
     93	}
     94
     95	/* Reject it if there's 4 digits of hex and then further content */
     96	if (namelen > match + 4)
     97		return false;
     98
     99	/* A valid entry must be at least 8 bytes */
    100	if (len < 8)
    101		return false;
    102
    103	filepathlength = buffer[4] | buffer[5] << 8;
    104
    105	/*
    106	 * There's no stored length for the description, so it has to be
    107	 * found by hand
    108	 */
    109	desclength = ucs2_strsize((efi_char16_t *)(buffer + 6), len - 6) + 2;
    110
    111	/* Each boot entry must have a descriptor */
    112	if (!desclength)
    113		return false;
    114
    115	/*
    116	 * If the sum of the length of the description, the claimed filepath
    117	 * length and the original header are greater than the length of the
    118	 * variable, it's malformed
    119	 */
    120	if ((desclength + filepathlength + 6) > len)
    121		return false;
    122
    123	/*
    124	 * And, finally, check the filepath
    125	 */
    126	return validate_device_path(var_name, match, buffer + desclength + 6,
    127				    filepathlength);
    128}
    129
    130static bool
    131validate_uint16(efi_char16_t *var_name, int match, u8 *buffer,
    132		unsigned long len)
    133{
    134	/* A single 16-bit integer */
    135	if (len != 2)
    136		return false;
    137
    138	return true;
    139}
    140
    141static bool
    142validate_ascii_string(efi_char16_t *var_name, int match, u8 *buffer,
    143		      unsigned long len)
    144{
    145	int i;
    146
    147	for (i = 0; i < len; i++) {
    148		if (buffer[i] > 127)
    149			return false;
    150
    151		if (buffer[i] == 0)
    152			return true;
    153	}
    154
    155	return false;
    156}
    157
    158struct variable_validate {
    159	efi_guid_t vendor;
    160	char *name;
    161	bool (*validate)(efi_char16_t *var_name, int match, u8 *data,
    162			 unsigned long len);
    163};
    164
    165/*
    166 * This is the list of variables we need to validate, as well as the
    167 * whitelist for what we think is safe not to default to immutable.
    168 *
    169 * If it has a validate() method that's not NULL, it'll go into the
    170 * validation routine.  If not, it is assumed valid, but still used for
    171 * whitelisting.
    172 *
    173 * Note that it's sorted by {vendor,name}, but globbed names must come after
    174 * any other name with the same prefix.
    175 */
    176static const struct variable_validate variable_validate[] = {
    177	{ EFI_GLOBAL_VARIABLE_GUID, "BootNext", validate_uint16 },
    178	{ EFI_GLOBAL_VARIABLE_GUID, "BootOrder", validate_boot_order },
    179	{ EFI_GLOBAL_VARIABLE_GUID, "Boot*", validate_load_option },
    180	{ EFI_GLOBAL_VARIABLE_GUID, "DriverOrder", validate_boot_order },
    181	{ EFI_GLOBAL_VARIABLE_GUID, "Driver*", validate_load_option },
    182	{ EFI_GLOBAL_VARIABLE_GUID, "ConIn", validate_device_path },
    183	{ EFI_GLOBAL_VARIABLE_GUID, "ConInDev", validate_device_path },
    184	{ EFI_GLOBAL_VARIABLE_GUID, "ConOut", validate_device_path },
    185	{ EFI_GLOBAL_VARIABLE_GUID, "ConOutDev", validate_device_path },
    186	{ EFI_GLOBAL_VARIABLE_GUID, "ErrOut", validate_device_path },
    187	{ EFI_GLOBAL_VARIABLE_GUID, "ErrOutDev", validate_device_path },
    188	{ EFI_GLOBAL_VARIABLE_GUID, "Lang", validate_ascii_string },
    189	{ EFI_GLOBAL_VARIABLE_GUID, "OsIndications", NULL },
    190	{ EFI_GLOBAL_VARIABLE_GUID, "PlatformLang", validate_ascii_string },
    191	{ EFI_GLOBAL_VARIABLE_GUID, "Timeout", validate_uint16 },
    192	{ LINUX_EFI_CRASH_GUID, "*", NULL },
    193	{ NULL_GUID, "", NULL },
    194};
    195
    196/*
    197 * Check if @var_name matches the pattern given in @match_name.
    198 *
    199 * @var_name: an array of @len non-NUL characters.
    200 * @match_name: a NUL-terminated pattern string, optionally ending in "*". A
    201 *              final "*" character matches any trailing characters @var_name,
    202 *              including the case when there are none left in @var_name.
    203 * @match: on output, the number of non-wildcard characters in @match_name
    204 *         that @var_name matches, regardless of the return value.
    205 * @return: whether @var_name fully matches @match_name.
    206 */
    207static bool
    208variable_matches(const char *var_name, size_t len, const char *match_name,
    209		 int *match)
    210{
    211	for (*match = 0; ; (*match)++) {
    212		char c = match_name[*match];
    213
    214		switch (c) {
    215		case '*':
    216			/* Wildcard in @match_name means we've matched. */
    217			return true;
    218
    219		case '\0':
    220			/* @match_name has ended. Has @var_name too? */
    221			return (*match == len);
    222
    223		default:
    224			/*
    225			 * We've reached a non-wildcard char in @match_name.
    226			 * Continue only if there's an identical character in
    227			 * @var_name.
    228			 */
    229			if (*match < len && c == var_name[*match])
    230				continue;
    231			return false;
    232		}
    233	}
    234}
    235
    236bool
    237efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
    238		unsigned long data_size)
    239{
    240	int i;
    241	unsigned long utf8_size;
    242	u8 *utf8_name;
    243
    244	utf8_size = ucs2_utf8size(var_name);
    245	utf8_name = kmalloc(utf8_size + 1, GFP_KERNEL);
    246	if (!utf8_name)
    247		return false;
    248
    249	ucs2_as_utf8(utf8_name, var_name, utf8_size);
    250	utf8_name[utf8_size] = '\0';
    251
    252	for (i = 0; variable_validate[i].name[0] != '\0'; i++) {
    253		const char *name = variable_validate[i].name;
    254		int match = 0;
    255
    256		if (efi_guidcmp(vendor, variable_validate[i].vendor))
    257			continue;
    258
    259		if (variable_matches(utf8_name, utf8_size+1, name, &match)) {
    260			if (variable_validate[i].validate == NULL)
    261				break;
    262			kfree(utf8_name);
    263			return variable_validate[i].validate(var_name, match,
    264							     data, data_size);
    265		}
    266	}
    267	kfree(utf8_name);
    268	return true;
    269}
    270EXPORT_SYMBOL_GPL(efivar_validate);
    271
    272bool
    273efivar_variable_is_removable(efi_guid_t vendor, const char *var_name,
    274			     size_t len)
    275{
    276	int i;
    277	bool found = false;
    278	int match = 0;
    279
    280	/*
    281	 * Check if our variable is in the validated variables list
    282	 */
    283	for (i = 0; variable_validate[i].name[0] != '\0'; i++) {
    284		if (efi_guidcmp(variable_validate[i].vendor, vendor))
    285			continue;
    286
    287		if (variable_matches(var_name, len,
    288				     variable_validate[i].name, &match)) {
    289			found = true;
    290			break;
    291		}
    292	}
    293
    294	/*
    295	 * If it's in our list, it is removable.
    296	 */
    297	return found;
    298}
    299EXPORT_SYMBOL_GPL(efivar_variable_is_removable);
    300
    301static efi_status_t
    302check_var_size(u32 attributes, unsigned long size)
    303{
    304	const struct efivar_operations *fops;
    305
    306	if (!__efivars)
    307		return EFI_UNSUPPORTED;
    308
    309	fops = __efivars->ops;
    310
    311	if (!fops->query_variable_store)
    312		return EFI_UNSUPPORTED;
    313
    314	return fops->query_variable_store(attributes, size, false);
    315}
    316
    317static efi_status_t
    318check_var_size_nonblocking(u32 attributes, unsigned long size)
    319{
    320	const struct efivar_operations *fops;
    321
    322	if (!__efivars)
    323		return EFI_UNSUPPORTED;
    324
    325	fops = __efivars->ops;
    326
    327	if (!fops->query_variable_store)
    328		return EFI_UNSUPPORTED;
    329
    330	return fops->query_variable_store(attributes, size, true);
    331}
    332
    333static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor,
    334				struct list_head *head)
    335{
    336	struct efivar_entry *entry, *n;
    337	unsigned long strsize1, strsize2;
    338	bool found = false;
    339
    340	strsize1 = ucs2_strsize(variable_name, 1024);
    341	list_for_each_entry_safe(entry, n, head, list) {
    342		strsize2 = ucs2_strsize(entry->var.VariableName, 1024);
    343		if (strsize1 == strsize2 &&
    344			!memcmp(variable_name, &(entry->var.VariableName),
    345				strsize2) &&
    346			!efi_guidcmp(entry->var.VendorGuid,
    347				*vendor)) {
    348			found = true;
    349			break;
    350		}
    351	}
    352	return found;
    353}
    354
    355/*
    356 * Returns the size of variable_name, in bytes, including the
    357 * terminating NULL character, or variable_name_size if no NULL
    358 * character is found among the first variable_name_size bytes.
    359 */
    360static unsigned long var_name_strnsize(efi_char16_t *variable_name,
    361				       unsigned long variable_name_size)
    362{
    363	unsigned long len;
    364	efi_char16_t c;
    365
    366	/*
    367	 * The variable name is, by definition, a NULL-terminated
    368	 * string, so make absolutely sure that variable_name_size is
    369	 * the value we expect it to be. If not, return the real size.
    370	 */
    371	for (len = 2; len <= variable_name_size; len += sizeof(c)) {
    372		c = variable_name[(len / sizeof(c)) - 1];
    373		if (!c)
    374			break;
    375	}
    376
    377	return min(len, variable_name_size);
    378}
    379
    380/*
    381 * Print a warning when duplicate EFI variables are encountered and
    382 * disable the sysfs workqueue since the firmware is buggy.
    383 */
    384static void dup_variable_bug(efi_char16_t *str16, efi_guid_t *vendor_guid,
    385			     unsigned long len16)
    386{
    387	size_t i, len8 = len16 / sizeof(efi_char16_t);
    388	char *str8;
    389
    390	str8 = kzalloc(len8, GFP_KERNEL);
    391	if (!str8)
    392		return;
    393
    394	for (i = 0; i < len8; i++)
    395		str8[i] = str16[i];
    396
    397	printk(KERN_WARNING "efivars: duplicate variable: %s-%pUl\n",
    398	       str8, vendor_guid);
    399	kfree(str8);
    400}
    401
    402/**
    403 * efivar_init - build the initial list of EFI variables
    404 * @func: callback function to invoke for every variable
    405 * @data: function-specific data to pass to @func
    406 * @duplicates: error if we encounter duplicates on @head?
    407 * @head: initialised head of variable list
    408 *
    409 * Get every EFI variable from the firmware and invoke @func. @func
    410 * should call efivar_entry_add() to build the list of variables.
    411 *
    412 * Returns 0 on success, or a kernel error code on failure.
    413 */
    414int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
    415		void *data, bool duplicates, struct list_head *head)
    416{
    417	const struct efivar_operations *ops;
    418	unsigned long variable_name_size = 1024;
    419	efi_char16_t *variable_name;
    420	efi_status_t status;
    421	efi_guid_t vendor_guid;
    422	int err = 0;
    423
    424	if (!__efivars)
    425		return -EFAULT;
    426
    427	ops = __efivars->ops;
    428
    429	variable_name = kzalloc(variable_name_size, GFP_KERNEL);
    430	if (!variable_name) {
    431		printk(KERN_ERR "efivars: Memory allocation failed.\n");
    432		return -ENOMEM;
    433	}
    434
    435	if (down_interruptible(&efivars_lock)) {
    436		err = -EINTR;
    437		goto free;
    438	}
    439
    440	/*
    441	 * Per EFI spec, the maximum storage allocated for both
    442	 * the variable name and variable data is 1024 bytes.
    443	 */
    444
    445	do {
    446		variable_name_size = 1024;
    447
    448		status = ops->get_next_variable(&variable_name_size,
    449						variable_name,
    450						&vendor_guid);
    451		switch (status) {
    452		case EFI_SUCCESS:
    453			if (duplicates)
    454				up(&efivars_lock);
    455
    456			variable_name_size = var_name_strnsize(variable_name,
    457							       variable_name_size);
    458
    459			/*
    460			 * Some firmware implementations return the
    461			 * same variable name on multiple calls to
    462			 * get_next_variable(). Terminate the loop
    463			 * immediately as there is no guarantee that
    464			 * we'll ever see a different variable name,
    465			 * and may end up looping here forever.
    466			 */
    467			if (duplicates &&
    468			    variable_is_present(variable_name, &vendor_guid,
    469						head)) {
    470				dup_variable_bug(variable_name, &vendor_guid,
    471						 variable_name_size);
    472				status = EFI_NOT_FOUND;
    473			} else {
    474				err = func(variable_name, vendor_guid,
    475					   variable_name_size, data);
    476				if (err)
    477					status = EFI_NOT_FOUND;
    478			}
    479
    480			if (duplicates) {
    481				if (down_interruptible(&efivars_lock)) {
    482					err = -EINTR;
    483					goto free;
    484				}
    485			}
    486
    487			break;
    488		case EFI_UNSUPPORTED:
    489			err = -EOPNOTSUPP;
    490			status = EFI_NOT_FOUND;
    491			break;
    492		case EFI_NOT_FOUND:
    493			break;
    494		default:
    495			printk(KERN_WARNING "efivars: get_next_variable: status=%lx\n",
    496				status);
    497			status = EFI_NOT_FOUND;
    498			break;
    499		}
    500
    501	} while (status != EFI_NOT_FOUND);
    502
    503	up(&efivars_lock);
    504free:
    505	kfree(variable_name);
    506
    507	return err;
    508}
    509EXPORT_SYMBOL_GPL(efivar_init);
    510
    511/**
    512 * efivar_entry_add - add entry to variable list
    513 * @entry: entry to add to list
    514 * @head: list head
    515 *
    516 * Returns 0 on success, or a kernel error code on failure.
    517 */
    518int efivar_entry_add(struct efivar_entry *entry, struct list_head *head)
    519{
    520	if (down_interruptible(&efivars_lock))
    521		return -EINTR;
    522	list_add(&entry->list, head);
    523	up(&efivars_lock);
    524
    525	return 0;
    526}
    527EXPORT_SYMBOL_GPL(efivar_entry_add);
    528
    529/**
    530 * efivar_entry_remove - remove entry from variable list
    531 * @entry: entry to remove from list
    532 *
    533 * Returns 0 on success, or a kernel error code on failure.
    534 */
    535int efivar_entry_remove(struct efivar_entry *entry)
    536{
    537	if (down_interruptible(&efivars_lock))
    538		return -EINTR;
    539	list_del(&entry->list);
    540	up(&efivars_lock);
    541
    542	return 0;
    543}
    544EXPORT_SYMBOL_GPL(efivar_entry_remove);
    545
    546/*
    547 * efivar_entry_list_del_unlock - remove entry from variable list
    548 * @entry: entry to remove
    549 *
    550 * Remove @entry from the variable list and release the list lock.
    551 *
    552 * NOTE: slightly weird locking semantics here - we expect to be
    553 * called with the efivars lock already held, and we release it before
    554 * returning. This is because this function is usually called after
    555 * set_variable() while the lock is still held.
    556 */
    557static void efivar_entry_list_del_unlock(struct efivar_entry *entry)
    558{
    559	list_del(&entry->list);
    560	up(&efivars_lock);
    561}
    562
    563/**
    564 * __efivar_entry_delete - delete an EFI variable
    565 * @entry: entry containing EFI variable to delete
    566 *
    567 * Delete the variable from the firmware but leave @entry on the
    568 * variable list.
    569 *
    570 * This function differs from efivar_entry_delete() because it does
    571 * not remove @entry from the variable list. Also, it is safe to be
    572 * called from within a efivar_entry_iter_begin() and
    573 * efivar_entry_iter_end() region, unlike efivar_entry_delete().
    574 *
    575 * Returns 0 on success, or a converted EFI status code if
    576 * set_variable() fails.
    577 */
    578int __efivar_entry_delete(struct efivar_entry *entry)
    579{
    580	efi_status_t status;
    581
    582	if (!__efivars)
    583		return -EINVAL;
    584
    585	status = __efivars->ops->set_variable(entry->var.VariableName,
    586					      &entry->var.VendorGuid,
    587					      0, 0, NULL);
    588
    589	return efi_status_to_err(status);
    590}
    591EXPORT_SYMBOL_GPL(__efivar_entry_delete);
    592
    593/**
    594 * efivar_entry_delete - delete variable and remove entry from list
    595 * @entry: entry containing variable to delete
    596 *
    597 * Delete the variable from the firmware and remove @entry from the
    598 * variable list. It is the caller's responsibility to free @entry
    599 * once we return.
    600 *
    601 * Returns 0 on success, -EINTR if we can't grab the semaphore,
    602 * converted EFI status code if set_variable() fails.
    603 */
    604int efivar_entry_delete(struct efivar_entry *entry)
    605{
    606	const struct efivar_operations *ops;
    607	efi_status_t status;
    608
    609	if (down_interruptible(&efivars_lock))
    610		return -EINTR;
    611
    612	if (!__efivars) {
    613		up(&efivars_lock);
    614		return -EINVAL;
    615	}
    616	ops = __efivars->ops;
    617	status = ops->set_variable(entry->var.VariableName,
    618				   &entry->var.VendorGuid,
    619				   0, 0, NULL);
    620	if (!(status == EFI_SUCCESS || status == EFI_NOT_FOUND)) {
    621		up(&efivars_lock);
    622		return efi_status_to_err(status);
    623	}
    624
    625	efivar_entry_list_del_unlock(entry);
    626	return 0;
    627}
    628EXPORT_SYMBOL_GPL(efivar_entry_delete);
    629
    630/**
    631 * efivar_entry_set - call set_variable()
    632 * @entry: entry containing the EFI variable to write
    633 * @attributes: variable attributes
    634 * @size: size of @data buffer
    635 * @data: buffer containing variable data
    636 * @head: head of variable list
    637 *
    638 * Calls set_variable() for an EFI variable. If creating a new EFI
    639 * variable, this function is usually followed by efivar_entry_add().
    640 *
    641 * Before writing the variable, the remaining EFI variable storage
    642 * space is checked to ensure there is enough room available.
    643 *
    644 * If @head is not NULL a lookup is performed to determine whether
    645 * the entry is already on the list.
    646 *
    647 * Returns 0 on success, -EINTR if we can't grab the semaphore,
    648 * -EEXIST if a lookup is performed and the entry already exists on
    649 * the list, or a converted EFI status code if set_variable() fails.
    650 */
    651int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
    652		     unsigned long size, void *data, struct list_head *head)
    653{
    654	const struct efivar_operations *ops;
    655	efi_status_t status;
    656	efi_char16_t *name = entry->var.VariableName;
    657	efi_guid_t vendor = entry->var.VendorGuid;
    658
    659	if (down_interruptible(&efivars_lock))
    660		return -EINTR;
    661
    662	if (!__efivars) {
    663		up(&efivars_lock);
    664		return -EINVAL;
    665	}
    666	ops = __efivars->ops;
    667	if (head && efivar_entry_find(name, vendor, head, false)) {
    668		up(&efivars_lock);
    669		return -EEXIST;
    670	}
    671
    672	status = check_var_size(attributes, size + ucs2_strsize(name, 1024));
    673	if (status == EFI_SUCCESS || status == EFI_UNSUPPORTED)
    674		status = ops->set_variable(name, &vendor,
    675					   attributes, size, data);
    676
    677	up(&efivars_lock);
    678
    679	return efi_status_to_err(status);
    680
    681}
    682EXPORT_SYMBOL_GPL(efivar_entry_set);
    683
    684/*
    685 * efivar_entry_set_nonblocking - call set_variable_nonblocking()
    686 *
    687 * This function is guaranteed to not block and is suitable for calling
    688 * from crash/panic handlers.
    689 *
    690 * Crucially, this function will not block if it cannot acquire
    691 * efivars_lock. Instead, it returns -EBUSY.
    692 */
    693static int
    694efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
    695			     u32 attributes, unsigned long size, void *data)
    696{
    697	const struct efivar_operations *ops;
    698	efi_status_t status;
    699
    700	if (down_trylock(&efivars_lock))
    701		return -EBUSY;
    702
    703	if (!__efivars) {
    704		up(&efivars_lock);
    705		return -EINVAL;
    706	}
    707
    708	status = check_var_size_nonblocking(attributes,
    709					    size + ucs2_strsize(name, 1024));
    710	if (status != EFI_SUCCESS) {
    711		up(&efivars_lock);
    712		return -ENOSPC;
    713	}
    714
    715	ops = __efivars->ops;
    716	status = ops->set_variable_nonblocking(name, &vendor, attributes,
    717					       size, data);
    718
    719	up(&efivars_lock);
    720	return efi_status_to_err(status);
    721}
    722
    723/**
    724 * efivar_entry_set_safe - call set_variable() if enough space in firmware
    725 * @name: buffer containing the variable name
    726 * @vendor: variable vendor guid
    727 * @attributes: variable attributes
    728 * @block: can we block in this context?
    729 * @size: size of @data buffer
    730 * @data: buffer containing variable data
    731 *
    732 * Ensures there is enough free storage in the firmware for this variable, and
    733 * if so, calls set_variable(). If creating a new EFI variable, this function
    734 * is usually followed by efivar_entry_add().
    735 *
    736 * Returns 0 on success, -ENOSPC if the firmware does not have enough
    737 * space for set_variable() to succeed, or a converted EFI status code
    738 * if set_variable() fails.
    739 */
    740int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
    741			  bool block, unsigned long size, void *data)
    742{
    743	const struct efivar_operations *ops;
    744	efi_status_t status;
    745	unsigned long varsize;
    746
    747	if (!__efivars)
    748		return -EINVAL;
    749
    750	ops = __efivars->ops;
    751	if (!ops->query_variable_store)
    752		return -ENOSYS;
    753
    754	/*
    755	 * If the EFI variable backend provides a non-blocking
    756	 * ->set_variable() operation and we're in a context where we
    757	 * cannot block, then we need to use it to avoid live-locks,
    758	 * since the implication is that the regular ->set_variable()
    759	 * will block.
    760	 *
    761	 * If no ->set_variable_nonblocking() is provided then
    762	 * ->set_variable() is assumed to be non-blocking.
    763	 */
    764	if (!block && ops->set_variable_nonblocking)
    765		return efivar_entry_set_nonblocking(name, vendor, attributes,
    766						    size, data);
    767
    768	varsize = size + ucs2_strsize(name, 1024);
    769	if (!block) {
    770		if (down_trylock(&efivars_lock))
    771			return -EBUSY;
    772		status = check_var_size_nonblocking(attributes, varsize);
    773	} else {
    774		if (down_interruptible(&efivars_lock))
    775			return -EINTR;
    776		status = check_var_size(attributes, varsize);
    777	}
    778
    779	if (status != EFI_SUCCESS) {
    780		up(&efivars_lock);
    781		return -ENOSPC;
    782	}
    783
    784	status = ops->set_variable(name, &vendor, attributes, size, data);
    785
    786	up(&efivars_lock);
    787
    788	return efi_status_to_err(status);
    789}
    790EXPORT_SYMBOL_GPL(efivar_entry_set_safe);
    791
    792/**
    793 * efivar_entry_find - search for an entry
    794 * @name: the EFI variable name
    795 * @guid: the EFI variable vendor's guid
    796 * @head: head of the variable list
    797 * @remove: should we remove the entry from the list?
    798 *
    799 * Search for an entry on the variable list that has the EFI variable
    800 * name @name and vendor guid @guid. If an entry is found on the list
    801 * and @remove is true, the entry is removed from the list.
    802 *
    803 * The caller MUST call efivar_entry_iter_begin() and
    804 * efivar_entry_iter_end() before and after the invocation of this
    805 * function, respectively.
    806 *
    807 * Returns the entry if found on the list, %NULL otherwise.
    808 */
    809struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
    810				       struct list_head *head, bool remove)
    811{
    812	struct efivar_entry *entry, *n;
    813	int strsize1, strsize2;
    814	bool found = false;
    815
    816	list_for_each_entry_safe(entry, n, head, list) {
    817		strsize1 = ucs2_strsize(name, 1024);
    818		strsize2 = ucs2_strsize(entry->var.VariableName, 1024);
    819		if (strsize1 == strsize2 &&
    820		    !memcmp(name, &(entry->var.VariableName), strsize1) &&
    821		    !efi_guidcmp(guid, entry->var.VendorGuid)) {
    822			found = true;
    823			break;
    824		}
    825	}
    826
    827	if (!found)
    828		return NULL;
    829
    830	if (remove) {
    831		if (entry->scanning) {
    832			/*
    833			 * The entry will be deleted
    834			 * after scanning is completed.
    835			 */
    836			entry->deleting = true;
    837		} else
    838			list_del(&entry->list);
    839	}
    840
    841	return entry;
    842}
    843EXPORT_SYMBOL_GPL(efivar_entry_find);
    844
    845/**
    846 * efivar_entry_size - obtain the size of a variable
    847 * @entry: entry for this variable
    848 * @size: location to store the variable's size
    849 */
    850int efivar_entry_size(struct efivar_entry *entry, unsigned long *size)
    851{
    852	const struct efivar_operations *ops;
    853	efi_status_t status;
    854
    855	*size = 0;
    856
    857	if (down_interruptible(&efivars_lock))
    858		return -EINTR;
    859	if (!__efivars) {
    860		up(&efivars_lock);
    861		return -EINVAL;
    862	}
    863	ops = __efivars->ops;
    864	status = ops->get_variable(entry->var.VariableName,
    865				   &entry->var.VendorGuid, NULL, size, NULL);
    866	up(&efivars_lock);
    867
    868	if (status != EFI_BUFFER_TOO_SMALL)
    869		return efi_status_to_err(status);
    870
    871	return 0;
    872}
    873EXPORT_SYMBOL_GPL(efivar_entry_size);
    874
    875/**
    876 * __efivar_entry_get - call get_variable()
    877 * @entry: read data for this variable
    878 * @attributes: variable attributes
    879 * @size: size of @data buffer
    880 * @data: buffer to store variable data
    881 *
    882 * The caller MUST call efivar_entry_iter_begin() and
    883 * efivar_entry_iter_end() before and after the invocation of this
    884 * function, respectively.
    885 */
    886int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
    887		       unsigned long *size, void *data)
    888{
    889	efi_status_t status;
    890
    891	if (!__efivars)
    892		return -EINVAL;
    893
    894	status = __efivars->ops->get_variable(entry->var.VariableName,
    895					      &entry->var.VendorGuid,
    896					      attributes, size, data);
    897
    898	return efi_status_to_err(status);
    899}
    900EXPORT_SYMBOL_GPL(__efivar_entry_get);
    901
    902/**
    903 * efivar_entry_get - call get_variable()
    904 * @entry: read data for this variable
    905 * @attributes: variable attributes
    906 * @size: size of @data buffer
    907 * @data: buffer to store variable data
    908 */
    909int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
    910		     unsigned long *size, void *data)
    911{
    912	efi_status_t status;
    913
    914	if (down_interruptible(&efivars_lock))
    915		return -EINTR;
    916
    917	if (!__efivars) {
    918		up(&efivars_lock);
    919		return -EINVAL;
    920	}
    921
    922	status = __efivars->ops->get_variable(entry->var.VariableName,
    923					      &entry->var.VendorGuid,
    924					      attributes, size, data);
    925	up(&efivars_lock);
    926
    927	return efi_status_to_err(status);
    928}
    929EXPORT_SYMBOL_GPL(efivar_entry_get);
    930
    931/**
    932 * efivar_entry_set_get_size - call set_variable() and get new size (atomic)
    933 * @entry: entry containing variable to set and get
    934 * @attributes: attributes of variable to be written
    935 * @size: size of data buffer
    936 * @data: buffer containing data to write
    937 * @set: did the set_variable() call succeed?
    938 *
    939 * This is a pretty special (complex) function. See efivarfs_file_write().
    940 *
    941 * Atomically call set_variable() for @entry and if the call is
    942 * successful, return the new size of the variable from get_variable()
    943 * in @size. The success of set_variable() is indicated by @set.
    944 *
    945 * Returns 0 on success, -EINVAL if the variable data is invalid,
    946 * -ENOSPC if the firmware does not have enough available space, or a
    947 * converted EFI status code if either of set_variable() or
    948 * get_variable() fail.
    949 *
    950 * If the EFI variable does not exist when calling set_variable()
    951 * (EFI_NOT_FOUND), @entry is removed from the variable list.
    952 */
    953int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
    954			      unsigned long *size, void *data, bool *set)
    955{
    956	const struct efivar_operations *ops;
    957	efi_char16_t *name = entry->var.VariableName;
    958	efi_guid_t *vendor = &entry->var.VendorGuid;
    959	efi_status_t status;
    960	int err;
    961
    962	*set = false;
    963
    964	if (efivar_validate(*vendor, name, data, *size) == false)
    965		return -EINVAL;
    966
    967	/*
    968	 * The lock here protects the get_variable call, the conditional
    969	 * set_variable call, and removal of the variable from the efivars
    970	 * list (in the case of an authenticated delete).
    971	 */
    972	if (down_interruptible(&efivars_lock))
    973		return -EINTR;
    974
    975	if (!__efivars) {
    976		err = -EINVAL;
    977		goto out;
    978	}
    979
    980	/*
    981	 * Ensure that the available space hasn't shrunk below the safe level
    982	 */
    983	status = check_var_size(attributes, *size + ucs2_strsize(name, 1024));
    984	if (status != EFI_SUCCESS) {
    985		if (status != EFI_UNSUPPORTED) {
    986			err = efi_status_to_err(status);
    987			goto out;
    988		}
    989
    990		if (*size > 65536) {
    991			err = -ENOSPC;
    992			goto out;
    993		}
    994	}
    995
    996	ops = __efivars->ops;
    997
    998	status = ops->set_variable(name, vendor, attributes, *size, data);
    999	if (status != EFI_SUCCESS) {
   1000		err = efi_status_to_err(status);
   1001		goto out;
   1002	}
   1003
   1004	*set = true;
   1005
   1006	/*
   1007	 * Writing to the variable may have caused a change in size (which
   1008	 * could either be an append or an overwrite), or the variable to be
   1009	 * deleted. Perform a GetVariable() so we can tell what actually
   1010	 * happened.
   1011	 */
   1012	*size = 0;
   1013	status = ops->get_variable(entry->var.VariableName,
   1014				   &entry->var.VendorGuid,
   1015				   NULL, size, NULL);
   1016
   1017	if (status == EFI_NOT_FOUND)
   1018		efivar_entry_list_del_unlock(entry);
   1019	else
   1020		up(&efivars_lock);
   1021
   1022	if (status && status != EFI_BUFFER_TOO_SMALL)
   1023		return efi_status_to_err(status);
   1024
   1025	return 0;
   1026
   1027out:
   1028	up(&efivars_lock);
   1029	return err;
   1030
   1031}
   1032EXPORT_SYMBOL_GPL(efivar_entry_set_get_size);
   1033
   1034/**
   1035 * efivar_entry_iter_begin - begin iterating the variable list
   1036 *
   1037 * Lock the variable list to prevent entry insertion and removal until
   1038 * efivar_entry_iter_end() is called. This function is usually used in
   1039 * conjunction with __efivar_entry_iter() or efivar_entry_iter().
   1040 */
   1041int efivar_entry_iter_begin(void)
   1042{
   1043	return down_interruptible(&efivars_lock);
   1044}
   1045EXPORT_SYMBOL_GPL(efivar_entry_iter_begin);
   1046
   1047/**
   1048 * efivar_entry_iter_end - finish iterating the variable list
   1049 *
   1050 * Unlock the variable list and allow modifications to the list again.
   1051 */
   1052void efivar_entry_iter_end(void)
   1053{
   1054	up(&efivars_lock);
   1055}
   1056EXPORT_SYMBOL_GPL(efivar_entry_iter_end);
   1057
   1058/**
   1059 * __efivar_entry_iter - iterate over variable list
   1060 * @func: callback function
   1061 * @head: head of the variable list
   1062 * @data: function-specific data to pass to callback
   1063 * @prev: entry to begin iterating from
   1064 *
   1065 * Iterate over the list of EFI variables and call @func with every
   1066 * entry on the list. It is safe for @func to remove entries in the
   1067 * list via efivar_entry_delete().
   1068 *
   1069 * You MUST call efivar_entry_iter_begin() before this function, and
   1070 * efivar_entry_iter_end() afterwards.
   1071 *
   1072 * It is possible to begin iteration from an arbitrary entry within
   1073 * the list by passing @prev. @prev is updated on return to point to
   1074 * the last entry passed to @func. To begin iterating from the
   1075 * beginning of the list @prev must be %NULL.
   1076 *
   1077 * The restrictions for @func are the same as documented for
   1078 * efivar_entry_iter().
   1079 */
   1080int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
   1081			struct list_head *head, void *data,
   1082			struct efivar_entry **prev)
   1083{
   1084	struct efivar_entry *entry, *n;
   1085	int err = 0;
   1086
   1087	if (!prev || !*prev) {
   1088		list_for_each_entry_safe(entry, n, head, list) {
   1089			err = func(entry, data);
   1090			if (err)
   1091				break;
   1092		}
   1093
   1094		if (prev)
   1095			*prev = entry;
   1096
   1097		return err;
   1098	}
   1099
   1100
   1101	list_for_each_entry_safe_continue((*prev), n, head, list) {
   1102		err = func(*prev, data);
   1103		if (err)
   1104			break;
   1105	}
   1106
   1107	return err;
   1108}
   1109EXPORT_SYMBOL_GPL(__efivar_entry_iter);
   1110
   1111/**
   1112 * efivar_entry_iter - iterate over variable list
   1113 * @func: callback function
   1114 * @head: head of variable list
   1115 * @data: function-specific data to pass to callback
   1116 *
   1117 * Iterate over the list of EFI variables and call @func with every
   1118 * entry on the list. It is safe for @func to remove entries in the
   1119 * list via efivar_entry_delete() while iterating.
   1120 *
   1121 * Some notes for the callback function:
   1122 *  - a non-zero return value indicates an error and terminates the loop
   1123 *  - @func is called from atomic context
   1124 */
   1125int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
   1126		      struct list_head *head, void *data)
   1127{
   1128	int err = 0;
   1129
   1130	err = efivar_entry_iter_begin();
   1131	if (err)
   1132		return err;
   1133	err = __efivar_entry_iter(func, head, data, NULL);
   1134	efivar_entry_iter_end();
   1135
   1136	return err;
   1137}
   1138EXPORT_SYMBOL_GPL(efivar_entry_iter);
   1139
   1140/**
   1141 * efivars_kobject - get the kobject for the registered efivars
   1142 *
   1143 * If efivars_register() has not been called we return NULL,
   1144 * otherwise return the kobject used at registration time.
   1145 */
   1146struct kobject *efivars_kobject(void)
   1147{
   1148	if (!__efivars)
   1149		return NULL;
   1150
   1151	return __efivars->kobject;
   1152}
   1153EXPORT_SYMBOL_GPL(efivars_kobject);
   1154
   1155/**
   1156 * efivars_register - register an efivars
   1157 * @efivars: efivars to register
   1158 * @ops: efivars operations
   1159 * @kobject: @efivars-specific kobject
   1160 *
   1161 * Only a single efivars can be registered at any time.
   1162 */
   1163int efivars_register(struct efivars *efivars,
   1164		     const struct efivar_operations *ops,
   1165		     struct kobject *kobject)
   1166{
   1167	if (down_interruptible(&efivars_lock))
   1168		return -EINTR;
   1169
   1170	efivars->ops = ops;
   1171	efivars->kobject = kobject;
   1172
   1173	__efivars = efivars;
   1174
   1175	pr_info("Registered efivars operations\n");
   1176
   1177	up(&efivars_lock);
   1178
   1179	return 0;
   1180}
   1181EXPORT_SYMBOL_GPL(efivars_register);
   1182
   1183/**
   1184 * efivars_unregister - unregister an efivars
   1185 * @efivars: efivars to unregister
   1186 *
   1187 * The caller must have already removed every entry from the list,
   1188 * failure to do so is an error.
   1189 */
   1190int efivars_unregister(struct efivars *efivars)
   1191{
   1192	int rv;
   1193
   1194	if (down_interruptible(&efivars_lock))
   1195		return -EINTR;
   1196
   1197	if (!__efivars) {
   1198		printk(KERN_ERR "efivars not registered\n");
   1199		rv = -EINVAL;
   1200		goto out;
   1201	}
   1202
   1203	if (__efivars != efivars) {
   1204		rv = -EINVAL;
   1205		goto out;
   1206	}
   1207
   1208	pr_info("Unregistered efivars operations\n");
   1209	__efivars = NULL;
   1210
   1211	rv = 0;
   1212out:
   1213	up(&efivars_lock);
   1214	return rv;
   1215}
   1216EXPORT_SYMBOL_GPL(efivars_unregister);
   1217
   1218int efivar_supports_writes(void)
   1219{
   1220	return __efivars && __efivars->ops->set_variable;
   1221}
   1222EXPORT_SYMBOL_GPL(efivar_supports_writes);