diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2020-08-07 17:47:13 +0200 |
---|---|---|
committer | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2020-08-08 19:03:24 +0200 |
commit | 1064d04920beba5564c84fde1993dd39c809ed49 (patch) | |
tree | ff82f9fd5ef885e6f2f9d567cacf882c8706ca44 /cmd | |
parent | dd92aad81c8e3f3adaeaf0ca793fbfa06edec712 (diff) |
efi_loader: factor out efi_set_load_options()
The bootefi bootmgr command has to set the load options for a loaded image
from the value of BootXXXX variable. If the boot manager is not used, the
value is set from the environment variable bootargs (or efi_selftest).
Factor out a common function efi_set_load_options().
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/bootefi.c | 55 |
1 files changed, 19 insertions, 36 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 8154efde52..5523405e13 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -31,55 +31,37 @@ static struct efi_device_path *bootefi_image_path; static struct efi_device_path *bootefi_device_path; /** - * Set the load options of an image from an environment variable. + * efi_env_set_load_options() - set load options from environment variable * * @handle: the image handle * @env_var: name of the environment variable * @load_options: pointer to load options (output) * Return: status code */ -static efi_status_t set_load_options(efi_handle_t handle, const char *env_var, - u16 **load_options) +static efi_status_t efi_env_set_load_options(efi_handle_t handle, + const char *env_var, + u16 **load_options) { - struct efi_loaded_image *loaded_image_info; - size_t size; const char *env = env_get(env_var); + size_t size; u16 *pos; efi_status_t ret; *load_options = NULL; - ret = EFI_CALL(systab.boottime->open_protocol( - handle, - &efi_guid_loaded_image, - (void **)&loaded_image_info, - efi_root, NULL, - EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)); - if (ret != EFI_SUCCESS) - return EFI_INVALID_PARAMETER; - - loaded_image_info->load_options = NULL; - loaded_image_info->load_options_size = 0; if (!env) - goto out; - - size = utf8_utf16_strlen(env) + 1; - loaded_image_info->load_options = calloc(size, sizeof(u16)); - if (!loaded_image_info->load_options) { - log_err("ERROR: Out of memory\n"); - EFI_CALL(systab.boottime->close_protocol(handle, - &efi_guid_loaded_image, - efi_root, NULL)); + return EFI_SUCCESS; + size = sizeof(u16) * (utf8_utf16_strlen(env) + 1); + pos = calloc(size, 1); + if (!pos) return EFI_OUT_OF_RESOURCES; - } - pos = loaded_image_info->load_options; *load_options = pos; utf8_utf16_strcpy(&pos, env); - loaded_image_info->load_options_size = size * 2; - -out: - return EFI_CALL(systab.boottime->close_protocol(handle, - &efi_guid_loaded_image, - efi_root, NULL)); + ret = efi_set_load_options(handle, size, *load_options); + if (ret != EFI_SUCCESS) { + free(*load_options); + *load_options = NULL; + } + return ret; } #if !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) @@ -336,7 +318,7 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle) u16 *load_options; /* Transfer environment variable as load options */ - ret = set_load_options(handle, "bootargs", &load_options); + ret = efi_env_set_load_options(handle, "bootargs", &load_options); if (ret != EFI_SUCCESS) return ret; @@ -509,8 +491,9 @@ static efi_status_t bootefi_run_prepare(const char *load_options_path, return ret; /* Transfer environment variable as load options */ - return set_load_options((efi_handle_t)*image_objp, load_options_path, - &load_options); + return efi_env_set_load_options((efi_handle_t)*image_objp, + load_options_path, + &load_options); } /** |