[U-Boot] [PATCH 6/6] efi_loader: bootmgr: run an EFI application of a given load option
AKASHI Takahiro
takahiro.akashi at linaro.org
Wed Oct 17 07:32:07 UTC 2018
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.akashi at 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
More information about the U-Boot
mailing list