|
@@ -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),
|
|
* - verified image architecture (PPC) and type (KERNEL or MULTI),
|
|
* - loaded (first part of) image to header load address,
|
|
* - loaded (first part of) image to header load address,
|
|
* - disabled interrupts.
|
|
* - 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[],
|
|
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
|
|
#ifdef CONFIG_BOOTM_LINUX
|
|
extern boot_os_fn do_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;
|
|
return 0;
|
|
}
|
|
}
|
|
appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep);
|
|
appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep);
|
|
- (*appl)(argc-1, &argv[1]);
|
|
|
|
|
|
+ (*appl)(argc, argv);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -486,17 +495,15 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
cmd_tbl_t *c;
|
|
cmd_tbl_t *c;
|
|
boot_os_fn *boot_fn;
|
|
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) {
|
|
if (c) {
|
|
state = (long)c->cmd;
|
|
state = (long)c->cmd;
|
|
|
|
|
|
/* treat start special since it resets the state machine */
|
|
/* 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);
|
|
return bootm_start(cmdtp, flag, argc, argv);
|
|
- }
|
|
|
|
} else {
|
|
} else {
|
|
/* Unrecognized command */
|
|
/* Unrecognized command */
|
|
return CMD_RET_USAGE;
|
|
return CMD_RET_USAGE;
|
|
@@ -611,11 +618,12 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* determine if we have a sub command */
|
|
/* determine if we have a sub command */
|
|
- if (argc > 1) {
|
|
|
|
|
|
+ argc--; argv++;
|
|
|
|
+ if (argc > 0) {
|
|
char *endp;
|
|
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
|
|
* valid number, pass it along to the normal bootm processing
|
|
*
|
|
*
|
|
* If endp is ':' or '#' assume a FIT identifier so pass
|
|
* 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
|
|
#endif
|
|
|
|
|
|
/* find out kernel image address */
|
|
/* find out kernel image address */
|
|
- if (argc < 2) {
|
|
|
|
|
|
+ if (argc < 1) {
|
|
img_addr = load_addr;
|
|
img_addr = load_addr;
|
|
debug("* kernel: default image load address = 0x%08lx\n",
|
|
debug("* kernel: default image load address = 0x%08lx\n",
|
|
load_addr);
|
|
load_addr);
|
|
#if defined(CONFIG_FIT)
|
|
#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)) {
|
|
&fit_uname_config)) {
|
|
debug("* kernel: config '%s' from image at 0x%08lx\n",
|
|
debug("* kernel: config '%s' from image at 0x%08lx\n",
|
|
fit_uname_config, img_addr);
|
|
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)) {
|
|
&fit_uname_kernel)) {
|
|
debug("* kernel: subimage '%s' from image at 0x%08lx\n",
|
|
debug("* kernel: subimage '%s' from image at 0x%08lx\n",
|
|
fit_uname_kernel, img_addr);
|
|
fit_uname_kernel, img_addr);
|
|
#endif
|
|
#endif
|
|
} else {
|
|
} 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);
|
|
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";
|
|
consdev = "scc3";
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- if (argc > 2) {
|
|
|
|
|
|
+ if (argc > 0) {
|
|
ulong len;
|
|
ulong len;
|
|
int i;
|
|
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;
|
|
len += strlen(argv[i]) + 1;
|
|
cmdline = malloc(len);
|
|
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++] = ' ';
|
|
cmdline[len++] = ' ';
|
|
strcpy(&cmdline[len], argv[i]);
|
|
strcpy(&cmdline[len], argv[i]);
|
|
len += strlen(argv[i]);
|
|
len += strlen(argv[i]);
|