In this patch, do_bootefi() will be reworked, without any functional
change, as it is a bit sloppy after Heinrich's "efi_loader: rework
loading and starting of images."

Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org>
---
 cmd/bootefi.c | 101 ++++++++++++++++++++++++++------------------------
 1 file changed, 52 insertions(+), 49 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index e064edcd0cdb..159dc1ab8a30 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -361,34 +361,68 @@ err_add_protocol:
        return ret;
 }
 
-static int do_bootefi_bootmgr_exec(void)
+static int do_bootefi_load_and_exec(const char *arg)
 {
-       struct efi_device_path *device_path, *file_path;
-       void *addr;
+       void *image_buf;
+       struct efi_device_path *device_path, *image_path;
+       const char *saddr;
+       unsigned long addr, size;
        efi_status_t r;
 
-       addr = efi_bootmgr_load(&device_path, &file_path);
-       if (!addr)
-               return 1;
+       if (!strcmp(arg, "bootmgr")) {
+               image_buf = efi_bootmgr_load(&device_path, &image_path);
+               if (!image_buf)
+                       return CMD_RET_FAILURE;
+
+               addr = map_to_sysmem(image_buf);
+       } else
+#ifdef CONFIG_CMD_BOOTEFI_HELLO
+       if (!strcmp(arg, "hello")) {
+               saddr = env_get("loadaddr");
+               size = __efi_helloworld_end - __efi_helloworld_begin;
+
+               if (saddr)
+                       addr = simple_strtoul(saddr, NULL, 16);
+               else
+                       addr = CONFIG_SYS_LOAD_ADDR;
+
+               image_buf = map_sysmem(addr, size);
+               memcpy(image_buf, __efi_helloworld_begin, size);
+
+               device_path = NULL;
+               image_path = NULL;
+       } else
+#endif
+       {
+               saddr = arg;
+               size = 0;
+
+               addr = simple_strtoul(saddr, NULL, 16);
+               /* Check that a numeric value was passed */
+               if (!addr && *saddr != '0')
+                       return CMD_RET_USAGE;
+
+               image_buf = map_sysmem(addr, size);
+
+               device_path = bootefi_device_path;
+               image_path = bootefi_image_path;
+       }
 
-       printf("## Starting EFI application at %p ...\n", addr);
-       r = do_bootefi_exec(addr, device_path, file_path);
-       printf("## Application terminated, r = %lu\n",
-              r & ~EFI_ERROR_MASK);
+       printf("## Starting EFI application at %08lx ...\n", addr);
+       r = do_bootefi_exec(image_buf, device_path, image_path);
+       printf("## Application terminated, r = %lu\n", r & ~EFI_ERROR_MASK);
 
        if (r != EFI_SUCCESS)
-               return 1;
+               return CMD_RET_FAILURE;
 
-       return 0;
+       return CMD_RET_SUCCESS;
 }
 
 /* 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[])
 {
-       unsigned long addr;
-       char *saddr;
-       efi_status_t r;
        unsigned long fdt_addr;
+       efi_status_t r;
 
        /* Allow unaligned memory access */
        allow_unaligned();
@@ -421,18 +455,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[])
                efi_install_configuration_table(&efi_guid_fdt, NULL);
                printf("WARNING: booting without device tree\n");
        }
-#ifdef CONFIG_CMD_BOOTEFI_HELLO
-       if (!strcmp(argv[1], "hello")) {
-               ulong size = __efi_helloworld_end - __efi_helloworld_begin;
 
-               saddr = env_get("loadaddr");
-               if (saddr)
-                       addr = simple_strtoul(saddr, NULL, 16);
-               else
-                       addr = CONFIG_SYS_LOAD_ADDR;
-               memcpy(map_sysmem(addr, size), __efi_helloworld_begin, size);
-       } else
-#endif
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
        if (!strcmp(argv[1], "selftest")) {
                struct efi_loaded_image_obj *image_obj;
@@ -447,30 +470,10 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[])
                r = efi_selftest(&image_obj->header, &systab);
                bootefi_run_finish(image_obj, loaded_image_info);
                return r != EFI_SUCCESS;
-       } else
-#endif
-       if (!strcmp(argv[1], "bootmgr")) {
-               return do_bootefi_bootmgr_exec();
-       } else {
-               saddr = argv[1];
-
-               addr = simple_strtoul(saddr, NULL, 16);
-               /* Check that a numeric value was passed */
-               if (!addr && *saddr != '0')
-                       return CMD_RET_USAGE;
-
        }
+#endif
 
-       printf("## Starting EFI application at %08lx ...\n", addr);
-       r = do_bootefi_exec(map_sysmem(addr, 0), bootefi_device_path,
-                           bootefi_image_path);
-       printf("## Application terminated, r = %lu\n",
-              r & ~EFI_ERROR_MASK);
-
-       if (r != EFI_SUCCESS)
-               return 1;
-       else
-               return 0;
+       return do_bootefi_load_and_exec(argv[1]);
 }
 
 #ifdef CONFIG_SYS_LONGHELP
@@ -489,7 +492,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 [fdt address]\n"
        "  - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
        "\n"
        "    If specified, the device tree located at <fdt address> gets\n"
-- 
2.19.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to