With this patch applied, we will be able to selectively execute an EFI application by specifying a load option, say "-1" for Boot0001, "-2" for Boot0002 and so on.
=> bootefi bootmgr -1 <fdt addr> Please note that BootXXXX need not be included in "BootOrder". Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> --- cmd/bootefi.c | 19 ++++++++++++++++--- include/efi_loader.h | 3 ++- lib/efi_loader/efi_bootmgr.c | 8 +++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 5772f7422e5f..434a6a07c26a 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -508,7 +508,7 @@ exit: return ret; } -static int do_bootefi_bootmgr_exec(void) +static int do_bootefi_bootmgr_exec(int boot_id) { struct efi_device_path *device_path, *file_path; void *addr; @@ -520,7 +520,7 @@ static int do_bootefi_bootmgr_exec(void) */ efi_save_gd(); - addr = efi_bootmgr_load(&device_path, &file_path); + addr = efi_bootmgr_load(boot_id, &device_path, &file_path); if (!addr) return 1; @@ -605,6 +605,19 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } else #endif if (!strcmp(argv[1], "bootmgr")) { + char *endp; + int boot_id = -1; + + if ((argc > 2) && (argv[2][0] == '-')) { + boot_id = (int)simple_strtoul(&argv[2][1], &endp, 0); + if ((argv[2] + strlen(argv[2]) != endp) || + (boot_id > 0xffff)) + return CMD_RET_USAGE; + + argc--; + argv++; + } + if (efi_handle_fdt(argc > 2 ? argv[2] : NULL)) return CMD_RET_FAILURE; @@ -649,7 +662,7 @@ static char bootefi_help_text[] = " Use environment variable efi_selftest to select a single test.\n" " Use 'setenv efi_selftest list' to enumerate all tests.\n" #endif - "bootefi bootmgr [fdt addr]\n" + "bootefi bootmgr [-XXXX] [fdt addr]\n" " - load and boot EFI payload based on BootOrder/BootXXXX variables.\n" "\n" " If specified, the device tree located at <fdt address> gets\n" diff --git a/include/efi_loader.h b/include/efi_loader.h index 1cabb1680d20..5804c2b5015d 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -527,7 +527,8 @@ void efi_parse_load_option(struct load_option *lo, void *ptr); unsigned long efi_marshal_load_option(u32 attr, u16 *label, struct efi_device_path *file_path, char *option, void **data); -void *efi_bootmgr_load(struct efi_device_path **device_path, +void *efi_bootmgr_load(int boot_id, + struct efi_device_path **device_path, struct efi_device_path **file_path); #else /* CONFIG_IS_ENABLED(EFI_LOADER) */ diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index c2d29f956065..348f99a9ca25 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -165,7 +165,8 @@ error: * available load-options, finding and returning the first one that can * be loaded successfully. */ -void *efi_bootmgr_load(struct efi_device_path **device_path, +void *efi_bootmgr_load(int boot_id, + struct efi_device_path **device_path, struct efi_device_path **file_path) { uint16_t *bootorder; @@ -178,6 +179,11 @@ void *efi_bootmgr_load(struct efi_device_path **device_path, bs = systab.boottime; rs = systab.runtime; + if (boot_id != -1) { + image = try_load_entry(boot_id, device_path, file_path); + goto error; + } + bootorder = get_var(L"BootOrder", &efi_global_variable_guid, &size); if (!bootorder) goto error; -- 2.19.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot