]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sandbox: Support executables for more phases
authorSimon Glass <sjg@chromium.org>
Mon, 5 Jul 2021 22:32:45 +0000 (16:32 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 21 Jul 2021 16:27:34 +0000 (10:27 -0600)
The SPL header has a function for obtaining the phase in capital letters,
e.g. 'SPL'. Add one for lower-case also, as used by sandbox.

Use this to generalise the sandbox logic for determining the filename of
the next sandbox executable. This can provide support for VPL.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/sandbox/cpu/os.c
arch/sandbox/cpu/spl.c
arch/sandbox/include/asm/spl.h
include/os.h
include/spl.h
test/image/spl_load.c

index 0d21827e1b73f7eeccb20a75715a5572b8440248..a8aa9def27f2c9bd82eabc143d5e106e4f665b25 100644 (file)
@@ -783,12 +783,14 @@ int os_jump_to_image(const void *dest, int size)
        return os_jump_to_file(fname, true);
 }
 
-int os_find_u_boot(char *fname, int maxlen, bool use_img)
+int os_find_u_boot(char *fname, int maxlen, bool use_img,
+                  const char *cur_prefix, const char *next_prefix)
 {
        struct sandbox_state *state = state_get_current();
        const char *progname = state->argv[0];
        int len = strlen(progname);
-       const char *suffix;
+       char subdir[10];
+       char *suffix;
        char *p;
        int fd;
 
@@ -798,45 +800,36 @@ int os_find_u_boot(char *fname, int maxlen, bool use_img)
        strcpy(fname, progname);
        suffix = fname + len - 4;
 
-       /* If we are TPL, boot to SPL */
-       if (!strcmp(suffix, "-tpl")) {
-               fname[len - 3] = 's';
-               fd = os_open(fname, O_RDONLY);
-               if (fd >= 0) {
-                       close(fd);
-                       return 0;
-               }
-
-               /* Look for 'u-boot-spl' in the spl/ directory */
-               p = strstr(fname, "/spl/");
-               if (p) {
-                       p[1] = 's';
-                       fd = os_open(fname, O_RDONLY);
-                       if (fd >= 0) {
-                               close(fd);
-                               return 0;
-                       }
-               }
-               return -ENOENT;
-       }
+       /* Change the existing suffix to the new one */
+       if (*suffix != '-')
+               return -EINVAL;
 
-       /* Look for 'u-boot' in the same directory as 'u-boot-spl' */
-       if (!strcmp(suffix, "-spl")) {
-               fname[len - 4] = '\0';
-               fd = os_open(fname, O_RDONLY);
-               if (fd >= 0) {
-                       close(fd);
-                       return 0;
-               }
+       if (*next_prefix)
+               strcpy(suffix + 1, next_prefix);  /* e.g. "-tpl" to "-spl" */
+       else
+               *suffix = '\0';  /* e.g. "-spl" to "" */
+       fd = os_open(fname, O_RDONLY);
+       if (fd >= 0) {
+               close(fd);
+               return 0;
        }
 
-       /* Look for 'u-boot' in the parent directory of spl/ */
-       p = strstr(fname, "spl/");
+       /*
+        * We didn't find it, so try looking for 'u-boot-xxx' in the xxx/
+        * directory. Replace the old dirname with the new one.
+        */
+       snprintf(subdir, sizeof(subdir), "/%s/", cur_prefix);
+       p = strstr(fname, subdir);
        if (p) {
-               /* Remove the "spl" characters */
-               memmove(p, p + 4, strlen(p + 4) + 1);
+               if (*next_prefix)
+                       /* e.g. ".../tpl/u-boot-spl"  to "../spl/u-boot-spl" */
+                       memcpy(p + 1, next_prefix, strlen(next_prefix));
+               else
+                       /* e.g. ".../spl/u-boot" to ".../u-boot" */
+                       strcpy(p, p + 1 + strlen(cur_prefix));
                if (use_img)
                        strcat(p, ".img");
+
                fd = os_open(fname, O_RDONLY);
                if (fd >= 0) {
                        close(fd);
index f82b0d3de16138c88f6b4917a4e8a0f379b0bdf0..650bdb0a7014ecd7c764d0097f036e5b45f8c06f 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+int sandbox_find_next_phase(char *fname, int maxlen, bool use_img)
+{
+       const char *cur_prefix, *next_prefix;
+       int ret;
+
+       cur_prefix = spl_phase_prefix(spl_phase());
+       next_prefix = spl_phase_prefix(spl_next_phase());
+       ret = os_find_u_boot(fname, maxlen, use_img, cur_prefix, next_prefix);
+       if (ret)
+               return log_msg_ret("find", ret);
+
+       return 0;
+}
+
 /* SPL / TPL init function */
 void board_init_f(ulong flag)
 {
@@ -37,7 +51,7 @@ static int spl_board_load_image(struct spl_image_info *spl_image,
        char fname[256];
        int ret;
 
-       ret = os_find_u_boot(fname, sizeof(fname), false);
+       ret = sandbox_find_next_phase(fname, sizeof(fname), false);
        if (ret) {
                printf("(%s not found, error %d)\n", fname, ret);
                return ret;
index 51e9d95d557ec17fff180ec797503f1f2bfcd473..d25dc7c82a03d5e8c2c562de834ce9da05de523c 100644 (file)
@@ -12,4 +12,17 @@ enum {
        BOOT_DEVICE_BOARD,
 };
 
+/**
+ * sandbox_find_next_phase() - Find the next phase of U-Boot
+ *
+ * This function is intended to be called from within sandbox SPL. It uses
+ * a few rules to find the filename of the next U-Boot phase. See also
+ * os_find_u_boot().
+ *
+ * @fname:     place to put full path to U-Boot
+ * @maxlen:    maximum size of @fname
+ * @use_img:   select the 'u-boot.img' file instead of the 'u-boot' ELF file
+ */
+int sandbox_find_next_phase(char *fname, int maxlen, bool use_img);
+
 #endif
index bd1096eb8b3189cc574a956dd75087d9b0681e32..7b20d606dd04371c30e2f94edae322b286cddaba 100644 (file)
@@ -327,9 +327,12 @@ int os_jump_to_image(const void *dest, int size);
  * @fname:     place to put full path to U-Boot
  * @maxlen:    maximum size of @fname
  * @use_img:   select the 'u-boot.img' file instead of the 'u-boot' ELF file
+ * @cur_prefix:        prefix of current executable, e.g. "spl" or "tpl"
+ * @next_prefix: prefix of executable to find, e.g. "spl" or ""
  * Return:     0 if OK, -NOSPC if the filename is too large, -ENOENT if not found
  */
-int os_find_u_boot(char *fname, int maxlen, bool use_img);
+int os_find_u_boot(char *fname, int maxlen, bool use_img,
+                  const char *cur_prefix, const char *next_prefix);
 
 /**
  * os_spl_to_uboot() - Run U-Boot proper
index c643943482d64293c79715ea06a7773b6f263274..d88fb79a676fa131afb4752ccf7046fd630cd360 100644 (file)
@@ -176,6 +176,27 @@ static inline const char *spl_phase_name(enum u_boot_phase phase)
        }
 }
 
+/**
+ * spl_phase_prefix() - Get the prefix  of the current phase
+ *
+ * @phase: Phase to look up
+ * @return phase prefix ("spl", "tpl", etc.)
+ */
+static inline const char *spl_phase_prefix(enum u_boot_phase phase)
+{
+       switch (phase) {
+       case PHASE_TPL:
+               return "tpl";
+       case PHASE_SPL:
+               return "spl";
+       case PHASE_BOARD_F:
+       case PHASE_BOARD_R:
+               return "";
+       default:
+               return "phase?";
+       }
+}
+
 /* A string name for SPL or TPL */
 #ifdef CONFIG_SPL_BUILD
 # ifdef CONFIG_TPL_BUILD
index 851603ddd759daa7d555e2ba9916ab69f11f7fc3..e7cabf5680cf58bd505c617854b52fae61f05db5 100644 (file)
@@ -56,6 +56,7 @@ struct image_header *spl_get_load_buffer(ssize_t offset, size_t size)
 
 static int spl_test_load(struct unit_test_state *uts)
 {
+       const char *cur_prefix, *next_prefix;
        struct spl_image_info image;
        struct image_header *header;
        struct text_ctx text_ctx;
@@ -68,7 +69,10 @@ static int spl_test_load(struct unit_test_state *uts)
        load.bl_len = 512;
        load.read = read_fit_image;
 
-       ret = os_find_u_boot(fname, sizeof(fname), true);
+       cur_prefix = spl_phase_prefix(spl_phase());
+       next_prefix = spl_phase_prefix(spl_next_phase());
+       ret = os_find_u_boot(fname, sizeof(fname), true, cur_prefix,
+                            next_prefix);
        if (ret) {
                printf("(%s not found, error %d)\n", fname, ret);
                return ret;