Clarify bootm OS arguments
authorSimon Glass <sjg@chromium.org>
Tue, 11 Jun 2013 18:14:46 +0000 (11:14 -0700)
committerTom Rini <trini@ti.com>
Wed, 26 Jun 2013 14:16:41 +0000 (10:16 -0400)
At present the arguments to bootm are processed in a somewhat confusing
way. Sub-functions must know how many arguments their calling functions
have processed, and the OS boot function must also have this information.
Also it isn't obvious that 'bootm' and 'bootm start' provide arguments in
the same way.

Adjust the code so that arguments are removed from the list before calling
a sub-function. This means that all functions can know that argv[0] is the
first argument of which they need to take notice.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/microblaze/lib/bootm.c
arch/nios2/lib/bootm.c
arch/openrisc/lib/bootm.c
common/cmd_bootm.c
common/image-fdt.c
common/image.c

index 38427090011b204cc4c09791a785a84fcfb3255a..b328f9497161c57424f2c3b87e63afd6cd2ba671 100644 (file)
@@ -62,8 +62,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 
        bootstage_mark(BOOTSTAGE_ID_RUN_OS);
 
-       if (!of_flat_tree && argc > 3)
-               of_flat_tree = (char *)simple_strtoul(argv[3], NULL, 16);
+       if (!of_flat_tree && argc > 1)
+               of_flat_tree = (char *)simple_strtoul(argv[1], NULL, 16);
 
        /* fixup the initrd now that we know where it should be */
        if (images->rd_start && images->rd_end && of_flat_tree)
index f32be52108212477507b51b163fbe0563a0e7874..114e146d9b3d0af8ccfe0c6b685d376a1bd6c099 100644 (file)
@@ -40,8 +40,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
        if (images->ft_len)
                of_flat_tree = images->ft_addr;
 #endif
-       if (!of_flat_tree && argc > 3)
-               of_flat_tree = (char *)simple_strtoul(argv[3], NULL, 16);
+       if (!of_flat_tree && argc > 1)
+               of_flat_tree = (char *)simple_strtoul(argv[1], NULL, 16);
        if (of_flat_tree)
                initrd_end = (ulong)of_flat_tree;
 
index 2c5d9aea9969650d0be7a0e4883e5121c36691e7..7f716b85982f957896c5a13b9164f5069a8fc2e0 100644 (file)
@@ -63,8 +63,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
 
        show_boot_progress(15);
 
-       if (!of_flat_tree && argc > 3)
-               of_flat_tree = (char *)simple_strtoul(argv[3], NULL, 16);
+       if (!of_flat_tree && argc > 1)
+               of_flat_tree = (char *)simple_strtoul(argv[1], NULL, 16);
 #ifdef DEBUG
        printf("## Transferring control to Linux (at address 0x%08lx) " \
                                "ramdisk 0x%08lx, FDT 0x%08lx...\n",
index e452fcac9308ee14e42f0162a561c540d4c763f9..6a6241d32798d7d97f740f39e99a80ecf8698a3b 100644 (file)
@@ -104,9 +104,18 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
  *  - verified image architecture (PPC) and type (KERNEL or MULTI),
  *  - loaded (first part of) image to header load address,
  *  - disabled interrupts.
+ *
+ * @flag: Command flags (CMD_FLAG_...)
+ * @argc: Number of arguments. Note that the arguments are shifted down
+ *      so that 0 is the first argument not processed by U-Boot, and
+ *      argc is adjusted accordingly. This avoids confusion as to how
+ *      many arguments are available for the OS.
+ * @images: Pointers to os/initrd/fdt
+ * @return 1 on error. On success the OS boots so this function does
+ * not return.
  */
 typedef int boot_os_fn(int flag, int argc, char * const argv[],
-                       bootm_headers_t *images); /* pointers to os/initrd/fdt */
+                       bootm_headers_t *images);
 
 #ifdef CONFIG_BOOTM_LINUX
 extern boot_os_fn do_bootm_linux;
@@ -457,7 +466,7 @@ static int bootm_start_standalone(ulong iflag, int argc, char * const argv[])
                return 0;
        }
        appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep);
-       (*appl)(argc-1, &argv[1]);
+       (*appl)(argc, argv);
        return 0;
 }
 
@@ -486,17 +495,15 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
        cmd_tbl_t *c;
        boot_os_fn *boot_fn;
 
-       c = find_cmd_tbl(argv[1], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub));
+       c = find_cmd_tbl(argv[0], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub));
+       argc--; argv++;
 
        if (c) {
                state = (long)c->cmd;
 
                /* treat start special since it resets the state machine */
-               if (state == BOOTM_STATE_START) {
-                       argc--;
-                       argv++;
+               if (state == BOOTM_STATE_START)
                        return bootm_start(cmdtp, flag, argc, argv);
-               }
        } else {
                /* Unrecognized command */
                return CMD_RET_USAGE;
@@ -611,11 +618,12 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 
        /* determine if we have a sub command */
-       if (argc > 1) {
+       argc--; argv++;
+       if (argc > 0) {
                char *endp;
 
-               simple_strtoul(argv[1], &endp, 16);
-               /* endp pointing to NULL means that argv[1] was just a
+               simple_strtoul(argv[0], &endp, 16);
+               /* endp pointing to NULL means that argv[0] was just a
                 * valid number, pass it along to the normal bootm processing
                 *
                 * If endp is ':' or '#' assume a FIT identifier so pass
@@ -816,22 +824,22 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 #endif
 
        /* find out kernel image address */
-       if (argc < 2) {
+       if (argc < 1) {
                img_addr = load_addr;
                debug("*  kernel: default image load address = 0x%08lx\n",
                                load_addr);
 #if defined(CONFIG_FIT)
-       } else if (fit_parse_conf(argv[1], load_addr, &img_addr,
+       } else if (fit_parse_conf(argv[0], load_addr, &img_addr,
                                                        &fit_uname_config)) {
                debug("*  kernel: config '%s' from image at 0x%08lx\n",
                                fit_uname_config, img_addr);
-       } else if (fit_parse_subimage(argv[1], load_addr, &img_addr,
+       } else if (fit_parse_subimage(argv[0], load_addr, &img_addr,
                                                        &fit_uname_kernel)) {
                debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
                                fit_uname_kernel, img_addr);
 #endif
        } else {
-               img_addr = simple_strtoul(argv[1], NULL, 16);
+               img_addr = simple_strtoul(argv[0], NULL, 16);
                debug("*  kernel: cmdline image address = 0x%08lx\n", img_addr);
        }
 
@@ -1401,16 +1409,16 @@ static int do_bootm_netbsd(int flag, int argc, char * const argv[],
        consdev = "scc3";
 #endif
 
-       if (argc > 2) {
+       if (argc > 0) {
                ulong len;
                int   i;
 
-               for (i = 2, len = 0; i < argc; i += 1)
+               for (i = 0, len = 0; i < argc; i += 1)
                        len += strlen(argv[i]) + 1;
                cmdline = malloc(len);
 
-               for (i = 2, len = 0; i < argc; i += 1) {
-                       if (i > 2)
+               for (i = 0, len = 0; i < argc; i += 1) {
+                       if (i > 0)
                                cmdline[len++] = ' ';
                        strcpy(&cmdline[len], argv[i]);
                        len += strlen(argv[i]);
index 0d421d92fb66b55423b269eeca9e0d425d1f5fa2..d99f444de126813476f371d5cebcfdd28281073c 100644 (file)
@@ -248,13 +248,16 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
        ulong           default_addr;
        int             fdt_noffset;
 #endif
+       const char *select = NULL;
 
        *of_flat_tree = NULL;
        *of_size = 0;
 
-       if (argc > 3 || genimg_has_config(images)) {
+       if (argc > 2)
+               select = argv[2];
+       if (select || genimg_has_config(images)) {
 #if defined(CONFIG_FIT)
-               if (argc > 3) {
+               if (select) {
                        /*
                         * If the FDT blob comes from the FIT image and the
                         * FIT image address is omitted in the command line
@@ -268,18 +271,18 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                        else
                                default_addr = load_addr;
 
-                       if (fit_parse_conf(argv[3], default_addr,
+                       if (fit_parse_conf(select, default_addr,
                                           &fdt_addr, &fit_uname_config)) {
                                debug("*  fdt: config '%s' from image at 0x%08lx\n",
                                      fit_uname_config, fdt_addr);
-                       } else if (fit_parse_subimage(argv[3], default_addr,
+                       } else if (fit_parse_subimage(select, default_addr,
                                   &fdt_addr, &fit_uname_fdt)) {
                                debug("*  fdt: subimage '%s' from image at 0x%08lx\n",
                                      fit_uname_fdt, fdt_addr);
                        } else
 #endif
                        {
-                               fdt_addr = simple_strtoul(argv[3], NULL, 16);
+                               fdt_addr = simple_strtoul(select, NULL, 16);
                                debug("*  fdt: cmdline image address = 0x%08lx\n",
                                      fdt_addr);
                        }
index f863502ab130d0bf08ab1f8cf8e526c31484956a..1be384f26a85964d6b6b84a110b65038e89467a8 100644 (file)
@@ -816,20 +816,23 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
        ulong           default_addr;
        int             rd_noffset;
 #endif
+       const char *select = NULL;
 
        *rd_start = 0;
        *rd_end = 0;
 
+       if (argc >= 2)
+               select = argv[1];
        /*
         * Look for a '-' which indicates to ignore the
         * ramdisk argument
         */
-       if ((argc >= 3) && (strcmp(argv[2], "-") ==  0)) {
+       if (select && strcmp(select, "-") ==  0) {
                debug("## Skipping init Ramdisk\n");
                rd_len = rd_data = 0;
-       } else if (argc >= 3 || genimg_has_config(images)) {
+       } else if (select || genimg_has_config(images)) {
 #if defined(CONFIG_FIT)
-               if (argc >= 3) {
+               if (select) {
                        /*
                         * If the init ramdisk comes from the FIT image and
                         * the FIT image address is omitted in the command
@@ -841,12 +844,12 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                        else
                                default_addr = load_addr;
 
-                       if (fit_parse_conf(argv[2], default_addr,
-                                               &rd_addr, &fit_uname_config)) {
+                       if (fit_parse_conf(select, default_addr,
+                                          &rd_addr, &fit_uname_config)) {
                                debug("*  ramdisk: config '%s' from image at "
                                                "0x%08lx\n",
                                                fit_uname_config, rd_addr);
-                       } else if (fit_parse_subimage(argv[2], default_addr,
+                       } else if (fit_parse_subimage(select, default_addr,
                                                &rd_addr, &fit_uname_ramdisk)) {
                                debug("*  ramdisk: subimage '%s' from image at "
                                                "0x%08lx\n",
@@ -854,7 +857,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                        } else
 #endif
                        {
-                               rd_addr = simple_strtoul(argv[2], NULL, 16);
+                               rd_addr = simple_strtoul(select, NULL, 16);
                                debug("*  ramdisk: cmdline image address = "
                                                "0x%08lx\n",
                                                rd_addr);
@@ -918,7 +921,10 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
 #endif
                default:
 #ifdef CONFIG_SUPPORT_RAW_INITRD
-                       if (argc >= 3 && (end = strchr(argv[2], ':'))) {
+                       end = NULL;
+                       if (select)
+                               end = strchr(select, ':');
+                       if (end) {
                                rd_len = simple_strtoul(++end, NULL, 16);
                                rd_data = rd_addr;
                        } else