diff options
Diffstat (limited to 'common/cmd_bootm.c')
| -rw-r--r-- | common/cmd_bootm.c | 44 | 
1 files changed, 26 insertions, 18 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index e452fcac9..6a6241d32 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -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]); |