Merge tag 'efi-2024-07-rc2' of https://source.denx.de/u-boot/custodians/u-boot-efi
Pull request efi-2024-07-rc2 Documentation: * correct description of 'env print -e' UEFI: * remove superfluous efi_restore_gd after EFI_CALL * terminate efidebug test bootmgr early on error * do not install device-tree if bootmgr fails * pass GUID by address to efi_dp_from_lo * remove dead code in efi_var_mem_init() * enable QueryVariableInfo at runtime for file backed variables
This commit is contained in:
@@ -107,7 +107,6 @@ static int do_efi_selftest(void)
|
||||
|
||||
/* Execute the test */
|
||||
ret = EFI_CALL(efi_selftest(&image_obj->header, &systab));
|
||||
efi_restore_gd();
|
||||
free(loaded_image_info->load_options);
|
||||
efi_free_pool(test_device_path);
|
||||
efi_free_pool(test_image_path);
|
||||
|
||||
+2
-2
@@ -1397,6 +1397,8 @@ static __maybe_unused int do_efi_test_bootmgr(struct cmd_tbl *cmdtp, int flag,
|
||||
|
||||
ret = efi_bootmgr_load(&image, &load_options);
|
||||
printf("efi_bootmgr_load() returned: %ld\n", ret & ~EFI_ERROR_MASK);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return CMD_RET_SUCCESS;
|
||||
|
||||
/* We call efi_start_image() even if error for test purpose. */
|
||||
ret = EFI_CALL(efi_start_image(image, &exit_data_size, &exit_data));
|
||||
@@ -1404,8 +1406,6 @@ static __maybe_unused int do_efi_test_bootmgr(struct cmd_tbl *cmdtp, int flag,
|
||||
if (ret && exit_data)
|
||||
efi_free_pool(exit_data);
|
||||
|
||||
efi_restore_gd();
|
||||
|
||||
free(load_options);
|
||||
return CMD_RET_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -226,7 +226,7 @@ in UEFI variables.
|
||||
\-a
|
||||
all U-Boot environment, when 'name' is absent.
|
||||
\-e
|
||||
print UEFI variables, all by default when 'name'.
|
||||
print UEFI variables, all by default if 'name' is not provided.
|
||||
\-guid guid
|
||||
print only the UEFI variables matching this GUID (any by default)
|
||||
with guid format = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
|
||||
@@ -372,6 +372,10 @@ info
|
||||
load
|
||||
CONFIG_CMD_NVEDIT_LOAD
|
||||
|
||||
print
|
||||
CONFIG_CMD_NVEDIT_EFI for UEFI variables support ('-e' option),
|
||||
additionally CONFIG_HEXDUMP to display content of UEFI variables
|
||||
|
||||
run
|
||||
CONFIG_CMD_RUN
|
||||
|
||||
@@ -381,5 +385,5 @@ save
|
||||
select
|
||||
CONFIG_CMD_NVEDIT_SELECT
|
||||
|
||||
set, print
|
||||
CONFIG_CMD_NVEDIT_EFI for '-e' option
|
||||
set
|
||||
CONFIG_CMD_NVEDIT_EFI for UEFI variables support ('-e' option)
|
||||
|
||||
@@ -743,7 +743,7 @@ efi_status_t EFIAPI efi_register_protocol_notify(const efi_guid_t *protocol,
|
||||
efi_status_t efi_file_size(struct efi_file_handle *fh, efi_uintn_t *size);
|
||||
|
||||
/* get a device path from a Boot#### option */
|
||||
struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t guid);
|
||||
struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t *guid);
|
||||
|
||||
/* get len, string (used in u-boot crypto from a guid */
|
||||
const char *guid_to_sha_str(const efi_guid_t *guid);
|
||||
|
||||
@@ -147,6 +147,17 @@ void *efi_st_get_config_table(const efi_guid_t *guid);
|
||||
*/
|
||||
u16 efi_st_get_key(void);
|
||||
|
||||
/**
|
||||
* efi_st_query_variable_common - Common variable tests for boottime/runtime
|
||||
*
|
||||
* @runtime: Pointer to services table
|
||||
* @attributes: Attributes used
|
||||
*
|
||||
* Return: EFI_ST_SUCCESS/FAILURE
|
||||
*/
|
||||
int efi_st_query_variable_common(struct efi_runtime_services *runtime,
|
||||
u32 attributes);
|
||||
|
||||
/**
|
||||
* struct efi_unit_test - EFI unit test
|
||||
*
|
||||
|
||||
@@ -613,9 +613,12 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle,
|
||||
void *load_option;
|
||||
efi_uintn_t size;
|
||||
efi_status_t ret;
|
||||
u32 attributes;
|
||||
|
||||
*handle = NULL;
|
||||
*load_options = NULL;
|
||||
|
||||
efi_create_indexed_name(varname, sizeof(varname), "Boot", n);
|
||||
|
||||
load_option = efi_get_var(varname, &efi_global_variable_guid, &size);
|
||||
if (!load_option)
|
||||
return EFI_LOAD_ERROR;
|
||||
@@ -626,55 +629,54 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (lo.attributes & LOAD_OPTION_ACTIVE) {
|
||||
u32 attributes;
|
||||
|
||||
log_debug("trying to load \"%ls\" from %pD\n", lo.label,
|
||||
lo.file_path);
|
||||
|
||||
if (EFI_DP_TYPE(lo.file_path, MEDIA_DEVICE, FILE_PATH)) {
|
||||
/* file_path doesn't contain a device path */
|
||||
ret = try_load_from_short_path(lo.file_path, handle);
|
||||
} else if (EFI_DP_TYPE(lo.file_path, MESSAGING_DEVICE, MSG_URI)) {
|
||||
if (IS_ENABLED(CONFIG_EFI_HTTP_BOOT))
|
||||
ret = try_load_from_uri_path(
|
||||
(struct efi_device_path_uri *)lo.file_path,
|
||||
lo.label, handle);
|
||||
else
|
||||
ret = EFI_LOAD_ERROR;
|
||||
} else {
|
||||
ret = try_load_from_media(lo.file_path, handle);
|
||||
}
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_warning("Loading %ls '%ls' failed\n",
|
||||
varname, lo.label);
|
||||
goto error;
|
||||
}
|
||||
|
||||
attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS;
|
||||
ret = efi_set_variable_int(u"BootCurrent",
|
||||
&efi_global_variable_guid,
|
||||
attributes, sizeof(n), &n, false);
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto unload;
|
||||
/* try to register load file2 for initrd's */
|
||||
if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) {
|
||||
ret = efi_initrd_register();
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto unload;
|
||||
}
|
||||
|
||||
log_info("Booting: %ls\n", lo.label);
|
||||
} else {
|
||||
if (!(lo.attributes & LOAD_OPTION_ACTIVE)) {
|
||||
ret = EFI_LOAD_ERROR;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Set load options */
|
||||
log_debug("trying to load \"%ls\" from %pD\n", lo.label, lo.file_path);
|
||||
|
||||
if (EFI_DP_TYPE(lo.file_path, MEDIA_DEVICE, FILE_PATH)) {
|
||||
/* file_path doesn't contain a device path */
|
||||
ret = try_load_from_short_path(lo.file_path, handle);
|
||||
} else if (EFI_DP_TYPE(lo.file_path, MESSAGING_DEVICE, MSG_URI)) {
|
||||
if (IS_ENABLED(CONFIG_EFI_HTTP_BOOT))
|
||||
ret = try_load_from_uri_path(
|
||||
(struct efi_device_path_uri *)lo.file_path,
|
||||
lo.label, handle);
|
||||
else
|
||||
ret = EFI_LOAD_ERROR;
|
||||
} else {
|
||||
ret = try_load_from_media(lo.file_path, handle);
|
||||
}
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_warning("Loading %ls '%ls' failed\n",
|
||||
varname, lo.label);
|
||||
goto error;
|
||||
}
|
||||
|
||||
attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS;
|
||||
ret = efi_set_variable_int(u"BootCurrent", &efi_global_variable_guid,
|
||||
attributes, sizeof(n), &n, false);
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto error;
|
||||
|
||||
/* try to register load file2 for initrd's */
|
||||
if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) {
|
||||
ret = efi_initrd_register();
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto error;
|
||||
}
|
||||
|
||||
log_info("Booting: %ls\n", lo.label);
|
||||
|
||||
/* Ignore the optional data in auto-generated boot options */
|
||||
if (size >= sizeof(efi_guid_t) &&
|
||||
!guidcmp(lo.optional_data, &efi_guid_bootmenu_auto_generated))
|
||||
size = 0;
|
||||
|
||||
/* Set optional data in loaded file protocol */
|
||||
if (size) {
|
||||
*load_options = malloc(size);
|
||||
if (!*load_options) {
|
||||
@@ -683,18 +685,15 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle,
|
||||
}
|
||||
memcpy(*load_options, lo.optional_data, size);
|
||||
ret = efi_set_load_options(*handle, size, *load_options);
|
||||
} else {
|
||||
*load_options = NULL;
|
||||
if (ret != EFI_SUCCESS)
|
||||
free(load_options);
|
||||
}
|
||||
|
||||
error:
|
||||
free(load_option);
|
||||
|
||||
return ret;
|
||||
|
||||
unload:
|
||||
if (EFI_CALL(efi_unload_image(*handle)) != EFI_SUCCESS)
|
||||
if (ret != EFI_SUCCESS && *handle &&
|
||||
EFI_CALL(efi_unload_image(*handle)) != EFI_SUCCESS)
|
||||
log_err("Unloading image failed\n");
|
||||
|
||||
free(load_option);
|
||||
|
||||
return ret;
|
||||
@@ -1210,15 +1209,21 @@ efi_status_t efi_bootmgr_run(void *fdt)
|
||||
return CMD_RET_FAILURE;
|
||||
}
|
||||
|
||||
ret = efi_install_fdt(fdt);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
|
||||
ret = efi_bootmgr_load(&handle, &load_options);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_notice("EFI boot manager: Cannot load any image\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = efi_install_fdt(fdt);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
if (EFI_CALL(efi_unload_image(handle)) == EFI_SUCCESS)
|
||||
free(load_options);
|
||||
else
|
||||
log_err("Unloading image failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return do_bootefi_exec(handle, load_options);
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ int efi_dp_match(const struct efi_device_path *a,
|
||||
* See UEFI spec, section 3.1.2 for "short-form device path".
|
||||
*
|
||||
* @dp: original device-path
|
||||
* @Return: shortened device-path or NULL
|
||||
* Return: shortened device-path or NULL
|
||||
*/
|
||||
struct efi_device_path *efi_dp_shorten(struct efi_device_path *dp)
|
||||
{
|
||||
|
||||
@@ -72,7 +72,7 @@ out:
|
||||
*
|
||||
* Return: device path or NULL. Caller must free the returned value
|
||||
*/
|
||||
struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t guid)
|
||||
struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t *guid)
|
||||
{
|
||||
struct efi_load_option lo;
|
||||
void *var_value;
|
||||
@@ -92,7 +92,7 @@ struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t guid)
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto err;
|
||||
|
||||
return efi_dp_from_lo(&lo, &guid);
|
||||
return efi_dp_from_lo(&lo, guid);
|
||||
|
||||
err:
|
||||
free(var_value);
|
||||
@@ -544,8 +544,6 @@ efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
|
||||
}
|
||||
}
|
||||
|
||||
efi_restore_gd();
|
||||
|
||||
out:
|
||||
free(load_options);
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ static efi_status_t get_initrd_fp(struct efi_device_path **initrd_fp)
|
||||
* We can then use this specific return value and not install the
|
||||
* protocol, while allowing the boot to continue
|
||||
*/
|
||||
dp = efi_get_dp_from_boot(efi_lf2_initrd_guid);
|
||||
dp = efi_get_dp_from_boot(&efi_lf2_initrd_guid);
|
||||
if (!dp)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
|
||||
@@ -129,6 +129,10 @@ efi_status_t efi_init_runtime_supported(void)
|
||||
EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP |
|
||||
EFI_RT_SUPPORTED_CONVERT_POINTER;
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_VARIABLE_FILE_STORE))
|
||||
rt_table->runtime_services_supported |=
|
||||
EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO;
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_RT_VOLATILE_STORE)) {
|
||||
u8 s = 0;
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* UEFI runtime variable services
|
||||
*
|
||||
@@ -163,11 +162,6 @@ efi_status_t EFIAPI efi_query_variable_info(
|
||||
EFI_ENTRY("%x %p %p %p", attributes, maximum_variable_storage_size,
|
||||
remaining_variable_storage_size, maximum_variable_size);
|
||||
|
||||
if (!maximum_variable_storage_size ||
|
||||
!remaining_variable_storage_size ||
|
||||
!maximum_variable_size)
|
||||
return EFI_EXIT(EFI_INVALID_PARAMETER);
|
||||
|
||||
ret = efi_query_variable_info_int(attributes,
|
||||
maximum_variable_storage_size,
|
||||
remaining_variable_storage_size,
|
||||
|
||||
@@ -232,8 +232,6 @@ efi_status_t efi_var_mem_init(void)
|
||||
efi_var_buf->length = (uintptr_t)efi_var_buf->var -
|
||||
(uintptr_t)efi_var_buf;
|
||||
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
ret = efi_create_event(EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, TPL_CALLBACK,
|
||||
efi_var_mem_notify_virtual_address_map, NULL,
|
||||
NULL, &event);
|
||||
|
||||
@@ -406,12 +406,15 @@ efi_status_t efi_set_variable_int(const u16 *variable_name,
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
efi_status_t efi_query_variable_info_int(u32 attributes,
|
||||
u64 *maximum_variable_storage_size,
|
||||
u64 *remaining_variable_storage_size,
|
||||
u64 *maximum_variable_size)
|
||||
efi_status_t __efi_runtime
|
||||
efi_query_variable_info_int(u32 attributes,
|
||||
u64 *maximum_variable_storage_size,
|
||||
u64 *remaining_variable_storage_size,
|
||||
u64 *maximum_variable_size)
|
||||
{
|
||||
if (attributes == 0)
|
||||
if (!maximum_variable_storage_size ||
|
||||
!remaining_variable_storage_size ||
|
||||
!maximum_variable_size || !attributes)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
/* EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is deprecated */
|
||||
@@ -460,7 +463,17 @@ static efi_status_t __efi_runtime EFIAPI efi_query_variable_info_runtime(
|
||||
u64 *remaining_variable_storage_size,
|
||||
u64 *maximum_variable_size)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
if (!(attributes & EFI_VARIABLE_RUNTIME_ACCESS))
|
||||
return EFI_INVALID_PARAMETER;
|
||||
if ((attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
|
||||
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS |
|
||||
EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS)))
|
||||
return EFI_UNSUPPORTED;
|
||||
|
||||
return efi_query_variable_info_int(attributes,
|
||||
maximum_variable_storage_size,
|
||||
remaining_variable_storage_size,
|
||||
maximum_variable_size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -873,6 +873,11 @@ efi_status_t efi_query_variable_info_int(u32 attributes,
|
||||
efi_status_t ret;
|
||||
u8 *comm_buf;
|
||||
|
||||
if (!max_variable_storage_size ||
|
||||
!remain_variable_storage_size ||
|
||||
!max_variable_size || !attributes)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
payload_size = sizeof(*mm_query_info);
|
||||
comm_buf = setup_mm_hdr((void **)&mm_query_info, payload_size,
|
||||
SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO,
|
||||
|
||||
@@ -45,6 +45,7 @@ efi_selftest_textinputex.o \
|
||||
efi_selftest_textoutput.o \
|
||||
efi_selftest_tpl.o \
|
||||
efi_selftest_util.o \
|
||||
efi_selftest_variables_common.o \
|
||||
efi_selftest_variables.o \
|
||||
efi_selftest_variables_runtime.o \
|
||||
efi_selftest_watchdog.o
|
||||
|
||||
@@ -51,15 +51,12 @@ static int execute(void)
|
||||
u16 varname[EFI_ST_MAX_VARNAME_SIZE];
|
||||
int flag;
|
||||
efi_guid_t guid;
|
||||
u64 max_storage, rem_storage, max_size;
|
||||
int test_ret;
|
||||
|
||||
ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
efi_st_todo("QueryVariableInfo failed\n");
|
||||
} else if (!max_storage || !rem_storage || !max_size) {
|
||||
efi_st_error("QueryVariableInfo: wrong info\n");
|
||||
test_ret = efi_st_query_variable_common(runtime,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS);
|
||||
if (test_ret != EFI_ST_SUCCESS) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
/* Set variable 0 */
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* efi_selftest_variables_runtime
|
||||
*
|
||||
* Copyright (c) 2024 Ilias Apalodimas <ilias.apalodimas@linaro.org>
|
||||
*
|
||||
* This unit test checks common service across boottime/runtime
|
||||
*/
|
||||
|
||||
#include <efi_selftest.h>
|
||||
|
||||
#define EFI_INVALID_ATTR BIT(30)
|
||||
|
||||
int efi_st_query_variable_common(struct efi_runtime_services *runtime,
|
||||
u32 attributes)
|
||||
{
|
||||
efi_status_t ret;
|
||||
u64 max_storage, rem_storage, max_size;
|
||||
|
||||
ret = runtime->query_variable_info(attributes,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
} else if (!max_storage || !rem_storage || !max_size) {
|
||||
efi_st_error("QueryVariableInfo: wrong info\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(attributes,
|
||||
NULL, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(attributes,
|
||||
&max_storage, NULL,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(attributes,
|
||||
&max_storage, &rem_storage,
|
||||
NULL);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(0, &max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(attributes |
|
||||
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
|
||||
EFI_VARIABLE_NON_VOLATILE,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_UNSUPPORTED) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
ret = runtime->query_variable_info(EFI_VARIABLE_NON_VOLATILE,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use a mix existing/non-existing attribute bits from the
|
||||
* UEFI spec
|
||||
*/
|
||||
ret = runtime->query_variable_info(attributes | EFI_INVALID_ATTR |
|
||||
EFI_VARIABLE_NON_VOLATILE,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_INVALID_PARAMETER) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
|
||||
return EFI_ST_SUCCESS;
|
||||
}
|
||||
@@ -55,14 +55,25 @@ static int execute(void)
|
||||
u16 varname[EFI_ST_MAX_VARNAME_SIZE];
|
||||
efi_guid_t guid;
|
||||
u64 max_storage, rem_storage, max_size;
|
||||
int test_ret;
|
||||
|
||||
memset(v2, 0x1, sizeof(v2));
|
||||
ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_VARIABLE_FILE_STORE)) {
|
||||
test_ret = efi_st_query_variable_common(runtime, EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS);
|
||||
if (test_ret != EFI_ST_SUCCESS) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
} else {
|
||||
ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||
&max_storage, &rem_storage,
|
||||
&max_size);
|
||||
if (ret != EFI_UNSUPPORTED) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
if (ret != EFI_UNSUPPORTED) {
|
||||
efi_st_error("QueryVariableInfo failed\n");
|
||||
return EFI_ST_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
ret = runtime->set_variable(u"efi_st_var0", &guid_vendor0,
|
||||
|
||||
@@ -62,13 +62,13 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert('\'HELLO1\' failed' in ''.join(output))
|
||||
assert('efi_start_image() returned: 26' in ''.join(output))
|
||||
assert('efi_bootmgr_load() returned: 26' in ''.join(output))
|
||||
output = u_boot_console.run_command_list([
|
||||
'efidebug boot add -b 2 HELLO2 host 0:1 /helloworld.efi -s ""',
|
||||
'efidebug boot order 2',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO2\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 2b'):
|
||||
# Test Case 2b, authenticated by db
|
||||
@@ -80,7 +80,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 2',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO2\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
output = u_boot_console.run_command_list([
|
||||
'efidebug boot order 1',
|
||||
'bootefi bootmgr'])
|
||||
@@ -108,7 +108,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 3b'):
|
||||
# Test Case 3b, rejected by dbx even if db allows
|
||||
@@ -120,7 +120,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
def test_efi_signed_image_auth4(self, u_boot_console, efi_boot_env):
|
||||
"""
|
||||
@@ -146,7 +146,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
def test_efi_signed_image_auth5(self, u_boot_console, efi_boot_env):
|
||||
"""
|
||||
@@ -196,7 +196,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 5d'):
|
||||
# Test Case 5d, rejected if both of signatures are revoked
|
||||
@@ -208,7 +208,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
# Try rejection in reverse order.
|
||||
u_boot_console.restart_uboot()
|
||||
@@ -233,7 +233,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
def test_efi_signed_image_auth6(self, u_boot_console, efi_boot_env):
|
||||
"""
|
||||
@@ -268,7 +268,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 6c'):
|
||||
# Test Case 6c, rejected by image's digest in dbx
|
||||
@@ -282,7 +282,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
def test_efi_signed_image_auth7(self, u_boot_console, efi_boot_env):
|
||||
"""
|
||||
@@ -310,7 +310,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
# sha512 of an x509 cert in dbx
|
||||
u_boot_console.restart_uboot()
|
||||
@@ -333,7 +333,7 @@ class TestEfiSignedImage(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
def test_efi_signed_image_auth8(self, u_boot_console, efi_boot_env):
|
||||
"""
|
||||
@@ -368,4 +368,4 @@ class TestEfiSignedImage(object):
|
||||
'efidebug test bootmgr'])
|
||||
assert(not 'hELLO, world!' in ''.join(output))
|
||||
assert('\'HELLO1\' failed' in ''.join(output))
|
||||
assert('efi_start_image() returned: 26' in ''.join(output))
|
||||
assert('efi_bootmgr_load() returned: 26' in ''.join(output))
|
||||
|
||||
@@ -43,7 +43,7 @@ class TestEfiSignedImageIntca(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO_a\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 1b'):
|
||||
# Test Case 1b, signed and authenticated by root CA
|
||||
@@ -74,7 +74,7 @@ class TestEfiSignedImageIntca(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO_abc\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 2b'):
|
||||
# Test Case 2b, signed and authenticated by root CA
|
||||
@@ -84,7 +84,7 @@ class TestEfiSignedImageIntca(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO_abc\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 2c'):
|
||||
# Test Case 2c, signed and authenticated by root CA
|
||||
@@ -122,7 +122,7 @@ class TestEfiSignedImageIntca(object):
|
||||
assert 'Hello, world!' in ''.join(output)
|
||||
# Or,
|
||||
# assert '\'HELLO_abc\' failed' in ''.join(output)
|
||||
# assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
# assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 3b'):
|
||||
# Test Case 3b, revoked by root CA in dbx
|
||||
@@ -132,4 +132,4 @@ class TestEfiSignedImageIntca(object):
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert '\'HELLO_abc\' failed' in ''.join(output)
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
|
||||
@@ -42,7 +42,7 @@ class TestEfiUnsignedImage(object):
|
||||
output = u_boot_console.run_command_list([
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
assert 'Hello, world!' not in ''.join(output)
|
||||
|
||||
def test_efi_unsigned_image_auth2(self, u_boot_console, efi_boot_env):
|
||||
@@ -95,7 +95,7 @@ class TestEfiUnsignedImage(object):
|
||||
output = u_boot_console.run_command_list([
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
assert 'Hello, world!' not in ''.join(output)
|
||||
|
||||
with u_boot_console.log.section('Test Case 3b'):
|
||||
@@ -113,5 +113,5 @@ class TestEfiUnsignedImage(object):
|
||||
output = u_boot_console.run_command_list([
|
||||
'efidebug boot order 1',
|
||||
'efidebug test bootmgr'])
|
||||
assert 'efi_start_image() returned: 26' in ''.join(output)
|
||||
assert 'efi_bootmgr_load() returned: 26' in ''.join(output)
|
||||
assert 'Hello, world!' not in ''.join(output)
|
||||
|
||||
Reference in New Issue
Block a user