sandbox: Filter arguments when starting U-Boot
authorSimon Glass <sjg@chromium.org>
Fri, 16 Nov 2018 01:44:07 +0000 (18:44 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 26 Nov 2018 13:25:37 +0000 (08:25 -0500)
The current method of starting U-Boot from U-Boot adds arguments to pass
the memory file through, so that memory is preserved. This is fine for a
single call, but if we call from TPL -> SPL -> U-Boot the arguments build
up and we have several memory files in the argument list.

Adjust the implementation to filter out arguments that we want to replace
with new ones. Also print a useful error if the exec() call fails.

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

index d817dcc47945a718996e863a0d5a516d3dfe8e91..7b59e040ecb16f1024b085521312d8889d04c5e8 100644 (file)
@@ -576,10 +576,10 @@ static int make_exec(char *fname, const void *data, int size)
  */
 static int add_args(char ***argvp, char *add_args[], int count)
 {
-       char **argv;
+       char **argv, **ap;
        int argc;
 
-       for (argv = *argvp, argc = 0; (*argvp)[argc]; argc++)
+       for (argc = 0; (*argvp)[argc]; argc++)
                ;
 
        argv = os_malloc((argc + count + 1) * sizeof(char *));
@@ -587,7 +587,24 @@ static int add_args(char ***argvp, char *add_args[], int count)
                printf("Out of memory for %d argv\n", count);
                return -ENOMEM;
        }
-       memcpy(argv, *argvp, argc * sizeof(char *));
+       for (ap = *argvp, argc = 0; *ap; ap++) {
+               char *arg = *ap;
+
+               /* Drop args that we don't want to propagate */
+               if (*arg == '-' && strlen(arg) == 2) {
+                       switch (arg[1]) {
+                       case 'j':
+                       case 'm':
+                               ap++;
+                               continue;
+                       }
+               } else if (!strcmp(arg, "--rm_memory")) {
+                       ap++;
+                       continue;
+               }
+               argv[argc++] = arg;
+       }
+
        memcpy(argv + argc, add_args, count * sizeof(char *));
        argv[argc + count] = NULL;
 
@@ -611,6 +628,7 @@ static int os_jump_to_file(const char *fname)
        int fd, err;
        char *extra_args[5];
        char **argv = state->argv;
+       int argc;
 #ifdef DEBUG
        int i;
 #endif
@@ -630,11 +648,13 @@ static int os_jump_to_file(const char *fname)
        extra_args[1] = (char *)fname;
        extra_args[2] = "-m";
        extra_args[3] = mem_fname;
-       extra_args[4] = "--rm_memory";
-       err = add_args(&argv, extra_args,
-                      sizeof(extra_args) / sizeof(extra_args[0]));
+       argc = 4;
+       if (state->ram_buf_rm)
+               extra_args[argc++] = "--rm_memory";
+       err = add_args(&argv, extra_args, argc);
        if (err)
                return err;
+       argv[0] = (char *)fname;
 
 #ifdef DEBUG
        for (i = 0; argv[i]; i++)