sandbox: Boot in U-Boot through the standard call
authorSimon Glass <sjg@chromium.org>
Fri, 16 Nov 2018 01:44:08 +0000 (18:44 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 26 Nov 2018 13:25:37 +0000 (08:25 -0500)
Most architectures use jump_to_image_no_args() to jump from SPL to U-Boot.
At present sandbox is special in that it jumps in its
spl_board_load_image() call. This is not strictly correct, and means that
sandbox misses out some parts of board_init_r(), just as calling
bloblist_finish(), for example.

Change spl_board_load_image() to just identify the filename to boot, and
implement jump_to_image_no_args() to actually jump to it.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/sandbox/cpu/os.c
arch/sandbox/cpu/spl.c

index 7b59e040ecb16f1024b085521312d8889d04c5e8..aa926943427230c92a11ea2a284f8e8732ba5a9b 100644 (file)
@@ -666,8 +666,11 @@ static int os_jump_to_file(const char *fname)
 
        err = execv(fname, argv);
        os_free(argv);
-       if (err)
+       if (err) {
+               perror("Unable to run image");
+               printf("Image filename '%s'\n", mem_fname);
                return err;
+       }
 
        return unlink(fname);
 }
@@ -747,17 +750,7 @@ int os_find_u_boot(char *fname, int maxlen)
 
 int os_spl_to_uboot(const char *fname)
 {
-       struct sandbox_state *state = state_get_current();
-       char *argv[state->argc + 1];
-       int ret;
-
-       memcpy(argv, state->argv, sizeof(char *) * (state->argc + 1));
-       argv[0] = (char *)fname;
-       ret = execv(fname, argv);
-       if (ret)
-               return ret;
-
-       return unlink(fname);
+       return os_jump_to_file(fname);
 }
 
 void os_localtime(struct rtc_time *rt)
index 49f98644c02f80ed1e184b38a500212e5990956d..5005ed2f54a5506ba1b50f9d2dce04d1eec4ca79 100644 (file)
@@ -37,8 +37,12 @@ static int spl_board_load_image(struct spl_image_info *spl_image,
                return ret;
        }
 
-       /* Hopefully this will not return */
-       return os_spl_to_uboot(fname);
+       /* Set up spl_image to boot from jump_to_image_no_args() */
+       spl_image->arg = strdup(fname);
+       if (!spl_image->arg)
+               return log_msg_ret("Setup exec filename", -ENOMEM);
+
+       return 0;
 }
 SPL_LOAD_IMAGE_METHOD("sandbox", 0, BOOT_DEVICE_BOARD, spl_board_load_image);
 
@@ -60,3 +64,12 @@ void spl_board_init(void)
                        ;
        }
 }
+
+void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
+{
+       const char *fname = spl_image->arg;
+
+       os_fd_restore();
+       os_spl_to_uboot(fname);
+       hang();
+}