Skip to contentSkip to conversation

bootm: Add sub commands

RFC PATCH Superseded Kumar Gala 3 participants 12 messages Sep 23, 2008 – Oct 14, 2008

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Kumar Gala

author
#0 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---
 common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
 include/image.h    |   20 ++++-
 lib_ppc/bootm.c    |  262 ++++++++++++++++++++++++++++++++++------------------
 3 files changed, 330 insertions(+), 94 deletions(-)
common/cmd_bootm.c +141 -1
index 19257bb..e6dcb7a 100644
@@ -34,6 +34,7 @@
 #include <bzlib.h>
 #include <environment.h>
 #include <lmb.h>
+#include <linux/ctype.h>
 #include <asm/byteorder.h>
 
 #if defined(CONFIG_CMD_USB)
@@ -273,7 +274,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 	}
 
 	images.os.start = (ulong)os_hdr;
-	images.valid = 1;
+	images.state = BOOTM_STATE_START;
 
 	return 0;
 }
@@ -376,6 +377,113 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
 	return 0;
 }
 
+/* we over load the cmd field with our state machine info instead of a
+ * function pointer */
+cmd_tbl_t cmd_bootm_sub[] = {
+	U_BOOT_CMD_MKENT(start, 0, 1, (void *)BOOTM_STATE_START, "", ""),
+	U_BOOT_CMD_MKENT(loados, 0, 1, (void *)BOOTM_STATE_LOADOS, "", ""),
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
+	U_BOOT_CMD_MKENT(ramdisk, 0, 1, (void *)BOOTM_STATE_RAMDISK, "", ""),
+#endif
+#ifdef CONFIG_OF_LIBFDT
+	U_BOOT_CMD_MKENT(fdt, 0, 1, (void *)BOOTM_STATE_FDT, "", ""),
+#endif
+	U_BOOT_CMD_MKENT(bdt, 0, 1, (void *)BOOTM_STATE_OS_BD_T, "", ""),
+	U_BOOT_CMD_MKENT(cmdline, 0, 1, (void *)BOOTM_STATE_OS_CMDLINE, "", ""),
+	U_BOOT_CMD_MKENT(prep, 0, 1, (void *)BOOTM_STATE_OS_PREP, "", ""),
+	U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""),
+};
+
+int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	int ret = 0;
+	int state;
+	cmd_tbl_t *c;
+
+	c = find_cmd_tbl(argv[1], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub));
+
+	if (c) {
+		state = (int)c->cmd;
+
+		/* treat start special since it resets the state machine */
+		if (state == BOOTM_STATE_START) {
+			argc--;
+			argv++;
+			return bootm_start(cmdtp, flag, argc, argv);
+		}
+	}
+	/* Unrecognized command */
+	else {
+		printf ("Usage:\n%s\n", cmdtp->usage);
+		return 1;
+	}
+
+	if (images.state >= state) {
+		printf ("Trying to execute a command out of order\n");
+		printf ("Usage:\n%s\n", cmdtp->usage);
+		return 1;
+	}
+
+	images.state |= state;
+
+	switch (state) {
+		ulong load_end;
+		case BOOTM_STATE_START:
+			/* should never occur */
+			break;
+		case BOOTM_STATE_LOADOS:
+			ret = bootm_load_os(images.os, &load_end, 0);
+			if (ret)
+				return ret;
+
+			lmb_reserve(&images.lmb, images.os.load,
+					(load_end - images.os.load));
+			break;
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
+		case BOOTM_STATE_RAMDISK:
+		{
+			ulong rd_len = images.rd_end - images.rd_start;
+			char str[17];
+
+			ret = boot_ramdisk_high(&images.lmb, images.rd_start,
+				rd_len, &images.initrd_start, &images.initrd_end);
+			if (ret)
+				return ret;
+
+			sprintf(str, "%lx", images.initrd_start);
+			setenv("initrd_start", str);
+			sprintf(str, "%lx", images.initrd_end);
+			setenv("initrd_end", str);
+		}
+			break;
+#endif
+#ifdef CONFIG_OF_LIBFDT
+		case BOOTM_STATE_FDT:
+		{
+			ulong bootmap_base = getenv_bootm_low();
+			ret = boot_relocate_fdt(&images.lmb, bootmap_base,
+				&images.ft_addr, &images.ft_len);
+			break;
+		}
+#endif
+		case BOOTM_STATE_OS_CMDLINE:
+			do_bootm_linux(BOOTM_STATE_OS_CMDLINE, argc, argv, &images);
+			break;
+		case BOOTM_STATE_OS_BD_T:
+			do_bootm_linux(BOOTM_STATE_OS_BD_T, argc, argv, &images);
+			break;
+		case BOOTM_STATE_OS_PREP:
+			do_bootm_linux(BOOTM_STATE_OS_PREP, argc, argv, &images);
+			break;
+		case BOOTM_STATE_OS_GO:
+			disable_interrupts();
+			do_bootm_linux(BOOTM_STATE_OS_GO, argc, argv, &images);
+			break;
+	}
+
+	return ret;
+}
+
 /*******************************************************************/
 /* bootm - boot application image from image in memory */
 /*******************************************************************/
@@ -386,6 +494,23 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 	ulong		load_end = 0;
 	int		ret;
 
+	/* determine if we have a sub command */
+	if (argc > 1) {
+		char *endp;
+
+		simple_strtoul(argv[1], &endp, 16);
+		/* endp pointing to NULL means that argv[1] was just a
+		 * valid number, pass it along to the normal bootm processing
+		 *
+		 * If endp is ':' or '#' assume a FIT identifier so pass
+		 * along for normal processing.
+		 *
+		 * Right now we assume the first arg should never be '-'
+		 */
+		if ((*endp != 0) && (*endp != ':') && (*endp != '#'))
+			return do_bootm_subcommand(cmdtp, flag, argc, argv);
+	}
+
 	if (bootm_start(cmdtp, flag, argc, argv))
 		return 1;
 
@@ -782,6 +907,21 @@ U_BOOT_CMD(
 	"\tUse iminfo command to get the list of existing component\n"
 	"\timages and configurations.\n"
 #endif
+	"\nSub-commands to do part of the bootm sequence.  The sub-commands "
+	"must be\n"
+	"issued in the order below (its ok to not issue all sub-commands):\n"
+	"\tstart [addr [arg ...]]\n"
+	"\tloados  - load OS image\n"
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
+	"\tramdisk - relocate initrd, set env initrd_start/initrd_end\n"
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+	"\tfdt     - relocate flat device tree\n"
+#endif
+	"\tbdt     - OS specific bd_t processing\n"
+	"\tcmdline - OS specific command line processing/setup\n"
+	"\tprepos  - OS specific prep before relocation or go\n"
+	"\tgo      - start OS\n"
 );
 
 /*******************************************************************/
include/image.h +19 -1
index 82e6345..557e72a 100644
@@ -228,6 +228,7 @@ typedef struct bootm_headers {
 #endif
 #endif
 
+#ifndef USE_HOSTCC
 	image_info_t	os;		/* os image info */
 	ulong		ep;		/* entry point of OS */
 
@@ -238,8 +239,25 @@ typedef struct bootm_headers {
 #endif
 	ulong		ft_len;		/* length of flat device tree */
 
+	ulong		initrd_start;
+	ulong		initrd_end;
+	ulong		cmdline_start;
+	ulong		cmdline_end;
+	bd_t		*kbd;
+#endif
+
 	int		verify;		/* getenv("verify")[0] != 'n' */
-	int		valid;		/* set to 1 if we've set values in the header */
+
+#define	BOOTM_STATE_START	(0x00000001)
+#define	BOOTM_STATE_LOADOS	(0x00000002)
+#define	BOOTM_STATE_RAMDISK	(0x00000004)
+#define	BOOTM_STATE_FDT		(0x00000008)
+#define	BOOTM_STATE_OS_CMDLINE	(0x00000010)
+#define	BOOTM_STATE_OS_BD_T	(0x00000020)
+#define	BOOTM_STATE_OS_PREP	(0x00000040)
+#define	BOOTM_STATE_OS_GO	(0x00000080)
+	int		state;
+
 #ifndef USE_HOSTCC
 	struct lmb	lmb;		/* for memory mgmt */
 #endif
lib_ppc/bootm.c +170 -92

333 lines not on this page · raw message

Signature · 1 line
1.5.5.1
author
#1 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++ 
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)

Guys,

Any comments on this?

- k

#2 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 14 lines · Kumar Gala
Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++ 
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)
Quoted 5 lines

Guys,

Any comments on this?

- k

I didn't get to it over the weekend. Here in the North summer is a
fleeting thing to be savored while it lasts. :-/

Sorry,
gvb

author
#3 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 13 lines · Jerry Van Baren
Quoted 12 lines · Kumar Gala
Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++  
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)
Quoted 6 lines
Quoted 3 lines

Guys,
Any comments on this?
- k

I didn't get to it over the weekend. Here in the North summer is a
fleeting thing to be savored while it lasts. :-/

Any more feedback on this towards getting something into -next?

- k

#4 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 20 lines · Kumar Gala
Quoted 17 lines · Jerry Van Baren
Quoted 15 lines · Kumar Gala
Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++ 
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)

Guys,
Any comments on this?
- k

Quoted 6 lines
Quoted 2 lines

I didn't get to it over the weekend. Here in the North summer is a
fleeting thing to be savored while it lasts. :-/

Any more feedback on this towards getting something into -next?

- k

Hi Kumar,

I've been working on the micro side (the bootm [a-z]+ commands) and the macro side (understanding cmd_bootm.c and image.c).

I've been keeping notes on the denx.de wiki (inappropriately) on the FDT page. They aren't entirely coherent either. :-/

I applied your changeset and verified that the traditional bootm syntax worked. I then tried to figure out a working sequence of bootm [a-z]+ commands and failed.
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Sequence>
* I didn't see any command for disabling interrupts
* When I do the "bootm loados" command, my target (MPC8360EMDS) reboots
* Could be because interrupts are not disabled but we overwrite the
exception vectors.
* Could be I'm doing something wrong.
Do you have a boot script "use case" to illustrate a sequence that works for you?

I have also been looking at the functions defined in cmd_bootm.c and image.c. Image.c is HUGE. Cmd_bootm.c is pretty complex and part of the complexity is that it is closely coupled with image.c functions.
* I would like to separate and understand the control flow separate from the image handling, fdt handling, bd_t handling, etc.
* Image.c is WAY too large: 2x what it probably should be. Looking at it, it seems like we should pull all the FIT stuff out of image.c and make a new fit_image.c. (I don't know what sort of coupling there would be between a legacy image.c and a new fit_image.c, I suspect not much.)

Enumerating the functions:
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Refactoring_cmd_bootm_c>
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Refactoring_image_c>

Best regards,
gvb

author
#5 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 29 lines · Jerry Van Baren
Quoted 14 lines · Kumar Gala
Quoted 13 lines · Jerry Van Baren
Quoted 12 lines · Kumar Gala
Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++  
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines

Guys,
Any comments on this?
- k

I didn't get to it over the weekend. Here in the North summer is
a fleeting thing to be savored while it lasts. :-/

Any more feedback on this towards getting something into -next?
- k

Hi Kumar,

I've been working on the micro side (the bootm [a-z]+ commands) and the macro side (understanding cmd_bootm.c and image.c).

Quoted 8 lines

I've been keeping notes on the denx.de wiki (inappropriately) on the FDT page. They aren't entirely coherent either. :-/

I applied your changeset and verified that the traditional bootm syntax worked. I then tried to figure out a working sequence of bootm [a-z]+ commands and failed.
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Sequence>
* I didn't see any command for disabling interrupts

You have to have the interrupt command built in. than you can do 'interrupts off'

Quoted 6 lines

* When I do the "bootm loados" command, my target (MPC8360EMDS) reboots
* Could be because interrupts are not disabled but we overwrite the
exception vectors.
* Could be I'm doing something wrong.

this is most likely the case.

Quoted 2 lines

Do you have a boot script "use case" to illustrate a sequence that works for you?

yes, will post in a follow up.

Quoted 12 lines

I have also been looking at the functions defined in cmd_bootm.c and image.c. Image.c is HUGE. Cmd_bootm.c is pretty complex and part of the complexity is that it is closely coupled with image.c functions.
* I would like to separate and understand the control flow separate from the image handling, fdt handling, bd_t handling, etc.
* Image.c is WAY too large: 2x what it probably should be. Looking at it, it seems like we should pull all the FIT stuff out of image.c and make a new fit_image.c. (I don't know what sort of coupling there would be between a legacy image.c and a new fit_image.c, I suspect not much.)

Quoted 4 lines

Enumerating the functions:
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Refactoring_cmd_bootm_c

Quoted 1 line

<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Refactoring_image_c>

refactoring image.c is orthogonal to the functionality I'm trying to enable.

- k

#6 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 35 lines · Kumar Gala
Quoted 32 lines · Jerry Van Baren
Quoted 14 lines · Kumar Gala
Quoted 13 lines · Jerry Van Baren
Quoted 12 lines · Kumar Gala
Quoted 11 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++ 
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines

Guys,
Any comments on this?
- k

I didn't get to it over the weekend. Here in the North summer is a
fleeting thing to be savored while it lasts. :-/

Any more feedback on this towards getting something into -next?
- k

Hi Kumar,

I've been working on the micro side (the bootm [a-z]+ commands) and the macro side (understanding cmd_bootm.c and image.c).

I've been keeping notes on the denx.de wiki (inappropriately) on the FDT page. They aren't entirely coherent either. :-/

Quoted 8 lines
Quoted 5 lines

I applied your changeset and verified that the traditional bootm syntax worked. I then tried to figure out a working sequence of bootm [a-z]+ commands and failed.
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Sequence>
* I didn't see any command for disabling interrupts

You have to have the interrupt command built in. than you can do 'interrupts off'

Yup, I'll have to fix that.

Quoted 6 lines
Quoted 4 lines

* When I do the "bootm loados" command, my target (MPC8360EMDS) reboots
* Could be because interrupts are not disabled but we overwrite the
exception vectors.
* Could be I'm doing something wrong.

this is most likely the case.

Kumar being kind. :-D

Quoted 4 lines
Quoted 2 lines

Do you have a boot script "use case" to illustrate a sequence that works for you?

yes, will post in a follow up.

Thanks, I'll run that tonight.

Quoted 2 lines
Quoted 2 lines

I have also been looking at the functions defined in cmd_bootm.c and image.c. Image.c is HUGE. Cmd_bootm.c is pretty complex and part of

[snip]

Quoted 2 lines

refactoring image.c is orthogonal to the functionality I'm trying to enable.

Yup. I took my eye off the ball.

Best regards,
gvb

author
#7 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands (sequence of commands to replicate bootm)

In reply to Jerry Van Baren
Quoted 4 lines

I applied your changeset and verified that the traditional bootm syntax worked. I then tried to figure out a working sequence of bootm [a-z]+ commands and failed.
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Sequence>

Quoted 8 lines

* I didn't see any command for disabling interrupts
* When I do the "bootm loados" command, my target (MPC8360EMDS) reboots
* Could be because interrupts are not disabled but we overwrite the
exception vectors.
* Could be I'm doing something wrong.
Do you have a boot script "use case" to illustrate a sequence that works for you?

setenv bootm_low 00000000
setenv bootm_size 10000000
bootm start 0x1000000 0x1300000 0xf00000
interrupts off
bootm loados
bootm ramdisk
bootm fdt
fdt boardsetup
fdt chosen $initrd_start $initrd_end
bootm prep
bootm go

- k

#8 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

In reply to Kumar Gala
Quoted 3 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

Hi Kumar,

Thanks to your sequence hint, interrupt command hint, and one additional piece, I have this working now.

The missing piece is reserving memory for the stack before copying the ramdisk to high mem. It looks like this was lost when you consolidated the machine-specific lib_*/bootm.c do_bootm_linux() functions into one.
Without the reservation code, the copy overwrites the stack.
Seriously bad karma.

See below for a proof-of-concept hack.

Quoted 28 lines
---
 common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
 include/image.h    |   20 ++++-
 lib_ppc/bootm.c    |  262 ++++++++++++++++++++++++++++++++++------------------
 3 files changed, 330 insertions(+), 94 deletions(-)
common/cmd_bootm.c +2 -1
index 19257bb..e6dcb7a 100644
@@ -34,6 +34,7 @@
 #include <bzlib.h>
 #include <environment.h>
 #include <lmb.h>
+#include <linux/ctype.h>
 #include <asm/byteorder.h>
 
 #if defined(CONFIG_CMD_USB)
@@ -273,7 +274,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 	}
 
 	images.os.start = (ulong)os_hdr;
-	images.valid = 1;
+	images.state = BOOTM_STATE_START;
 
 	return 0;
 }

common/cmd_bootm.c static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) · line 381

Quoted 5 lines
common/cmd_bootm.c +2 -0
@@ -376,6 +377,113 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
 	return 0;
 }
 
+/* we over load the cmd field with our state machine info instead of a
+ * function pointer */

Nitpick: comment format and s/over load/overload/
/*
* We overload the cmd field with our state machine info instead of a
* function pointer
*/

[snip]

Quoted 2 lines
common/cmd_bootm.c +2 -0
+int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{

[snip]

Quoted 8 lines
common/cmd_bootm.c +8 -0
+	switch (state) {
+		ulong load_end;
+		case BOOTM_STATE_START:
+			/* should never occur */
+			break;
+		case BOOTM_STATE_LOADOS:
+			ret = bootm_load_os(images.os, &load_end, 0);
+			if (ret)

common/cmd_bootm.c

Quoted 10 lines
common/cmd_bootm.c +10 -0
+				return ret;
+
+			lmb_reserve(&images.lmb, images.os.load,
+					(load_end - images.os.load));
+			break;
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
+		case BOOTM_STATE_RAMDISK:
+		{
+			ulong rd_len = images.rd_end - images.rd_start;
+			char str[17];

We need to reserve the memory used by the stack here or earlier. Unfortunately, all three target CPU architectures do this differently. Below is my proof-of-concept hack. I did not attempt to generalize it (yet).

common/cmd_bootm.c +4 -0
index e6dcb7a..067fbcd 100644
@@ -60,6 +60,10 @@
 
  DECLARE_GLOBAL_DATA_PTR;
 
+/**** START HACK ****/
+extern ulong get_effective_memsize(void);
+/**** END HACK ****/
+
  extern int gunzip (void *dst, int dstlen, unsigned char *src, unsigned 

long *lenp);
#ifndef CFG_BOOTM_LEN
#define CFG_BOOTM_LEN 0x800000 /* use 8MByte as default max gunzip size */
@@ -443,8 +447,18 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
case BOOTM_STATE_RAMDISK:
{
ulong rd_len = images.rd_end - images.rd_start;
+ ulong sp;
char str[17];

+/**** START HACK ****/
+ asm( "mr %0,1": "=r"(sp) : )
+ debug ("## Current stack ends at 0x%08lx\n", sp);
+
+ /* adjust sp by 1K to be safe */
+ sp -= 1024;
+ lmb_reserve(&images.lmb, sp, (CFG_SDRAM_BASE +
get_effective_memsize() - sp));
+/**** END HACK ****/
+
ret = boot_ramdisk_high(&images.lmb, images.rd_start,
rd_len, &images.initrd_start, &images.initrd_end);
if (ret)

Quoted 12 lines
common/cmd_bootm.c +12 -0
+			ret = boot_ramdisk_high(&images.lmb, images.rd_start,
+				rd_len, &images.initrd_start, &images.initrd_end);
+			if (ret)
+				return ret;
+
+			sprintf(str, "%lx", images.initrd_start);
+			setenv("initrd_start", str);
+			sprintf(str, "%lx", images.initrd_end);
+			setenv("initrd_end", str);
+		}
+			break;
+#endif

[snip]

Quoted 25 lines
common/cmd_bootm.c +17 -0
@@ -386,6 +494,23 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 	ulong		load_end = 0;
 	int		ret;
 
+	/* determine if we have a sub command */
+	if (argc > 1) {
+		char *endp;
+
+		simple_strtoul(argv[1], &endp, 16);
+		/* endp pointing to NULL means that argv[1] was just a
+		 * valid number, pass it along to the normal bootm processing
+		 *
+		 * If endp is ':' or '#' assume a FIT identifier so pass
+		 * along for normal processing.
+		 *
+		 * Right now we assume the first arg should never be '-'
+		 */
+		if ((*endp != 0) && (*endp != ':') && (*endp != '#'))
+			return do_bootm_subcommand(cmdtp, flag, argc, argv);
+	}
+
 	if (bootm_start(cmdtp, flag, argc, argv))
 		return 1;
 

common/cmd_bootm.c U_BOOT_CMD( · line 912

Quoted 6 lines
common/cmd_bootm.c +3 -0
@@ -782,6 +907,21 @@ U_BOOT_CMD(
 	"\tUse iminfo command to get the list of existing component\n"
 	"\timages and configurations.\n"
 #endif
+	"\nSub-commands to do part of the bootm sequence.  The sub-commands "
+	"must be\n"
+	"issued in the order below (its ok to not issue all sub-commands):\n"

s/its/it's/ (contraction "it is", not possessive like "his")

common/cmd_bootm.c U_BOOT_CMD( · line 913

Quoted 1 line
common/cmd_bootm.c +1 -0
+	"\tstart [addr [arg ...]]\n"

The following is more descriptive?

	start <os_addr> [(-|<ramdisk_addr>) [<fdt_addr>]]

common/cmd_bootm.c U_BOOT_CMD( · line 924

Quoted 11 lines
common/cmd_bootm.c +11 -0
+	"\tloados  - load OS image\n"
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
+	"\tramdisk - relocate initrd, set env initrd_start/initrd_end\n"
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+	"\tfdt     - relocate flat device tree\n"
+#endif
+	"\tbdt     - OS specific bd_t processing\n"
+	"\tcmdline - OS specific command line processing/setup\n"
+	"\tprepos  - OS specific prep before relocation or go\n"
+	"\tgo      - start OS\n"

[snip]

Thanks,
gvb

author
#9 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 56 lines · Jerry Van Baren
Quoted 4 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

Hi Kumar,

Thanks to your sequence hint, interrupt command hint, and one additional
piece, I have this working now.

The missing piece is reserving memory for the stack before copying the ramdisk to high mem. It looks like this was lost when you consolidated
the machine-specific lib_*/bootm.c do_bootm_linux() functions into one.
Without the reservation code, the copy overwrites the stack.
Seriously bad karma.

See below for a proof-of-concept hack.

Quoted 34 lines

---

common/cmd_bootm.c |  142 ++++++++++++++++++++++++++++-
include/image.h    |   20 ++++-
lib_ppc/bootm.c    |  262 +++++++++++++++++++++++++++++++++ 
+------------------
3 files changed, 330 insertions(+), 94 deletions(-)
common/cmd_bootm.c +2 -1
index 19257bb..e6dcb7a 100644
@@ -34,6 +34,7 @@
 #include <bzlib.h>
 #include <environment.h>
 #include <lmb.h>
+#include <linux/ctype.h>
 #include <asm/byteorder.h>
 
 #if defined(CONFIG_CMD_USB)
@@ -273,7 +274,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int  
 flag, int argc, char *argv[])
 	}
 
 	images.os.start = (ulong)os_hdr;
-	images.valid = 1;
+	images.state = BOOTM_STATE_START;
 
 	return 0;

}

common/cmd_bootm.c +0 -0
@@ -376,6 +377,113 @@ static int bootm_load_os(image_info_t os,  
 ulong *load_end, int boot_progress)
 	return 0;
 }
 
Quoted 9 lines
Quoted 3 lines
common/cmd_bootm.c +1 -0
+/* we over load the cmd field with our state machine info instead  

of a
+ * function pointer */

Nitpick: comment format and s/over load/overload/
/*
* We overload the cmd field with our state machine info instead of a
* function pointer
*/

ack.

Quoted 10 lines

[snip]

Quoted 3 lines

+int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{

[snip]

Quoted 1 line
Quoted 11 lines
Quoted 9 lines
common/cmd_bootm.c +1 -0
@@ -782,6 +907,21 @@ U_BOOT_CMD(
 	"\tUse iminfo command to get the list of existing component\n"
 	"\timages and configurations.\n"
 #endif
+	"\nSub-commands to do part of the bootm sequence.  The sub- 

commands "

common/cmd_bootm.c +2 -0
+	"must be\n"
+	"issued in the order below (its ok to not issue all sub-commands): 

\n"

s/its/it's/ (contraction "it is", not possessive like "his")

ack

Quoted 6 lines

common/cmd_bootm.c

Quoted 3 lines
common/cmd_bootm.c +1 -0
+	"\tstart [addr [arg ...]]\n"

The following is more descriptive?

	start <os_addr> [(-|<ramdisk_addr>) [<fdt_addr>]]

nack. I left this as is to match the bootm help

Quoted 4 lines
Quoted 4 lines
common/cmd_bootm.c +2 -0
+	"\tloados  - load OS image\n"
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) ||  

defined(CONFIG_SPARC)

common/cmd_bootm.c +1 -0
+	"\tramdisk - relocate initrd, set env initrd_start/initrd_end\n"
Quoted 8 lines

common/cmd_bootm.c

Quoted 8 lines
common/cmd_bootm.c +8 -0
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+	"\tfdt     - relocate flat device tree\n"
+#endif
+	"\tbdt     - OS specific bd_t processing\n"
+	"\tcmdline - OS specific command line processing/setup\n"
+	"\tprepos  - OS specific prep before relocation or go\n"
+	"\tgo      - start OS\n"

- k

author
#10 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

In reply to Jerry Van Baren
Quoted 20 lines · Jerry Van Baren
Quoted 4 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

Hi Kumar,

Thanks to your sequence hint, interrupt command hint, and one additional
piece, I have this working now.

The missing piece is reserving memory for the stack before copying the ramdisk to high mem. It looks like this was lost when you consolidated
the machine-specific lib_*/bootm.c do_bootm_linux() functions into one.
Without the reservation code, the copy overwrites the stack.
Seriously bad karma.

Quoted 1 line

See below for a proof-of-concept hack.

I think my solution is a bit cleaner for us (adding arch_lmb_reserve). Take a look and see how that works for you.

- k

#11 lore raw

RFC PATCH v4 1/1 bootm: Add sub commands

Quoted 20 lines · Kumar Gala
Quoted 17 lines · Jerry Van Baren
Quoted 4 lines · Kumar Gala

* Use new find_cmd_tbl() to process sub-commands

If this looks good I'll go ahead and clean it up for the other arches and OSes.

Hi Kumar,

Thanks to your sequence hint, interrupt command hint, and one additional piece, I have this working now.

The missing piece is reserving memory for the stack before copying the ramdisk to high mem. It looks like this was lost when you consolidated the machine-specific lib_*/bootm.c do_bootm_linux() functions into one.
Without the reservation code, the copy overwrites the stack.
Seriously bad karma.

Quoted 6 lines
Quoted 1 line

See below for a proof-of-concept hack.

I think my solution is a bit cleaner for us (adding arch_lmb_reserve). Take a look and see how that works for you.

- k

Oh yes, my hack was just to verify that reserving the stack space solved my problem. It was not a solution.

Thanks,
gvb