[RFC 1/1] efi_loader: rename 'efidebug boot' 'bootefi'
AKASHI Takahiro
takahiro.akashi at linaro.org
Mon Jan 17 02:16:51 CET 2022
On Sat, Jan 15, 2022 at 01:49:07AM +0100, Heinrich Schuchardt wrote:
> The efidebug command was conceived for testing purposes.
Well, I initially implemented the command as an alternative of
"EFI shell" as the shell was not able to run on EFI U-Boot at that time.
> The manipulation of boot options does better fit to the bootefi command
> that is used to invoke the boot manager.
I believe that it would be best to have those two features
in separate commands(/applications) since the bootefi/bootmgr be focused
on booting EFI images while efidebug/EFI shell provides a kind of
user interfaces for manipulating the system.
*If* you dare to move the code to bootefi/bootmgr, I'd ask you to honor
and add my copyright to the file as "efidebug boot" feature is a core part
of efidebug. Or export sub-command functions from efidebug.c and import
them in bootefi.c.
-Takahiro Akashi
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> cmd/bootefi.c | 672 +++++++++++++++++-
> cmd/efidebug.c | 662 +----------------
> doc/develop/uefi/uefi.rst | 4 +-
> include/efi_loader.h | 2 -
> lib/efi_selftest/efi_selftest_tcg2.c | 8 +-
> .../test_efi_capsule/test_capsule_firmware.py | 12 +-
> test/py/tests/test_efi_secboot/test_signed.py | 48 +-
> .../test_efi_secboot/test_signed_intca.py | 22 +-
> .../tests/test_efi_secboot/test_unsigned.py | 22 +-
> 9 files changed, 723 insertions(+), 729 deletions(-)
>
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index 83eab0bd7f..003aa5265e 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -12,10 +12,13 @@
> #include <charset.h>
> #include <command.h>
> #include <dm.h>
> +#include <efi_load_initrd.h>
> #include <efi_loader.h>
> #include <efi_selftest.h>
> +#include <efi_variable.h>
> #include <env.h>
> #include <errno.h>
> +#include <hexdump.h>
> #include <image.h>
> #include <log.h>
> #include <malloc.h>
> @@ -47,6 +50,620 @@ static void efi_clear_bootdev(void)
> image_size = 0;
> }
>
> +/**
> + * create_initrd_dp() - Create a special device for our Boot### option
> + *
> + * @dev: Device
> + * @part: Disk partition
> + * @file: Filename
> + * Return: Pointer to the device path or ERR_PTR
> + *
> + */
> +static
> +struct efi_device_path *create_initrd_dp(const char *dev, const char *part,
> + const char *file)
> +
> +{
> + struct efi_device_path *tmp_dp = NULL, *tmp_fp = NULL;
> + struct efi_device_path *initrd_dp = NULL;
> + efi_status_t ret;
> + const struct efi_initrd_dp id_dp = {
> + .vendor = {
> + {
> + DEVICE_PATH_TYPE_MEDIA_DEVICE,
> + DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
> + sizeof(id_dp.vendor),
> + },
> + EFI_INITRD_MEDIA_GUID,
> + },
> + .end = {
> + DEVICE_PATH_TYPE_END,
> + DEVICE_PATH_SUB_TYPE_END,
> + sizeof(id_dp.end),
> + }
> + };
> +
> + ret = efi_dp_from_name(dev, part, file, &tmp_dp, &tmp_fp);
> + if (ret != EFI_SUCCESS) {
> + printf("Cannot create device path for \"%s %s\"\n", part, file);
> + goto out;
> + }
> +
> + initrd_dp = efi_dp_append((const struct efi_device_path *)&id_dp,
> + tmp_fp);
> +
> +out:
> + efi_free_pool(tmp_dp);
> + efi_free_pool(tmp_fp);
> + return initrd_dp;
> +}
> +
> +/**
> + * do_efi_boot_add() - set UEFI load option
> + *
> + * @cmdtp: Command table
> + * @flag: Command flag
> + * @argc: Number of arguments
> + * @argv: Argument array
> + * Return: CMD_RET_SUCCESS on success,
> + * CMD_RET_USAGE or CMD_RET_RET_FAILURE on failure
> + *
> + * Implement "add" sub-command. Create or change UEFI load option.
> + *
> + * booteif add -b <id> <label> <interface> <devnum>[:<part>] <file>
> + * -i <file> <interface2> <devnum2>[:<part>] <initrd>
> + * -s '<options>'
> + */
> +static int do_efi_boot_add(struct cmd_tbl *cmdtp, int flag,
> + int argc, char *const argv[])
> +{
> + int id;
> + char *endp;
> + u16 var_name16[9];
> + efi_guid_t guid;
> + size_t label_len, label_len16;
> + u16 *label;
> + struct efi_device_path *device_path = NULL, *file_path = NULL;
> + struct efi_device_path *final_fp = NULL;
> + struct efi_device_path *initrd_dp = NULL;
> + struct efi_load_option lo;
> + void *data = NULL;
> + efi_uintn_t size;
> + efi_uintn_t fp_size = 0;
> + efi_status_t ret;
> + int r = CMD_RET_SUCCESS;
> +
> + guid = efi_global_variable_guid;
> +
> + /* attributes */
> + lo.attributes = LOAD_OPTION_ACTIVE; /* always ACTIVE */
> + lo.optional_data = NULL;
> + lo.label = NULL;
> +
> + argc--;
> + argv++; /* 'add' */
> + for (; argc > 0; argc--, argv++) {
> + if (!strcmp(argv[0], "-b")) {
> + if (argc < 5 || lo.label) {
> + r = CMD_RET_USAGE;
> + goto out;
> + }
> + id = (int)hextoul(argv[1], &endp);
> + if (*endp != '\0' || id > 0xffff)
> + return CMD_RET_USAGE;
> +
> + efi_create_indexed_name(var_name16, sizeof(var_name16),
> + "Boot", id);
> +
> + /* label */
> + label_len = strlen(argv[2]);
> + label_len16 = utf8_utf16_strnlen(argv[2], label_len);
> + label = malloc((label_len16 + 1) * sizeof(u16));
> + if (!label)
> + return CMD_RET_FAILURE;
> + lo.label = label; /* label will be changed below */
> + utf8_utf16_strncpy(&label, argv[2], label_len);
> +
> + /* file path */
> + ret = efi_dp_from_name(argv[3], argv[4], argv[5],
> + &device_path, &file_path);
> + if (ret != EFI_SUCCESS) {
> + printf("Cannot create device path for \"%s %s\"\n",
> + argv[3], argv[4]);
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> + fp_size += efi_dp_size(file_path) +
> + sizeof(struct efi_device_path);
> + argc -= 5;
> + argv += 5;
> + } else if (!strcmp(argv[0], "-i")) {
> + if (argc < 3 || initrd_dp) {
> + r = CMD_RET_USAGE;
> + goto out;
> + }
> +
> + initrd_dp = create_initrd_dp(argv[1], argv[2], argv[3]);
> + if (!initrd_dp) {
> + printf("Cannot add an initrd\n");
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> + argc -= 3;
> + argv += 3;
> + fp_size += efi_dp_size(initrd_dp) +
> + sizeof(struct efi_device_path);
> + } else if (!strcmp(argv[0], "-s")) {
> + if (argc < 1 || lo.optional_data) {
> + r = CMD_RET_USAGE;
> + goto out;
> + }
> + lo.optional_data = (const u8 *)argv[1];
> + argc -= 1;
> + argv += 1;
> + } else {
> + r = CMD_RET_USAGE;
> + goto out;
> + }
> + }
> +
> + if (!file_path) {
> + printf("Missing binary\n");
> + r = CMD_RET_USAGE;
> + goto out;
> + }
> +
> + final_fp = efi_dp_concat(file_path, initrd_dp);
> + if (!final_fp) {
> + printf("Cannot create final device path\n");
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + lo.file_path = final_fp;
> + lo.file_path_length = fp_size;
> +
> + size = efi_serialize_load_option(&lo, (u8 **)&data);
> + if (!size) {
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + ret = efi_set_variable_int(var_name16, &guid,
> + EFI_VARIABLE_NON_VOLATILE |
> + EFI_VARIABLE_BOOTSERVICE_ACCESS |
> + EFI_VARIABLE_RUNTIME_ACCESS,
> + size, data, false);
> + if (ret != EFI_SUCCESS) {
> + printf("Cannot set %ls\n", var_name16);
> + r = CMD_RET_FAILURE;
> + }
> +
> +out:
> + free(data);
> + efi_free_pool(final_fp);
> + efi_free_pool(initrd_dp);
> + efi_free_pool(device_path);
> + efi_free_pool(file_path);
> + free(lo.label);
> +
> + return r;
> +}
> +
> +/**
> + * do_efi_boot_rm() - delete UEFI load options
> + *
> + * @cmdtp: Command table
> + * @flag: Command flag
> + * @argc: Number of arguments
> + * @argv: Argument array
> + * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> + *
> + * Implement "rm" sub-command.
> + * Delete UEFI load options.
> + *
> + * bootefi rm <id> ...
> + */
> +static int do_efi_boot_rm(struct cmd_tbl *cmdtp, int flag,
> + int argc, char *const argv[])
> +{
> + efi_guid_t guid;
> + int id, i;
> + char *endp;
> + u16 var_name16[9];
> + efi_status_t ret;
> +
> + if (argc == 1)
> + return CMD_RET_USAGE;
> +
> + guid = efi_global_variable_guid;
> + for (i = 1; i < argc; i++, argv++) {
> + id = (int)hextoul(argv[1], &endp);
> + if (*endp != '\0' || id > 0xffff)
> + return CMD_RET_FAILURE;
> +
> + efi_create_indexed_name(var_name16, sizeof(var_name16),
> + "Boot", id);
> + ret = efi_set_variable_int(var_name16, &guid, 0, 0, NULL,
> + false);
> + if (ret) {
> + printf("Cannot remove %ls\n", var_name16);
> + return CMD_RET_FAILURE;
> + }
> + }
> +
> + return CMD_RET_SUCCESS;
> +}
> +
> +/**
> + * show_efi_boot_opt_data() - dump UEFI load option
> + *
> + * @varname16: variable name
> + * @data: value of UEFI load option variable
> + * @size: size of the boot option
> + *
> + * Decode the value of UEFI load option variable and print information.
> + */
> +static void show_efi_boot_opt_data(u16 *varname16, void *data, size_t *size)
> +{
> + struct efi_device_path *initrd_path = NULL;
> + struct efi_load_option lo;
> + efi_status_t ret;
> +
> + ret = efi_deserialize_load_option(&lo, data, size);
> + if (ret != EFI_SUCCESS) {
> + printf("%ls: invalid load option\n", varname16);
> + return;
> + }
> +
> + printf("%ls:\nattributes: %c%c%c (0x%08x)\n",
> + varname16,
> + /* ACTIVE */
> + lo.attributes & LOAD_OPTION_ACTIVE ? 'A' : '-',
> + /* FORCE RECONNECT */
> + lo.attributes & LOAD_OPTION_FORCE_RECONNECT ? 'R' : '-',
> + /* HIDDEN */
> + lo.attributes & LOAD_OPTION_HIDDEN ? 'H' : '-',
> + lo.attributes);
> + printf(" label: %ls\n", lo.label);
> +
> + printf(" file_path: %pD\n", lo.file_path);
> +
> + initrd_path = efi_dp_from_lo(&lo, &efi_lf2_initrd_guid);
> + if (initrd_path) {
> + printf(" initrd_path: %pD\n", initrd_path);
> + efi_free_pool(initrd_path);
> + }
> +
> + printf(" data:\n");
> + print_hex_dump(" ", DUMP_PREFIX_OFFSET, 16, 1,
> + lo.optional_data, *size, true);
> +}
> +
> +/**
> + * show_efi_boot_opt() - dump UEFI load option
> + *
> + * @varname16: variable name
> + *
> + * Dump information defined by UEFI load option.
> + */
> +static void show_efi_boot_opt(u16 *varname16)
> +{
> + void *data;
> + efi_uintn_t size;
> + efi_status_t ret;
> +
> + size = 0;
> + ret = EFI_CALL(efi_get_variable(varname16, &efi_global_variable_guid,
> + NULL, &size, NULL));
> + if (ret == EFI_BUFFER_TOO_SMALL) {
> + data = malloc(size);
> + if (!data) {
> + printf("ERROR: Out of memory\n");
> + return;
> + }
> + ret = EFI_CALL(efi_get_variable(varname16,
> + &efi_global_variable_guid,
> + NULL, &size, data));
> + if (ret == EFI_SUCCESS)
> + show_efi_boot_opt_data(varname16, data, &size);
> + free(data);
> + }
> +}
> +
> +static int u16_tohex(u16 c)
> +{
> + if (c >= '0' && c <= '9')
> + return c - '0';
> + if (c >= 'A' && c <= 'F')
> + return c - 'A' + 10;
> +
> + /* not hexadecimal */
> + return -1;
> +}
> +
> +/**
> + * show_efi_boot_dump() - dump all UEFI load options
> + *
> + * @cmdtp: Command table
> + * @flag: Command flag
> + * @argc: Number of arguments
> + * @argv: Argument array
> + * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> + *
> + * Implement "dump" sub-command.
> + * Dump information of all UEFI load options defined.
> + *
> + * bootefi dump
> + */
> +static int do_efi_boot_dump(struct cmd_tbl *cmdtp, int flag,
> + int argc, char *const argv[])
> +{
> + u16 *var_name16, *p;
> + efi_uintn_t buf_size, size;
> + efi_guid_t guid;
> + int id, i, digit;
> + efi_status_t ret;
> +
> + if (argc > 1)
> + return CMD_RET_USAGE;
> +
> + buf_size = 128;
> + var_name16 = malloc(buf_size);
> + if (!var_name16)
> + return CMD_RET_FAILURE;
> +
> + var_name16[0] = 0;
> + for (;;) {
> + size = buf_size;
> + ret = EFI_CALL(efi_get_next_variable_name(&size, var_name16,
> + &guid));
> + if (ret == EFI_NOT_FOUND)
> + break;
> + if (ret == EFI_BUFFER_TOO_SMALL) {
> + buf_size = size;
> + p = realloc(var_name16, buf_size);
> + if (!p) {
> + free(var_name16);
> + return CMD_RET_FAILURE;
> + }
> + var_name16 = p;
> + ret = EFI_CALL(efi_get_next_variable_name(&size,
> + var_name16,
> + &guid));
> + }
> + if (ret != EFI_SUCCESS) {
> + free(var_name16);
> + return CMD_RET_FAILURE;
> + }
> +
> + if (memcmp(var_name16, L"Boot", 8))
> + continue;
> +
> + for (id = 0, i = 0; i < 4; i++) {
> + digit = u16_tohex(var_name16[4 + i]);
> + if (digit < 0)
> + break;
> + id = (id << 4) + digit;
> + }
> + if (i == 4 && !var_name16[8])
> + show_efi_boot_opt(var_name16);
> + }
> +
> + free(var_name16);
> +
> + return CMD_RET_SUCCESS;
> +}
> +
> +/**
> + * show_efi_boot_order() - show order of UEFI load options
> + *
> + * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> + *
> + * Show order of UEFI load options defined by BootOrder variable.
> + */
> +static int show_efi_boot_order(void)
> +{
> + u16 *bootorder;
> + efi_uintn_t size;
> + int num, i;
> + u16 var_name16[9];
> + void *data;
> + struct efi_load_option lo;
> + efi_status_t ret;
> +
> + size = 0;
> + ret = EFI_CALL(efi_get_variable(L"BootOrder", &efi_global_variable_guid,
> + NULL, &size, NULL));
> + if (ret != EFI_BUFFER_TOO_SMALL) {
> + if (ret == EFI_NOT_FOUND) {
> + printf("BootOrder not defined\n");
> + return CMD_RET_SUCCESS;
> + } else {
> + return CMD_RET_FAILURE;
> + }
> + }
> + bootorder = malloc(size);
> + if (!bootorder) {
> + printf("ERROR: Out of memory\n");
> + return CMD_RET_FAILURE;
> + }
> + ret = EFI_CALL(efi_get_variable(L"BootOrder", &efi_global_variable_guid,
> + NULL, &size, bootorder));
> + if (ret != EFI_SUCCESS) {
> + ret = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + num = size / sizeof(u16);
> + for (i = 0; i < num; i++) {
> + efi_create_indexed_name(var_name16, sizeof(var_name16),
> + "Boot", bootorder[i]);
> +
> + size = 0;
> + ret = EFI_CALL(efi_get_variable(var_name16,
> + &efi_global_variable_guid, NULL,
> + &size, NULL));
> + if (ret != EFI_BUFFER_TOO_SMALL) {
> + printf("%2d: %ls: (not defined)\n", i + 1, var_name16);
> + continue;
> + }
> +
> + data = malloc(size);
> + if (!data) {
> + ret = CMD_RET_FAILURE;
> + goto out;
> + }
> + ret = EFI_CALL(efi_get_variable(var_name16,
> + &efi_global_variable_guid, NULL,
> + &size, data));
> + if (ret != EFI_SUCCESS) {
> + free(data);
> + ret = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + ret = efi_deserialize_load_option(&lo, data, &size);
> + if (ret != EFI_SUCCESS) {
> + printf("%ls: invalid load option\n", var_name16);
> + ret = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + printf("%2d: %ls: %ls\n", i + 1, var_name16, lo.label);
> +
> + free(data);
> + }
> +out:
> + free(bootorder);
> +
> + return ret;
> +}
> +
> +/**
> + * do_efi_boot_next() - manage UEFI BootNext variable
> + *
> + * @cmdtp: Command table
> + * @flag: Command flag
> + * @argc: Number of arguments
> + * @argv: Argument array
> + * Return: CMD_RET_SUCCESS on success,
> + * CMD_RET_USAGE or CMD_RET_RET_FAILURE on failure
> + *
> + * Implement "next" sub-command.
> + * Set BootNext variable.
> + *
> + * bootefi next <id>
> + */
> +static int do_efi_boot_next(struct cmd_tbl *cmdtp, int flag,
> + int argc, char *const argv[])
> +{
> + u16 bootnext;
> + efi_uintn_t size;
> + char *endp;
> + efi_guid_t guid;
> + efi_status_t ret;
> + int r = CMD_RET_SUCCESS;
> +
> + if (argc > 2)
> + return CMD_RET_USAGE;
> +
> + if (argc == 1) {
> + size = sizeof(bootnext);
> + ret = efi_get_variable_int(L"BootNext",
> + &efi_global_variable_guid,
> + NULL, &size, &bootnext, NULL);
> + if (size != 2 || ret != EFI_SUCCESS)
> + return CMD_RET_FAILURE;
> + printf("%04X\n", bootnext);
> + return CMD_RET_SUCCESS;
> + }
> +
> + bootnext = (u16)hextoul(argv[1], &endp);
> + if (*endp) {
> + printf("invalid value: %s\n", argv[1]);
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + guid = efi_global_variable_guid;
> + size = sizeof(u16);
> + ret = efi_set_variable_int(L"BootNext", &guid,
> + EFI_VARIABLE_NON_VOLATILE |
> + EFI_VARIABLE_BOOTSERVICE_ACCESS |
> + EFI_VARIABLE_RUNTIME_ACCESS,
> + size, &bootnext, false);
> + if (ret != EFI_SUCCESS) {
> + printf("Cannot set BootNext\n");
> + r = CMD_RET_FAILURE;
> + }
> +out:
> + return r;
> +}
> +
> +/**
> + * do_efi_boot_order() - manage UEFI BootOrder variable
> + *
> + * @cmdtp: Command table
> + * @flag: Command flag
> + * @argc: Number of arguments
> + * @argv: Argument array
> + * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> + *
> + * Implement "order" sub-command.
> + * Show order of UEFI load options, or change it in BootOrder variable.
> + *
> + * bootefi order [<id> ...]
> + */
> +static int do_efi_boot_order(struct cmd_tbl *cmdtp, int flag,
> + int argc, char *const argv[])
> +{
> + u16 *bootorder = NULL;
> + efi_uintn_t size;
> + int id, i;
> + char *endp;
> + efi_guid_t guid;
> + efi_status_t ret;
> + int r = CMD_RET_SUCCESS;
> +
> + if (argc == 1)
> + return show_efi_boot_order();
> +
> + argc--;
> + argv++;
> +
> + size = argc * sizeof(u16);
> + bootorder = malloc(size);
> + if (!bootorder)
> + return CMD_RET_FAILURE;
> +
> + for (i = 0; i < argc; i++) {
> + id = (int)hextoul(argv[i], &endp);
> + if (*endp != '\0' || id > 0xffff) {
> + printf("invalid value: %s\n", argv[i]);
> + r = CMD_RET_FAILURE;
> + goto out;
> + }
> +
> + bootorder[i] = (u16)id;
> + }
> +
> + guid = efi_global_variable_guid;
> + ret = efi_set_variable_int(L"BootOrder", &guid,
> + EFI_VARIABLE_NON_VOLATILE |
> + EFI_VARIABLE_BOOTSERVICE_ACCESS |
> + EFI_VARIABLE_RUNTIME_ACCESS,
> + size, bootorder, true);
> + if (ret != EFI_SUCCESS) {
> + printf("Cannot set BootOrder\n");
> + r = CMD_RET_FAILURE;
> + }
> +out:
> + free(bootorder);
> +
> + return r;
> +}
> +
> /**
> * efi_set_bootdev() - set boot device
> *
> @@ -498,7 +1115,6 @@ out:
> return ret;
> }
>
> -#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
> static efi_status_t bootefi_run_prepare(const char *load_options_path,
> struct efi_device_path *device_path,
> struct efi_device_path *image_path,
> @@ -597,7 +1213,6 @@ static int do_efi_selftest(void)
>
> return ret != EFI_SUCCESS;
> }
> -#endif /* CONFIG_CMD_BOOTEFI_SELFTEST */
>
> /**
> * do_bootefi() - execute `bootefi` command
> @@ -611,9 +1226,23 @@ static int do_efi_selftest(void)
> static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
> char *const argv[])
> {
> + struct cmd_tbl *cp;
> efi_status_t ret;
> void *fdt;
>
> + static struct cmd_tbl cmd_bootefi_sub[] = {
> + U_BOOT_CMD_MKENT(add, CONFIG_SYS_MAXARGS, 1,
> + do_efi_boot_add, "", ""),
> + U_BOOT_CMD_MKENT(dump, CONFIG_SYS_MAXARGS,
> + 1, do_efi_boot_dump, "", ""),
> + U_BOOT_CMD_MKENT(next, CONFIG_SYS_MAXARGS, 1,
> + do_efi_boot_next, "", ""),
> + U_BOOT_CMD_MKENT(order, CONFIG_SYS_MAXARGS, 1,
> + do_efi_boot_order, "", ""),
> + U_BOOT_CMD_MKENT(rm, CONFIG_SYS_MAXARGS, 1,
> + do_efi_boot_rm, "", ""),
> + };
> +
> if (argc < 2)
> return CMD_RET_USAGE;
>
> @@ -625,7 +1254,19 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
> return CMD_RET_FAILURE;
> }
>
> - if (argc > 2) {
> + if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
> + cp = find_cmd_tbl(argv[1], cmd_bootefi_sub,
> + ARRAY_SIZE(cmd_bootefi_sub));
> + if (cp) {
> + argc--;
> + argv++;
> + return cp->cmd(cmdtp, flag, argc, argv);
> + }
> + }
> +
> + if (argc > 3)
> + return CMD_RET_USAGE;
> + if (argc == 3) {
> uintptr_t fdt_addr;
>
> fdt_addr = hextoul(argv[2], NULL);
> @@ -643,10 +1284,10 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
> if (!strcmp(argv[1], "bootmgr"))
> return do_efibootmgr();
> }
> -#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
> - if (!strcmp(argv[1], "selftest"))
> - return do_efi_selftest();
> -#endif
> + if (IS_ENABLED(CONFIG_CMD_BOOTEFI_SELFTEST)) {
> + if (!strcmp(argv[1], "selftest"))
> + return do_efi_selftest();
> + }
>
> return do_bootefi_image(argv[1]);
> }
> @@ -668,6 +1309,21 @@ static char bootefi_help_text[] =
> " Use 'setenv efi_selftest list' to enumerate all tests.\n"
> #endif
> #ifdef CONFIG_CMD_BOOTEFI_BOOTMGR
> + "bootefi add "
> + "-b <bootid> <label> <interface> <devnum>[:<part>] <file path> "
> + "-i <interface> <devnum>[:<part>] <initrd file path> "
> + "-s '<optional data>'\n"
> + " - set UEFI BootXXXX variable\n"
> + " <load options> will be passed to UEFI application\n"
> + "bootefi rm <bootid#1> [<bootid#2> [<bootid#3> [...]]]\n"
> + " - delete UEFI BootXXXX variables\n"
> + "bootefi dump\n"
> + " - dump all UEFI BootXXXX variables\n"
> + "bootefi next [bootid]\n"
> + " - set/show UEFI BootNext variable\n"
> + "bootefi order [<bootid#1> [<bootid#2> [<bootid#3> [...]]]]\n"
> + " - set/show UEFI boot order\n"
> + "\n"
> "bootefi bootmgr [fdt address]\n"
> " - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
> "\n"
> @@ -678,7 +1334,7 @@ static char bootefi_help_text[] =
> #endif
>
> U_BOOT_CMD(
> - bootefi, 3, 0, do_bootefi,
> + bootefi, CONFIG_SYS_MAXARGS, 0, do_bootefi,
> "Boots an EFI payload from memory",
> bootefi_help_text
> );
> diff --git a/cmd/efidebug.c b/cmd/efidebug.c
> index a977ca9c72..121906a336 100644
> --- a/cmd/efidebug.c
> +++ b/cmd/efidebug.c
> @@ -9,12 +9,10 @@
> #include <common.h>
> #include <command.h>
> #include <efi_dt_fixup.h>
> -#include <efi_load_initrd.h>
> #include <efi_loader.h>
> -#include <efi_rng.h>
> #include <efi_variable.h>
> +#include <efi_rng.h>
> #include <exports.h>
> -#include <hexdump.h>
> #include <log.h>
> #include <malloc.h>
> #include <mapmem.h>
> @@ -885,648 +883,6 @@ static int do_efi_show_tables(struct cmd_tbl *cmdtp, int flag,
> return CMD_RET_SUCCESS;
> }
>
> -/**
> - * create_initrd_dp() - Create a special device for our Boot### option
> - *
> - * @dev: Device
> - * @part: Disk partition
> - * @file: Filename
> - * Return: Pointer to the device path or ERR_PTR
> - *
> - */
> -static
> -struct efi_device_path *create_initrd_dp(const char *dev, const char *part,
> - const char *file)
> -
> -{
> - struct efi_device_path *tmp_dp = NULL, *tmp_fp = NULL;
> - struct efi_device_path *initrd_dp = NULL;
> - efi_status_t ret;
> - const struct efi_initrd_dp id_dp = {
> - .vendor = {
> - {
> - DEVICE_PATH_TYPE_MEDIA_DEVICE,
> - DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
> - sizeof(id_dp.vendor),
> - },
> - EFI_INITRD_MEDIA_GUID,
> - },
> - .end = {
> - DEVICE_PATH_TYPE_END,
> - DEVICE_PATH_SUB_TYPE_END,
> - sizeof(id_dp.end),
> - }
> - };
> -
> - ret = efi_dp_from_name(dev, part, file, &tmp_dp, &tmp_fp);
> - if (ret != EFI_SUCCESS) {
> - printf("Cannot create device path for \"%s %s\"\n", part, file);
> - goto out;
> - }
> -
> - initrd_dp = efi_dp_append((const struct efi_device_path *)&id_dp,
> - tmp_fp);
> -
> -out:
> - efi_free_pool(tmp_dp);
> - efi_free_pool(tmp_fp);
> - return initrd_dp;
> -}
> -
> -/**
> - * do_efi_boot_add() - set UEFI load option
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success,
> - * CMD_RET_USAGE or CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot add" sub-command. Create or change UEFI load option.
> - *
> - * efidebug boot add -b <id> <label> <interface> <devnum>[:<part>] <file>
> - * -i <file> <interface2> <devnum2>[:<part>] <initrd>
> - * -s '<options>'
> - */
> -static int do_efi_boot_add(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - int id;
> - char *endp;
> - u16 var_name16[9];
> - efi_guid_t guid;
> - size_t label_len, label_len16;
> - u16 *label;
> - struct efi_device_path *device_path = NULL, *file_path = NULL;
> - struct efi_device_path *final_fp = NULL;
> - struct efi_device_path *initrd_dp = NULL;
> - struct efi_load_option lo;
> - void *data = NULL;
> - efi_uintn_t size;
> - efi_uintn_t fp_size = 0;
> - efi_status_t ret;
> - int r = CMD_RET_SUCCESS;
> -
> - guid = efi_global_variable_guid;
> -
> - /* attributes */
> - lo.attributes = LOAD_OPTION_ACTIVE; /* always ACTIVE */
> - lo.optional_data = NULL;
> - lo.label = NULL;
> -
> - argc--;
> - argv++; /* 'add' */
> - for (; argc > 0; argc--, argv++) {
> - if (!strcmp(argv[0], "-b")) {
> - if (argc < 5 || lo.label) {
> - r = CMD_RET_USAGE;
> - goto out;
> - }
> - id = (int)hextoul(argv[1], &endp);
> - if (*endp != '\0' || id > 0xffff)
> - return CMD_RET_USAGE;
> -
> - efi_create_indexed_name(var_name16, sizeof(var_name16),
> - "Boot", id);
> -
> - /* label */
> - label_len = strlen(argv[2]);
> - label_len16 = utf8_utf16_strnlen(argv[2], label_len);
> - label = malloc((label_len16 + 1) * sizeof(u16));
> - if (!label)
> - return CMD_RET_FAILURE;
> - lo.label = label; /* label will be changed below */
> - utf8_utf16_strncpy(&label, argv[2], label_len);
> -
> - /* file path */
> - ret = efi_dp_from_name(argv[3], argv[4], argv[5],
> - &device_path, &file_path);
> - if (ret != EFI_SUCCESS) {
> - printf("Cannot create device path for \"%s %s\"\n",
> - argv[3], argv[4]);
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> - fp_size += efi_dp_size(file_path) +
> - sizeof(struct efi_device_path);
> - argc -= 5;
> - argv += 5;
> - } else if (!strcmp(argv[0], "-i")) {
> - if (argc < 3 || initrd_dp) {
> - r = CMD_RET_USAGE;
> - goto out;
> - }
> -
> - initrd_dp = create_initrd_dp(argv[1], argv[2], argv[3]);
> - if (!initrd_dp) {
> - printf("Cannot add an initrd\n");
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> - argc -= 3;
> - argv += 3;
> - fp_size += efi_dp_size(initrd_dp) +
> - sizeof(struct efi_device_path);
> - } else if (!strcmp(argv[0], "-s")) {
> - if (argc < 1 || lo.optional_data) {
> - r = CMD_RET_USAGE;
> - goto out;
> - }
> - lo.optional_data = (const u8 *)argv[1];
> - argc -= 1;
> - argv += 1;
> - } else {
> - r = CMD_RET_USAGE;
> - goto out;
> - }
> - }
> -
> - if (!file_path) {
> - printf("Missing binary\n");
> - r = CMD_RET_USAGE;
> - goto out;
> - }
> -
> - final_fp = efi_dp_concat(file_path, initrd_dp);
> - if (!final_fp) {
> - printf("Cannot create final device path\n");
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - lo.file_path = final_fp;
> - lo.file_path_length = fp_size;
> -
> - size = efi_serialize_load_option(&lo, (u8 **)&data);
> - if (!size) {
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - ret = efi_set_variable_int(var_name16, &guid,
> - EFI_VARIABLE_NON_VOLATILE |
> - EFI_VARIABLE_BOOTSERVICE_ACCESS |
> - EFI_VARIABLE_RUNTIME_ACCESS,
> - size, data, false);
> - if (ret != EFI_SUCCESS) {
> - printf("Cannot set %ls\n", var_name16);
> - r = CMD_RET_FAILURE;
> - }
> -
> -out:
> - free(data);
> - efi_free_pool(final_fp);
> - efi_free_pool(initrd_dp);
> - efi_free_pool(device_path);
> - efi_free_pool(file_path);
> - free(lo.label);
> -
> - return r;
> -}
> -
> -/**
> - * do_efi_boot_rm() - delete UEFI load options
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot rm" sub-command.
> - * Delete UEFI load options.
> - *
> - * efidebug boot rm <id> ...
> - */
> -static int do_efi_boot_rm(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - efi_guid_t guid;
> - int id, i;
> - char *endp;
> - u16 var_name16[9];
> - efi_status_t ret;
> -
> - if (argc == 1)
> - return CMD_RET_USAGE;
> -
> - guid = efi_global_variable_guid;
> - for (i = 1; i < argc; i++, argv++) {
> - id = (int)hextoul(argv[1], &endp);
> - if (*endp != '\0' || id > 0xffff)
> - return CMD_RET_FAILURE;
> -
> - efi_create_indexed_name(var_name16, sizeof(var_name16),
> - "Boot", id);
> - ret = efi_set_variable_int(var_name16, &guid, 0, 0, NULL,
> - false);
> - if (ret) {
> - printf("Cannot remove %ls\n", var_name16);
> - return CMD_RET_FAILURE;
> - }
> - }
> -
> - return CMD_RET_SUCCESS;
> -}
> -
> -/**
> - * show_efi_boot_opt_data() - dump UEFI load option
> - *
> - * @varname16: variable name
> - * @data: value of UEFI load option variable
> - * @size: size of the boot option
> - *
> - * Decode the value of UEFI load option variable and print information.
> - */
> -static void show_efi_boot_opt_data(u16 *varname16, void *data, size_t *size)
> -{
> - struct efi_device_path *initrd_path = NULL;
> - struct efi_load_option lo;
> - efi_status_t ret;
> -
> - ret = efi_deserialize_load_option(&lo, data, size);
> - if (ret != EFI_SUCCESS) {
> - printf("%ls: invalid load option\n", varname16);
> - return;
> - }
> -
> - printf("%ls:\nattributes: %c%c%c (0x%08x)\n",
> - varname16,
> - /* ACTIVE */
> - lo.attributes & LOAD_OPTION_ACTIVE ? 'A' : '-',
> - /* FORCE RECONNECT */
> - lo.attributes & LOAD_OPTION_FORCE_RECONNECT ? 'R' : '-',
> - /* HIDDEN */
> - lo.attributes & LOAD_OPTION_HIDDEN ? 'H' : '-',
> - lo.attributes);
> - printf(" label: %ls\n", lo.label);
> -
> - printf(" file_path: %pD\n", lo.file_path);
> -
> - initrd_path = efi_dp_from_lo(&lo, &efi_lf2_initrd_guid);
> - if (initrd_path) {
> - printf(" initrd_path: %pD\n", initrd_path);
> - efi_free_pool(initrd_path);
> - }
> -
> - printf(" data:\n");
> - print_hex_dump(" ", DUMP_PREFIX_OFFSET, 16, 1,
> - lo.optional_data, *size, true);
> -}
> -
> -/**
> - * show_efi_boot_opt() - dump UEFI load option
> - *
> - * @varname16: variable name
> - *
> - * Dump information defined by UEFI load option.
> - */
> -static void show_efi_boot_opt(u16 *varname16)
> -{
> - void *data;
> - efi_uintn_t size;
> - efi_status_t ret;
> -
> - size = 0;
> - ret = EFI_CALL(efi_get_variable(varname16, &efi_global_variable_guid,
> - NULL, &size, NULL));
> - if (ret == EFI_BUFFER_TOO_SMALL) {
> - data = malloc(size);
> - if (!data) {
> - printf("ERROR: Out of memory\n");
> - return;
> - }
> - ret = EFI_CALL(efi_get_variable(varname16,
> - &efi_global_variable_guid,
> - NULL, &size, data));
> - if (ret == EFI_SUCCESS)
> - show_efi_boot_opt_data(varname16, data, &size);
> - free(data);
> - }
> -}
> -
> -static int u16_tohex(u16 c)
> -{
> - if (c >= '0' && c <= '9')
> - return c - '0';
> - if (c >= 'A' && c <= 'F')
> - return c - 'A' + 10;
> -
> - /* not hexadecimal */
> - return -1;
> -}
> -
> -/**
> - * show_efi_boot_dump() - dump all UEFI load options
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot dump" sub-command.
> - * Dump information of all UEFI load options defined.
> - *
> - * efidebug boot dump
> - */
> -static int do_efi_boot_dump(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - u16 *var_name16, *p;
> - efi_uintn_t buf_size, size;
> - efi_guid_t guid;
> - int id, i, digit;
> - efi_status_t ret;
> -
> - if (argc > 1)
> - return CMD_RET_USAGE;
> -
> - buf_size = 128;
> - var_name16 = malloc(buf_size);
> - if (!var_name16)
> - return CMD_RET_FAILURE;
> -
> - var_name16[0] = 0;
> - for (;;) {
> - size = buf_size;
> - ret = EFI_CALL(efi_get_next_variable_name(&size, var_name16,
> - &guid));
> - if (ret == EFI_NOT_FOUND)
> - break;
> - if (ret == EFI_BUFFER_TOO_SMALL) {
> - buf_size = size;
> - p = realloc(var_name16, buf_size);
> - if (!p) {
> - free(var_name16);
> - return CMD_RET_FAILURE;
> - }
> - var_name16 = p;
> - ret = EFI_CALL(efi_get_next_variable_name(&size,
> - var_name16,
> - &guid));
> - }
> - if (ret != EFI_SUCCESS) {
> - free(var_name16);
> - return CMD_RET_FAILURE;
> - }
> -
> - if (memcmp(var_name16, L"Boot", 8))
> - continue;
> -
> - for (id = 0, i = 0; i < 4; i++) {
> - digit = u16_tohex(var_name16[4 + i]);
> - if (digit < 0)
> - break;
> - id = (id << 4) + digit;
> - }
> - if (i == 4 && !var_name16[8])
> - show_efi_boot_opt(var_name16);
> - }
> -
> - free(var_name16);
> -
> - return CMD_RET_SUCCESS;
> -}
> -
> -/**
> - * show_efi_boot_order() - show order of UEFI load options
> - *
> - * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> - *
> - * Show order of UEFI load options defined by BootOrder variable.
> - */
> -static int show_efi_boot_order(void)
> -{
> - u16 *bootorder;
> - efi_uintn_t size;
> - int num, i;
> - u16 var_name16[9];
> - void *data;
> - struct efi_load_option lo;
> - efi_status_t ret;
> -
> - size = 0;
> - ret = EFI_CALL(efi_get_variable(L"BootOrder", &efi_global_variable_guid,
> - NULL, &size, NULL));
> - if (ret != EFI_BUFFER_TOO_SMALL) {
> - if (ret == EFI_NOT_FOUND) {
> - printf("BootOrder not defined\n");
> - return CMD_RET_SUCCESS;
> - } else {
> - return CMD_RET_FAILURE;
> - }
> - }
> - bootorder = malloc(size);
> - if (!bootorder) {
> - printf("ERROR: Out of memory\n");
> - return CMD_RET_FAILURE;
> - }
> - ret = EFI_CALL(efi_get_variable(L"BootOrder", &efi_global_variable_guid,
> - NULL, &size, bootorder));
> - if (ret != EFI_SUCCESS) {
> - ret = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - num = size / sizeof(u16);
> - for (i = 0; i < num; i++) {
> - efi_create_indexed_name(var_name16, sizeof(var_name16),
> - "Boot", bootorder[i]);
> -
> - size = 0;
> - ret = EFI_CALL(efi_get_variable(var_name16,
> - &efi_global_variable_guid, NULL,
> - &size, NULL));
> - if (ret != EFI_BUFFER_TOO_SMALL) {
> - printf("%2d: %ls: (not defined)\n", i + 1, var_name16);
> - continue;
> - }
> -
> - data = malloc(size);
> - if (!data) {
> - ret = CMD_RET_FAILURE;
> - goto out;
> - }
> - ret = EFI_CALL(efi_get_variable(var_name16,
> - &efi_global_variable_guid, NULL,
> - &size, data));
> - if (ret != EFI_SUCCESS) {
> - free(data);
> - ret = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - ret = efi_deserialize_load_option(&lo, data, &size);
> - if (ret != EFI_SUCCESS) {
> - printf("%ls: invalid load option\n", var_name16);
> - ret = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - printf("%2d: %ls: %ls\n", i + 1, var_name16, lo.label);
> -
> - free(data);
> - }
> -out:
> - free(bootorder);
> -
> - return ret;
> -}
> -
> -/**
> - * do_efi_boot_next() - manage UEFI BootNext variable
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success,
> - * CMD_RET_USAGE or CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot next" sub-command.
> - * Set BootNext variable.
> - *
> - * efidebug boot next <id>
> - */
> -static int do_efi_boot_next(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - u16 bootnext;
> - efi_uintn_t size;
> - char *endp;
> - efi_guid_t guid;
> - efi_status_t ret;
> - int r = CMD_RET_SUCCESS;
> -
> - if (argc != 2)
> - return CMD_RET_USAGE;
> -
> - bootnext = (u16)hextoul(argv[1], &endp);
> - if (*endp) {
> - printf("invalid value: %s\n", argv[1]);
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - guid = efi_global_variable_guid;
> - size = sizeof(u16);
> - ret = efi_set_variable_int(L"BootNext", &guid,
> - EFI_VARIABLE_NON_VOLATILE |
> - EFI_VARIABLE_BOOTSERVICE_ACCESS |
> - EFI_VARIABLE_RUNTIME_ACCESS,
> - size, &bootnext, false);
> - if (ret != EFI_SUCCESS) {
> - printf("Cannot set BootNext\n");
> - r = CMD_RET_FAILURE;
> - }
> -out:
> - return r;
> -}
> -
> -/**
> - * do_efi_boot_order() - manage UEFI BootOrder variable
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot order" sub-command.
> - * Show order of UEFI load options, or change it in BootOrder variable.
> - *
> - * efidebug boot order [<id> ...]
> - */
> -static int do_efi_boot_order(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - u16 *bootorder = NULL;
> - efi_uintn_t size;
> - int id, i;
> - char *endp;
> - efi_guid_t guid;
> - efi_status_t ret;
> - int r = CMD_RET_SUCCESS;
> -
> - if (argc == 1)
> - return show_efi_boot_order();
> -
> - argc--;
> - argv++;
> -
> - size = argc * sizeof(u16);
> - bootorder = malloc(size);
> - if (!bootorder)
> - return CMD_RET_FAILURE;
> -
> - for (i = 0; i < argc; i++) {
> - id = (int)hextoul(argv[i], &endp);
> - if (*endp != '\0' || id > 0xffff) {
> - printf("invalid value: %s\n", argv[i]);
> - r = CMD_RET_FAILURE;
> - goto out;
> - }
> -
> - bootorder[i] = (u16)id;
> - }
> -
> - guid = efi_global_variable_guid;
> - ret = efi_set_variable_int(L"BootOrder", &guid,
> - EFI_VARIABLE_NON_VOLATILE |
> - EFI_VARIABLE_BOOTSERVICE_ACCESS |
> - EFI_VARIABLE_RUNTIME_ACCESS,
> - size, bootorder, true);
> - if (ret != EFI_SUCCESS) {
> - printf("Cannot set BootOrder\n");
> - r = CMD_RET_FAILURE;
> - }
> -out:
> - free(bootorder);
> -
> - return r;
> -}
> -
> -static struct cmd_tbl cmd_efidebug_boot_sub[] = {
> - U_BOOT_CMD_MKENT(add, CONFIG_SYS_MAXARGS, 1, do_efi_boot_add, "", ""),
> - U_BOOT_CMD_MKENT(rm, CONFIG_SYS_MAXARGS, 1, do_efi_boot_rm, "", ""),
> - U_BOOT_CMD_MKENT(dump, CONFIG_SYS_MAXARGS, 1, do_efi_boot_dump, "", ""),
> - U_BOOT_CMD_MKENT(next, CONFIG_SYS_MAXARGS, 1, do_efi_boot_next, "", ""),
> - U_BOOT_CMD_MKENT(order, CONFIG_SYS_MAXARGS, 1, do_efi_boot_order,
> - "", ""),
> -};
> -
> -/**
> - * do_efi_boot_opt() - manage UEFI load options
> - *
> - * @cmdtp: Command table
> - * @flag: Command flag
> - * @argc: Number of arguments
> - * @argv: Argument array
> - * Return: CMD_RET_SUCCESS on success,
> - * CMD_RET_USAGE or CMD_RET_RET_FAILURE on failure
> - *
> - * Implement efidebug "boot" sub-command.
> - */
> -static int do_efi_boot_opt(struct cmd_tbl *cmdtp, int flag,
> - int argc, char *const argv[])
> -{
> - struct cmd_tbl *cp;
> -
> - if (argc < 2)
> - return CMD_RET_USAGE;
> -
> - argc--; argv++;
> -
> - cp = find_cmd_tbl(argv[0], cmd_efidebug_boot_sub,
> - ARRAY_SIZE(cmd_efidebug_boot_sub));
> - if (!cp)
> - return CMD_RET_USAGE;
> -
> - return cp->cmd(cmdtp, flag, argc, argv);
> -}
> -
> /**
> * do_efi_test_bootmgr() - run simple bootmgr for test
> *
> @@ -1656,7 +1012,6 @@ static int do_efi_query_info(struct cmd_tbl *cmdtp, int flag,
> }
>
> static struct cmd_tbl cmd_efidebug_sub[] = {
> - U_BOOT_CMD_MKENT(boot, CONFIG_SYS_MAXARGS, 1, do_efi_boot_opt, "", ""),
> #ifdef CONFIG_EFI_HAVE_CAPSULE_SUPPORT
> U_BOOT_CMD_MKENT(capsule, CONFIG_SYS_MAXARGS, 1, do_efi_capsule,
> "", ""),
> @@ -1723,21 +1078,6 @@ static int do_efidebug(struct cmd_tbl *cmdtp, int flag,
> static char efidebug_help_text[] =
> " - UEFI Shell-like interface to configure UEFI environment\n"
> "\n"
> - "efidebug boot add "
> - "-b <bootid> <label> <interface> <devnum>[:<part>] <file path> "
> - "-i <interface> <devnum>[:<part>] <initrd file path> "
> - "-s '<optional data>'\n"
> - " - set UEFI BootXXXX variable\n"
> - " <load options> will be passed to UEFI application\n"
> - "efidebug boot rm <bootid#1> [<bootid#2> [<bootid#3> [...]]]\n"
> - " - delete UEFI BootXXXX variables\n"
> - "efidebug boot dump\n"
> - " - dump all UEFI BootXXXX variables\n"
> - "efidebug boot next <bootid>\n"
> - " - set UEFI BootNext variable\n"
> - "efidebug boot order [<bootid#1> [<bootid#2> [<bootid#3> [...]]]]\n"
> - " - set/show UEFI boot order\n"
> - "\n"
> #ifdef CONFIG_EFI_HAVE_CAPSULE_SUPPORT
> "efidebug capsule update [-v] <capsule address>\n"
> " - process a capsule\n"
> diff --git a/doc/develop/uefi/uefi.rst b/doc/develop/uefi/uefi.rst
> index 43fb10f797..205755446f 100644
> --- a/doc/develop/uefi/uefi.rst
> +++ b/doc/develop/uefi/uefi.rst
> @@ -178,13 +178,13 @@ Now in U-Boot install the keys on your board::
>
> Set up boot parameters on your board::
>
> - efidebug boot add -b 1 HELLO mmc 0:1 /helloworld.efi.signed ""
> + bootefi boot add -b 1 HELLO mmc 0:1 /helloworld.efi.signed ""
>
> Since kernel 5.7 there's an alternative way of loading an initrd using
> LoadFile2 protocol if CONFIG_EFI_LOAD_FILE2_INITRD is enabled.
> The initrd path can be specified with::
>
> - efidebug boot add -b ABE0 'kernel' mmc 0:1 Image -i mmc 0:1 initrd
> + bootefi boot add -b ABE0 'kernel' mmc 0:1 Image -i mmc 0:1 initrd
>
> Now your board can run the signed image via the boot manager (see below).
> You can also try this sequence by running Pytest, test_efi_secboot,
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index f4860e87fc..d369b112c3 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -798,14 +798,12 @@ efi_status_t __efi_runtime EFIAPI efi_get_time(
>
> efi_status_t __efi_runtime EFIAPI efi_set_time(struct efi_time *time);
>
> -#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
> /*
> * Entry point for the tests of the EFI API.
> * It is called by 'bootefi selftest'
> */
> efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
> struct efi_system_table *systab);
> -#endif
>
> efi_status_t EFIAPI efi_get_variable(u16 *variable_name,
> const efi_guid_t *vendor, u32 *attributes,
> diff --git a/lib/efi_selftest/efi_selftest_tcg2.c b/lib/efi_selftest/efi_selftest_tcg2.c
> index c5b0b7dd02..eb3bcafd1f 100644
> --- a/lib/efi_selftest/efi_selftest_tcg2.c
> +++ b/lib/efi_selftest/efi_selftest_tcg2.c
> @@ -70,7 +70,7 @@ static struct efi_runtime_services *runtime;
> EFI_VARIABLE_BOOTSERVICE_ACCESS | \
> EFI_VARIABLE_RUNTIME_ACCESS)
>
> -/* "efidebug boot add -b 1000 test1000 virtio 0:1 /EFI/debian/grubaa64.efi" */
> +/* "bootefi add -b 1000 test1000 virtio 0:1 /EFI/debian/grubaa64.efi" */
> static const u8 boot_1000[] = {
> 0x01, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00,
> 0x74, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x04, 0x14, 0x00, 0xb9, 0x73,
> @@ -87,7 +87,7 @@ static const u8 boot_1000[] = {
> 0x00, 0x2e, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x00, 0x00, 0x7f,
> 0xff, 0x04, 0x00 };
>
> -/* "efidebug boot add -b 1001 test1001 virtio 0:1 /EFI/debian/grubaa64.efi" */
> +/* "bootefi add -b 1001 test1001 virtio 0:1 /EFI/debian/grubaa64.efi" */
> static const u8 boot_1001[] = {
> 0x01, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00,
> 0x74, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x04, 0x14, 0x00, 0xb9, 0x73,
> @@ -104,7 +104,7 @@ static const u8 boot_1001[] = {
> 0x00, 0x2e, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x00, 0x00, 0x7f,
> 0xff, 0x04, 0x00 };
>
> -/* "efidebug boot add -b 1002 test1002 virtio 0:1 /EFI/debian/grubaa64.efi" */
> +/* "bootefi add -b 1002 test1002 virtio 0:1 /EFI/debian/grubaa64.efi" */
> static const u8 boot_1002[] = {
> 0x01, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00,
> 0x74, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x04, 0x14, 0x00, 0xb9, 0x73,
> @@ -121,7 +121,7 @@ static const u8 boot_1002[] = {
> 0x00, 0x2e, 0x00, 0x65, 0x00, 0x66, 0x00, 0x69, 0x00, 0x00, 0x00, 0x7f,
> 0xff, 0x04, 0x00};
>
> -/* "efidebug boot order 1002 1000 1001" */
> +/* "bootefi order 1002 1000 1001" */
> static u8 boot_order[] = {0x02, 0x10, 0x00, 0x10, 0x01, 0x10};
>
> static void *orig_smbios_table;
> diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware.py b/test/py/tests/test_efi_capsule/test_capsule_firmware.py
> index 9eeaae27d6..ac54b14aa6 100644
> --- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py
> +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py
> @@ -39,8 +39,8 @@ class TestEfiCapsuleFirmwareFit(object):
> with u_boot_console.log.section('Test Case 1-a, before reboot'):
> output = u_boot_console.run_command_list([
> 'host bind 0 %s' % disk_img,
> - 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot order 1',
> + 'bootefi add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> + 'bootefi order 1',
> 'env set -e OsIndications',
> 'env set dfu_alt_info "sf 0:0=u-boot-bin raw 0x100000 0x50000;u-boot-env raw 0x150000 0x200000"',
> 'env save'])
> @@ -114,8 +114,8 @@ class TestEfiCapsuleFirmwareFit(object):
> with u_boot_console.log.section('Test Case 2-a, before reboot'):
> output = u_boot_console.run_command_list([
> 'host bind 0 %s' % disk_img,
> - 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot order 1',
> + 'bootefi add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> + 'bootefi order 1',
> 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
> 'env set dfu_alt_info "sf 0:0=u-boot-bin raw 0x100000 0x50000;u-boot-env raw 0x150000 0x200000"',
> 'env save'])
> @@ -188,8 +188,8 @@ class TestEfiCapsuleFirmwareFit(object):
> with u_boot_console.log.section('Test Case 3-a, before reboot'):
> output = u_boot_console.run_command_list([
> 'host bind 0 %s' % disk_img,
> - 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot order 1',
> + 'bootefi add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> + 'bootefi order 1',
> 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
> 'env set dfu_alt_info "sf 0:0=u-boot-bin raw 0x100000 0x50000;u-boot-env raw 0x150000 0x200000"',
> 'env save'])
> diff --git a/test/py/tests/test_efi_secboot/test_signed.py b/test/py/tests/test_efi_secboot/test_signed.py
> index 0aee34479f..4af4d90d4c 100644
> --- a/test/py/tests/test_efi_secboot/test_signed.py
> +++ b/test/py/tests/test_efi_secboot/test_signed.py
> @@ -28,16 +28,16 @@ class TestEfiSignedImage(object):
> # Test Case 1a, run signed image if no PK
> output = u_boot_console.run_command_list([
> 'host bind 0 %s' % disk_img,
> - 'efidebug boot add -b 1 HELLO1 host 0:1 /helloworld.efi.signed -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO1 host 0:1 /helloworld.efi.signed -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> with u_boot_console.log.section('Test Case 1b'):
> # Test Case 1b, run unsigned image if no PK
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 2 HELLO2 host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot next 2',
> + 'bootefi add -b 2 HELLO2 host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 2',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -58,14 +58,14 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO1 host 0:1 /helloworld.efi.signed -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO1 host 0:1 /helloworld.efi.signed -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert('\'HELLO1\' failed' in ''.join(output))
> assert('efi_start_image() 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 next 2',
> + 'bootefi add -b 2 HELLO2 host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 2',
> 'efidebug test bootmgr'])
> assert '\'HELLO2\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -77,12 +77,12 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 2',
> + 'bootefi next 2',
> 'efidebug test bootmgr'])
> assert '\'HELLO2\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -104,8 +104,8 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -117,7 +117,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -142,8 +142,8 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -169,8 +169,8 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi.signed_2sigs -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi.signed_2sigs -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -181,7 +181,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -a -i 4000000:$filesize db'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -193,7 +193,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -204,7 +204,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -a -i 4000000:$filesize dbx'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -227,8 +227,8 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi.signed -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -239,7 +239,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -253,7 +253,7 @@ class TestEfiSignedImage(object):
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx'])
> assert 'Failed to set EFI variable' not in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> diff --git a/test/py/tests/test_efi_secboot/test_signed_intca.py b/test/py/tests/test_efi_secboot/test_signed_intca.py
> index d8d599d22f..b2eb6b6824 100644
> --- a/test/py/tests/test_efi_secboot/test_signed_intca.py
> +++ b/test/py/tests/test_efi_secboot/test_signed_intca.py
> @@ -39,8 +39,8 @@ class TestEfiSignedImageIntca(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO_a host 0:1 /helloworld.efi.signed_a -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO_a host 0:1 /helloworld.efi.signed_a -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO_a\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -48,8 +48,8 @@ class TestEfiSignedImageIntca(object):
> with u_boot_console.log.section('Test Case 1b'):
> # Test Case 1b, signed and authenticated by root CA
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 2 HELLO_ab host 0:1 /helloworld.efi.signed_ab -s ""',
> - 'efidebug boot next 2',
> + 'bootefi add -b 2 HELLO_ab host 0:1 /helloworld.efi.signed_ab -s ""',
> + 'bootefi next 2',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -70,8 +70,8 @@ class TestEfiSignedImageIntca(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO_abc host 0:1 /helloworld.efi.signed_abc -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO_abc host 0:1 /helloworld.efi.signed_abc -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO_abc\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -81,7 +81,7 @@ class TestEfiSignedImageIntca(object):
> output = u_boot_console.run_command_list([
> 'fatload host 0:1 4000000 db_b.auth',
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db',
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO_abc\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> @@ -91,7 +91,7 @@ class TestEfiSignedImageIntca(object):
> output = u_boot_console.run_command_list([
> 'fatload host 0:1 4000000 db_c.auth',
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db',
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -116,8 +116,8 @@ class TestEfiSignedImageIntca(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO_abc host 0:1 /helloworld.efi.signed_abc -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO_abc host 0:1 /helloworld.efi.signed_abc -s ""',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'Hello, world!' in ''.join(output)
> # Or,
> @@ -129,7 +129,7 @@ class TestEfiSignedImageIntca(object):
> output = u_boot_console.run_command_list([
> 'fatload host 0:1 4000000 dbx_c.auth',
> 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx',
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert '\'HELLO_abc\' failed' in ''.join(output)
> assert 'efi_start_image() returned: 26' in ''.join(output)
> diff --git a/test/py/tests/test_efi_secboot/test_unsigned.py b/test/py/tests/test_efi_secboot/test_unsigned.py
> index df63f0df08..8964595d85 100644
> --- a/test/py/tests/test_efi_secboot/test_unsigned.py
> +++ b/test/py/tests/test_efi_secboot/test_unsigned.py
> @@ -35,12 +35,12 @@ class TestEfiUnsignedImage(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'efi_start_image() returned: 26' in ''.join(output)
> assert 'Hello, world!' not in ''.join(output)
> @@ -64,8 +64,8 @@ class TestEfiUnsignedImage(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert 'Hello, world!' in ''.join(output)
>
> @@ -88,12 +88,12 @@ class TestEfiUnsignedImage(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'efi_start_image() returned: 26' in ''.join(output)
> assert 'Hello, world!' not in ''.join(output)
> @@ -106,12 +106,12 @@ class TestEfiUnsignedImage(object):
> assert 'Failed to set EFI variable' not in ''.join(output)
>
> output = u_boot_console.run_command_list([
> - 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> - 'efidebug boot next 1',
> + 'bootefi add -b 1 HELLO host 0:1 /helloworld.efi -s ""',
> + 'bootefi next 1',
> 'bootefi bootmgr'])
> assert '\'HELLO\' failed' in ''.join(output)
> output = u_boot_console.run_command_list([
> - 'efidebug boot next 1',
> + 'bootefi next 1',
> 'efidebug test bootmgr'])
> assert 'efi_start_image() returned: 26' in ''.join(output)
> assert 'Hello, world!' not in ''.join(output)
> --
> 2.33.1
>
More information about the U-Boot
mailing list