[U-Boot] [RFC 8/8] cmd: add efibootmgr command

AKASHI Takahiro
2019-03-05T05:53:37Z

Add CONFIG_CMD_STANDALONE_EFIBOOTMGR.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
cmd/Kconfig | 8 ++++++++
cmd/bootefi.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index 4bcc5c45579d..aa27b21956b3 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -224,6 +224,14 @@ config CMD_BOOTEFI
help
Boot an EFI image from memory.

+config CMD_STANDALONE_EFIBOOTMGR
+ bool "Enable EFI Boot Manager as a standalone command"
+ depends on CMD_BOOTEFI
+ default n
+ help
+ With this option enabled, EFI Boot Manager can be invoked
+ as a standalone command.
+
config CMD_BOOTEFI_HELLO_COMPILE
bool "Compile a standard EFI hello world binary for testing"
depends on CMD_BOOTEFI && !CPU_V7M && !SANDBOX
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 00cacbdd4231..6becd37e17a4 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -656,3 +656,38 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
bootefi_image_path = NULL;
}
}
+
+#ifdef CONFIG_CMD_STANDALONE_EFIBOOTMGR
+static int do_efibootmgr_cmd(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
+{
+ char *fdt_opt;
+ int ret;
+
+ if (argc != 1)
+ return CMD_RET_USAGE;
+
+ fdt_opt = env_get("fdtaddr");
+ if (!fdt_opt)
+ fdt_opt = env_get("fdtcontroladdr");
+
+ ret = do_efibootmgr(fdt_opt);
+
+ free(fdt_opt);
+
+ return ret;
+}
+
+#ifdef CONFIG_SYS_LONGHELP
+static char efibootmgr_help_text[] =
+ "(no arguments)\n"
+ " - Launch EFI boot manager and execute EFI application\n"
+ " based on BootNext and BootOrder variables\n";
+#endif
+
+U_BOOT_CMD(
+ efibootmgr, 1, 0, do_efibootmgr_cmd,
+ "Launch EFI boot manager",
+ efibootmgr_help_text
+);
+#endif /* CONFIG_CMD_STANDALONE_EFIBOOTMGR */
--
2.20.1