if (!fops->query_variable_store)
status = EFI_UNSUPPORTED; else
status = fops->query_variable_store(attributes, size,
nonblocking); if (status == EFI_UNSUPPORTED) return (size <= SZ_64K) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES; return status;
}
/** * efivar_is_available - check if efivars is available * * @return true iff evivars is currently registered
*/ bool efivar_is_available(void)
{ return __efivars != NULL;
}
EXPORT_SYMBOL_GPL(efivar_is_available);
/** * efivars_register - register an efivars * @efivars: efivars to register * @ops: efivars operations * * Only a single efivars can be registered at any time.
*/ int efivars_register(struct efivars *efivars, conststruct efivar_operations *ops)
{ int rv; int event;
if (down_interruptible(&efivars_lock)) return -EINTR;
/** * efivars_unregister - unregister an efivars * @efivars: efivars to unregister * * The caller must have already removed every entry from the list, * failure to do so is an error.
*/ int efivars_unregister(struct efivars *efivars)
{ int rv;
if (down_interruptible(&efivars_lock)) return -EINTR;
if (!__efivars) {
pr_err("efivars not registered\n");
rv = -EINVAL; goto out;
}
/* * efivar_lock() - obtain the efivar lock, wait for it if needed * @return 0 on success, error code on failure
*/ int efivar_lock(void)
{ if (down_interruptible(&efivars_lock)) return -EINTR; if (!__efivars->ops) {
up(&efivars_lock); return -ENODEV;
} return 0;
}
EXPORT_SYMBOL_NS_GPL(efivar_lock, "EFIVAR");
/* * efivar_lock() - obtain the efivar lock if it is free * @return 0 on success, error code on failure
*/ int efivar_trylock(void)
{ if (down_trylock(&efivars_lock)) return -EBUSY; if (!__efivars->ops) {
up(&efivars_lock); return -ENODEV;
} return 0;
}
EXPORT_SYMBOL_NS_GPL(efivar_trylock, "EFIVAR");
/* * efivar_get_variable() - retrieve a variable identified by name/vendor * * Must be called with efivars_lock held.
*/
efi_status_t efivar_get_variable(efi_char16_t *name, efi_guid_t *vendor,
u32 *attr, unsignedlong *size, void *data)
{ return __efivars->ops->get_variable(name, vendor, attr, size, data);
}
EXPORT_SYMBOL_NS_GPL(efivar_get_variable, "EFIVAR");
/* * efivar_get_next_variable() - enumerate the next name/vendor pair * * Must be called with efivars_lock held.
*/
efi_status_t efivar_get_next_variable(unsignedlong *name_size,
efi_char16_t *name, efi_guid_t *vendor)
{ return __efivars->ops->get_next_variable(name_size, name, vendor);
}
EXPORT_SYMBOL_NS_GPL(efivar_get_next_variable, "EFIVAR");
/* * efivar_set_variable_locked() - set a variable identified by name/vendor * * Must be called with efivars_lock held. If @nonblocking is set, it will use * non-blocking primitives so it is guaranteed not to sleep.
*/
efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
u32 attr, unsignedlong data_size, void *data, bool nonblocking)
{
efi_set_variable_t *setvar;
efi_status_t status;
if (data_size > 0) {
status = check_var_size(nonblocking, attr,
data_size + ucs2_strsize(name, EFI_VAR_NAME_LEN)); if (status != EFI_SUCCESS) return status;
}
/* * If no _nonblocking variant exists, the ordinary one * is assumed to be non-blocking.
*/
setvar = __efivars->ops->set_variable_nonblocking; if (!setvar || !nonblocking)
setvar = __efivars->ops->set_variable;
/* * efivar_set_variable() - set a variable identified by name/vendor * * Can be called without holding the efivars_lock. Will sleep on obtaining the * lock, or on obtaining other locks that are needed in order to complete the * call.
*/
efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,
u32 attr, unsignedlong data_size, void *data)
{
efi_status_t status;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.