diff options
| -rw-r--r-- | arch/microblaze/lib/bootm.c | 4 | ||||
| -rw-r--r-- | arch/nios2/lib/bootm.c | 4 | ||||
| -rw-r--r-- | arch/openrisc/lib/bootm.c | 4 | ||||
| -rw-r--r-- | common/cmd_bootm.c | 44 | ||||
| -rw-r--r-- | common/image-fdt.c | 13 | ||||
| -rw-r--r-- | common/image.c | 22 | 
6 files changed, 54 insertions, 37 deletions
| diff --git a/arch/microblaze/lib/bootm.c b/arch/microblaze/lib/bootm.c index 384270900..b328f9497 100644 --- a/arch/microblaze/lib/bootm.c +++ b/arch/microblaze/lib/bootm.c @@ -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) diff --git a/arch/nios2/lib/bootm.c b/arch/nios2/lib/bootm.c index f32be5210..114e146d9 100644 --- a/arch/nios2/lib/bootm.c +++ b/arch/nios2/lib/bootm.c @@ -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; diff --git a/arch/openrisc/lib/bootm.c b/arch/openrisc/lib/bootm.c index 2c5d9aea9..7f716b859 100644 --- a/arch/openrisc/lib/bootm.c +++ b/arch/openrisc/lib/bootm.c @@ -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", 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]); diff --git a/common/image-fdt.c b/common/image-fdt.c index 0d421d92f..d99f444de 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -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);  			} diff --git a/common/image.c b/common/image.c index f863502ab..1be384f26 100644 --- a/common/image.c +++ b/common/image.c @@ -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 |