[RFC 1/1] efi_loader: rename 'efidebug boot' 'bootefi'

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sat Jan 15 01:49:07 CET 2022


The efidebug command was conceived for testing purposes.
The manipulation of boot options does better fit to the bootefi command
that is used to invoke the boot manager.

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