efi_loader: Use map_sysmem() in bootefi command
authorAlexander Graf <agraf@suse.de>
Mon, 18 Jun 2018 15:22:58 +0000 (17:22 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 25 Jul 2018 12:57:43 +0000 (14:57 +0200)
The bootefi command gets a few addresses as values passed in. In sandbox,
these values are in U-Boot address space, so we need to make sure we
explicitly call map_sysmem() on them to be able to access them.

Signed-off-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
cmd/bootefi.c

index bbfea919da8d1c0f6d7d7c9b60c5484cd1f28d1c..a0fd1a3158ba9a67a4372f124dcb1bbbc426fda6 100644 (file)
@@ -14,6 +14,7 @@
 #include <errno.h>
 #include <linux/libfdt.h>
 #include <linux/libfdt_env.h>
+#include <mapmem.h>
 #include <memalign.h>
 #include <asm/global_data.h>
 #include <asm-generic/sections.h>
@@ -431,7 +432,8 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        unsigned long addr;
        char *saddr;
        efi_status_t r;
-       void *fdt_addr;
+       unsigned long fdt_addr;
+       void *fdt;
 
        /* Allow unaligned memory access */
        allow_unaligned();
@@ -448,11 +450,12 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_USAGE;
 
        if (argc > 2) {
-               fdt_addr = (void *)simple_strtoul(argv[2], NULL, 16);
+               fdt_addr = simple_strtoul(argv[2], NULL, 16);
                if (!fdt_addr && *argv[2] != '0')
                        return CMD_RET_USAGE;
                /* Install device tree */
-               r = efi_install_fdt(fdt_addr);
+               fdt = map_sysmem(fdt_addr, 0);
+               r = efi_install_fdt(fdt);
                if (r != EFI_SUCCESS) {
                        printf("ERROR: failed to install device tree\n");
                        return CMD_RET_FAILURE;
@@ -471,7 +474,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        addr = simple_strtoul(saddr, NULL, 16);
                else
                        addr = CONFIG_SYS_LOAD_ADDR;
-               memcpy((char *)addr, __efi_helloworld_begin, size);
+               memcpy(map_sysmem(addr, size), __efi_helloworld_begin, size);
        } else
 #endif
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
@@ -517,7 +520,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
 
        printf("## Starting EFI application at %08lx ...\n", addr);
-       r = do_bootefi_exec((void *)addr, bootefi_device_path,
+       r = do_bootefi_exec(map_sysmem(addr, 0), bootefi_device_path,
                            bootefi_image_path);
        printf("## Application terminated, r = %lu\n",
               r & ~EFI_ERROR_MASK);