From mboxrd@z Thu Jan 1 00:00:00 1970 From: AKASHI Takahiro Date: Fri, 1 Mar 2019 10:26:02 +0900 Subject: [U-Boot] [PATCH v2 5/5] cmd: run: add "-e" option to run an EFI application In-Reply-To: <8c2fde68-6ce7-28c5-042e-fe072eccab90@gmx.de> References: <20190115025437.11966-1-takahiro.akashi@linaro.org> <20190115025437.11966-6-takahiro.akashi@linaro.org> <8c2fde68-6ce7-28c5-042e-fe072eccab90@gmx.de> Message-ID: <20190301012600.GZ20286@linaro.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: u-boot@lists.denx.de On Thu, Feb 28, 2019 at 09:59:14PM +0100, Heinrich Schuchardt wrote: > On 1/15/19 3:54 AM, AKASHI Takahiro wrote: > > "run -e" allows for executing EFI application with a specific "BootXXXX" > > variable. If no "BootXXXX" is specified or "BootOrder" is specified, > > it tries to run an EFI application specified in the order of "bootOrder." > > > > Signed-off-by: AKASHI Takahiro > > --- > > cmd/bootefi.c | 31 +++++++++++++++++++++++++++++++ > > cmd/nvedit.c | 9 ++++++++- > > common/cli.c | 10 ++++++++++ > > include/command.h | 3 +++ > > 4 files changed, 52 insertions(+), 1 deletion(-) > > > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > > index 241fd0f987ab..ebe149dffa1f 100644 > > --- a/cmd/bootefi.c > > +++ b/cmd/bootefi.c > > @@ -492,6 +492,37 @@ static int do_bootefi_bootmgr_exec(int boot_id) > > return CMD_RET_SUCCESS; > > } > > > > +/* Called by "run" command */ > > +int do_bootefi_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) > > +{ > > + int boot_id = -1; > > + char *endp; > > + > > + if (argc > 2) > > + return CMD_RET_USAGE; > > + > > + if (argc == 2) { > > + if (!strcmp(argv[1], "BootOrder")) { > > + boot_id = -1; > > + } else if (!strncmp(argv[2], "Boot", 4)) { > > + boot_id = (int)simple_strtoul(&argv[2][4], &endp, 0); > > + if ((argv[2] + strlen(argv[2]) != endp) || > > + boot_id > 0xffff) > > + return CMD_RET_USAGE; > > + } else { > > + return CMD_RET_USAGE; > > + } > > + } > > + > > + if (efi_init_obj_list()) > > + return CMD_RET_FAILURE; > > + > > + if (efi_handle_fdt(NULL)) > > + return CMD_RET_FAILURE; > > + > > + return do_bootefi_bootmgr_exec(boot_id); > > This function does not invoke: > >         allow_unaligned(); >         switch_to_non_secure_mode(); I've already fixed it in my pre-v3 patch. > Probably these calls should be moved to efi_init_obj_list() anyway. Can be, but the name no longer represents its function. -Takahiro Akashi > > Best regards > > Heinrich > > > +} > > + > > /* Interpreter command to boot an arbitrary EFI image from memory */ > > static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) > > { > > diff --git a/cmd/nvedit.c b/cmd/nvedit.c > > index de16c72c23f2..ce746bbf1b3e 100644 > > --- a/cmd/nvedit.c > > +++ b/cmd/nvedit.c > > @@ -1344,7 +1344,14 @@ U_BOOT_CMD_COMPLETE( > > run, CONFIG_SYS_MAXARGS, 1, do_run, > > "run commands in an environment variable", > > "var [...]\n" > > - " - run the commands in the environment variable(s) 'var'", > > + " - run the commands in the environment variable(s) 'var'" > > +#if defined(CONFIG_CMD_BOOTEFI) > > + "\n" > > + "run -e [BootXXXX]\n" > > + " - load and run UEFI app based on 'BootXXXX' UEFI variable", > > +#else > > + , > > +#endif > > var_complete > > ); > > #endif > > diff --git a/common/cli.c b/common/cli.c > > index 51b8d5f85cbb..fbb09d5049a4 100644 > > --- a/common/cli.c > > +++ b/common/cli.c > > @@ -12,6 +12,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > > > @@ -125,6 +126,15 @@ int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) > > if (argc < 2) > > return CMD_RET_USAGE; > > > > +#ifdef CONFIG_CMD_BOOTEFI > > + if (!strcmp(argv[1], "-e")) { > > + argc--; > > + argv++; > > + > > + return do_bootefi_run(cmdtp, flag, argc, argv); > > + } > > +#endif > > + > > for (i = 1; i < argc; ++i) { > > char *arg; > > > > diff --git a/include/command.h b/include/command.h > > index 200c7a5e9f4e..feddef300ccc 100644 > > --- a/include/command.h > > +++ b/include/command.h > > @@ -48,6 +48,9 @@ typedef struct cmd_tbl_s cmd_tbl_t; > > #if defined(CONFIG_CMD_RUN) > > extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); > > #endif > > +#if defined(CONFIG_CMD_BOOTEFI) > > +extern int do_bootefi_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); > > +#endif > > > > /* common/command.c */ > > int _do_help (cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, int > > >