bootm: Add sub commands
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
@@ -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
@@ -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
RFC PATCH v4 1/1 bootm: Add sub commands
Quoted 11 lines · Kumar Gala
* Use new
find_cmd_tbl()to process sub-commandsIf 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
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-commandsIf 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
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-commandsIf 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?
- kI 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
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-commandsIf 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
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-commandsIf 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?
- kI 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?
- kHi Kumar,
I've been working on the micro side (the bootm [a-z]+ commands) and the macro side (understanding
cmd_bootm.candimage.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.candimage.c.Image.cis HUGE.Cmd_bootm.cis pretty complex and part of the complexity is that it is closely coupled withimage.cfunctions.
* I would like to separate and understand the control flow separate from the image handling, fdt handling,bd_thandling, etc.
*Image.cis WAY too large: 2x what it probably should be. Looking at it, it seems like we should pull all the FIT stuff out ofimage.cand make a newfit_image.c. (I don't know what sort of coupling there would be between a legacyimage.cand a newfit_image.c, I suspect not much.)
Quoted 4 lines
Enumerating the functions:
<http://www.denx.de/wiki/view/U-Boot/UBootFdtInfo#Refactoring_cmd_bootm_cQuoted 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
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-commandsIf 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?
- kI 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?
- kHi Kumar,
I've been working on the micro side (the bootm [a-z]+ commands) and the macro side (understanding
cmd_bootm.candimage.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 interruptsYou 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.candimage.c.Image.cis HUGE.Cmd_bootm.cis pretty complex and part of
[snip]
Quoted 2 lines
refactoring
image.cis orthogonal to the functionality I'm trying to enable.
Yup. I took my eye off the ball.
Best regards,
gvb
RFC PATCH v4 1/1 bootm: Add sub commands (sequence of commands to replicate bootm)
In reply to Jerry Van BarenQuoted 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
RFC PATCH v4 1/1 bootm: Add sub commands
In reply to Kumar GalaQuoted 3 lines · Kumar Gala
* Use new
find_cmd_tbl()to process sub-commandsIf 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@@ -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
@@ -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
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-commandsIf 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-specificlib_*/bootm.cdo_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@@ -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
RFC PATCH v4 1/1 bootm: Add sub commands
In reply to Jerry Van BarenQuoted 20 lines · Jerry Van Baren
Quoted 4 lines · Kumar Gala
* Use new
find_cmd_tbl()to process sub-commandsIf 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-specificlib_*/bootm.cdo_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
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-commandsIf 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.cdo_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