@ -93,14 +93,13 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
* - disabled interrupts .
*/
typedef void boot_os_fn ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , /* of image to boot */
ulong * len_ptr , /* multi-file image length table */
int verify ) ; /* getenv("verify")[0] != 'n' */
int argc , char * argv [ ] ,
image_header_t * hdr , /* of image to boot */
int verify ) ; /* getenv("verify")[0] != 'n' */
extern boot_os_fn do_bootm_linux ;
static boot_os_fn do_bootm_netbsd ;
# ifdef CONFIG_LYNXKDI
# if defined(CONFIG_LYNXKDI)
static boot_os_fn do_bootm_lynxkdi ;
extern void lynxkdi_boot ( image_header_t * ) ;
# endif
@ -116,8 +115,6 @@ extern uchar (*env_get_char)(int); /* Returns a character from the environment *
static boot_os_fn do_bootm_artos ;
# endif
image_header_t header ;
ulong load_addr = CFG_LOAD_ADDR ; /* Default Load Address */
@ -126,34 +123,32 @@ ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
/*******************************************************************/
int do_bootm ( cmd_tbl_t * cmdtp , int flag , int argc , char * argv [ ] )
{
ulong iflag ;
ulong addr ;
ulong data , len ;
ulong * len_ptr ;
uint unc_len = CFG_BOOTM_LEN ;
int i , verify ;
char * name , * s ;
int ( * appl ) ( int , char * [ ] ) ;
image_header_t * hdr = & header ;
ulong iflag ;
char * name , * s ;
int ( * appl ) ( int , char * [ ] ) ;
uint unc_len = CFG_BOOTM_LEN ;
int verify = getenv_verify ( ) ;
verify = getenv_verify ( ) ;
image_header_t * hdr ;
ulong img_addr ;
ulong os_data , os_len ;
if ( argc < 2 ) {
addr = load_addr ;
img_ addr = load_addr ;
} else {
addr = simple_strtoul ( argv [ 1 ] , NULL , 16 ) ;
img_ addr = simple_strtoul ( argv [ 1 ] , NULL , 16 ) ;
}
show_boot_progress ( 1 ) ;
printf ( " ## Booting image at %08lx ... \n " , addr ) ;
printf ( " ## Booting image at %08lx ... \n " , img_ addr) ;
/* Copy header so we can blank CRC field for re-calculation */
# ifdef CONFIG_HAS_DATAFLASH
if ( addr_dataflash ( addr ) ) {
read_dataflash ( addr , image_get_header_size ( ) , ( char * ) & header ) ;
if ( addr_dataflash ( img_addr ) ) {
hdr = ( image_header_t * ) CFG_LOAD_ADDR ;
read_dataflash ( img_addr , image_get_header_size ( ) , ( char * ) hdr ) ;
} else
# endif
memmove ( & header , ( char * ) addr , image_get_header_size ( ) ) ;
hdr = ( image_header_t * ) img_addr ;
if ( ! image_check_magic ( hdr ) ) {
puts ( " Bad Magic Number \n " ) ;
@ -170,23 +165,18 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
show_boot_progress ( 3 ) ;
# ifdef CONFIG_HAS_DATAFLASH
if ( addr_dataflash ( addr ) ) {
len = image_get_image_size ( hdr ) ;
read_dataflash ( addr , len , ( char * ) CFG_LOAD_ADDR ) ;
addr = CFG_LOAD_ADDR ;
}
if ( addr_dataflash ( img_addr ) )
read_dataflash ( img_addr + image_get_header_size ( ) ,
image_get_data_size ( hdr ) ,
( char * ) image_get_data ( hdr ) ) ;
# endif
/* for multi-file images we need the data part, too */
print_image_hdr ( ( image_header_t * ) addr ) ;
len = image_get_data_size ( hdr ) ;
data = addr + image_get_header_size ( ) ;
len_ptr = ( ulong * ) data ;
/* uImage is in a system RAM, pointed to by hdr */
print_image_hdr ( hdr ) ;
if ( verify ) {
puts ( " Verifying Checksum ... " ) ;
if ( ! image_check_dcrc ( ( image_ header_t * ) ad dr) ) {
if ( ! image_check_dcrc ( hdr ) ) {
printf ( " Bad Data CRC \n " ) ;
show_boot_progress ( - 3 ) ;
return 1 ;
@ -212,14 +202,12 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
break ;
case IH_TYPE_KERNEL :
name = " Kernel Image " ;
os_data = image_get_data ( hdr ) ;
os_len = image_get_data_size ( hdr ) ;
break ;
case IH_TYPE_MULTI :
name = " Multi-File Image " ;
len = image_to_cpu ( len_ptr [ 0 ] ) ;
/* OS kernel is always the first image */
data + = 8 ; /* kernel_len + terminator */
for ( i = 1 ; len_ptr [ i ] ; + + i )
data + = 4 ;
image_multi_getimg ( hdr , 0 , & os_data , & os_len ) ;
break ;
default :
printf ( " Wrong Image Type for %s command \n " , cmdtp - > name ) ;
@ -248,13 +236,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
switch ( image_get_comp ( hdr ) ) {
case IH_COMP_NONE :
if ( image_get_load ( hdr ) = = addr ) {
if ( image_get_load ( hdr ) = = img_ addr) {
printf ( " XIP %s ... " , name ) ;
} else {
printf ( " Loading %s ... " , name ) ;
memmove_wd ( ( void * ) image_get_load ( hdr ) ,
( void * ) data , len , CHUNKSZ ) ;
( void * ) os_ data, os_ len, CHUNKSZ ) ;
puts ( " OK \n " ) ;
}
@ -262,7 +250,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
case IH_COMP_GZIP :
printf ( " Uncompressing %s ... " , name ) ;
if ( gunzip ( ( void * ) image_get_load ( hdr ) , unc_len ,
( uchar * ) data , & len ) ! = 0 ) {
( uchar * ) os_ data, & os_ len) ! = 0 ) {
puts ( " GUNZIP ERROR - must RESET board to recover \n " ) ;
show_boot_progress ( - 6 ) ;
do_reset ( cmdtp , flag , argc , argv ) ;
@ -276,9 +264,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
* use slower decompression algorithm which requires
* at most 2300 KB of memory .
*/
i = BZ2_bzBuffToBuffDecompress ( ( char * ) image_get_load ( hdr ) ,
& unc_len , ( char * ) data , len ,
CFG_MALLOC_LEN < ( 4096 * 1024 ) , 0 ) ;
int i = BZ2_bzBuffToBuffDecompress ( ( char * ) image_get_load ( hdr ) ,
& unc_len , ( char * ) os_ data, os_ len,
CFG_MALLOC_LEN < ( 4096 * 1024 ) , 0 ) ;
if ( i ! = BZ_OK ) {
printf ( " BUNZIP2 ERROR %d - must RESET board to recover \n " , i ) ;
show_boot_progress ( - 6 ) ;
@ -306,7 +294,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
*/
if ( ( ( s = getenv ( " autostart " ) ) ! = NULL ) & & ( strcmp ( s , " no " ) = = 0 ) ) {
char buf [ 32 ] ;
sprintf ( buf , " %lX " , len ) ;
sprintf ( buf , " %lX " , image_get_data_size ( hdr ) ) ;
setenv ( " filesize " , buf ) ;
return 0 ;
}
@ -332,42 +320,36 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
# ifdef CONFIG_SILENT_CONSOLE
fixup_silent_linux ( ) ;
# endif
do_bootm_linux ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_linux ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
case IH_OS_NETBSD :
do_bootm_netbsd ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_netbsd ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
# ifdef CONFIG_LYNXKDI
case IH_OS_LYNXOS :
do_bootm_lynxkdi ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_lynxkdi ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
# endif
case IH_OS_RTEMS :
do_bootm_rtems ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_rtems ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
# if defined(CONFIG_CMD_ELF)
case IH_OS_VXWORKS :
do_bootm_vxworks ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_vxworks ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
case IH_OS_QNX :
do_bootm_qnxelf ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_qnxelf ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
# endif
# ifdef CONFIG_ARTOS
case IH_OS_ARTOS :
do_bootm_artos ( cmdtp , flag , argc , argv ,
addr , len_ptr , verify ) ;
do_bootm_artos ( cmdtp , flag , argc , argv , hdr , verify ) ;
break ;
# endif
}
@ -570,11 +552,12 @@ void print_image_hdr (image_header_t *hdr)
if ( image_check_type ( hdr , IH_TYPE_MULTI ) ) {
int i ;
ulong len ;
ulong * len_ptr = ( ulong * ) ( ( ulong ) hdr + image_get_header_size ( ) ) ;
ulong data , len ;
ulong count = image_multi_count ( hdr ) ;
puts ( " Contents: \n " ) ;
for ( i = 0 ; ( len = image_to_cpu ( * len_ptr ) ) ; + + i , + + len_ptr ) {
for ( i = 0 ; i < count ; i + + ) {
image_multi_getimg ( hdr , i , & data , & len ) ;
printf ( " Image %d: %8ld Bytes = " , i , len ) ;
print_size ( len , " \n " ) ;
}
@ -684,14 +667,12 @@ static void fixup_silent_linux ()
/*******************************************************************/
static void do_bootm_netbsd ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
int argc , char * argv [ ] ,
image_header_t * hdr , int verify )
{
image_header_t * hdr = & header ;
void ( * loader ) ( bd_t * , image_header_t * , char * , char * ) ;
image_header_t * img_addr ;
ulong kernel_data , kernel_len ;
char * consdev ;
char * cmdline ;
@ -708,8 +689,11 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
*/
img_addr = 0 ;
if ( ( image_check_type ( hdr , IH_TYPE_MULTI ) ) & & ( len_ptr [ 1 ] ) )
img_addr = ( image_header_t * ) addr ;
if ( image_check_type ( hdr , IH_TYPE_MULTI ) ) {
image_multi_getimg ( hdr , 1 , & kernel_data , & kernel_len ) ;
if ( kernel_len )
img_addr = hdr ;
}
consdev = " " ;
# if defined (CONFIG_8xx_CONS_SMC1)
@ -760,19 +744,16 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
# ifdef CONFIG_LYNXKDI
static void do_bootm_lynxkdi ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
image_header_t * hdr , int verify )
{
lynxkdi_boot ( & hea de r ) ;
lynxkdi_boot ( hdr ) ;
}
# endif /* CONFIG_LYNXKDI */
static void do_bootm_rtems ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
image_header_t * hdr , int verify )
{
image_header_t * hdr = & header ;
void ( * entry_point ) ( bd_t * ) ;
entry_point = ( void ( * ) ( bd_t * ) ) image_get_ep ( hdr ) ;
@ -792,10 +773,8 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
# if defined(CONFIG_CMD_ELF)
static void do_bootm_vxworks ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
image_header_t * hdr , int verify )
{
image_header_t * hdr = & header ;
char str [ 80 ] ;
sprintf ( str , " %x " , image_get_ep ( hdr ) ) ; /* write entry-point into string */
@ -803,12 +782,10 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
do_bootvx ( cmdtp , 0 , 0 , NULL ) ;
}
static void do_bootm_qnxelf ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
static void do_bootm_qnxelf ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
image_header_t * hdr , int verify )
{
image_header_t * hdr = & header ;
char * local_args [ 2 ] ;
char str [ 16 ] ;
@ -822,8 +799,7 @@ static void do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag,
# if defined(CONFIG_ARTOS) && defined(CONFIG_PPC)
static void do_bootm_artos ( cmd_tbl_t * cmdtp , int flag ,
int argc , char * argv [ ] ,
ulong addr , ulong * len_ptr ,
int verify )
image_header_t * hdr , int verify )
{
ulong top ;
char * s , * cmdline ;
@ -831,7 +807,6 @@ static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag,
int i , j , nxt , len , envno , envsz ;
bd_t * kbd ;
void ( * entry ) ( bd_t * bd , char * cmdline , char * * fwenv , ulong top ) ;
image_header_t * hdr = & header ;
/*
* Booting an ARTOS kernel image + application