@ -35,22 +35,51 @@ DECLARE_GLOBAL_DATA_PTR;
int do_bootm_linux ( int flag , int argc , char * argv [ ] , bootm_headers_t * images )
{
/* First parameter is mapped to $r5 for kernel boot args */
void ( * theKernel ) ( char * ) ;
void ( * theKernel ) ( char * , ulong , ulong ) ;
char * commandline = getenv ( " bootargs " ) ;
ulong rd_data_start , rd_data_end ;
if ( ( flag ! = 0 ) & & ( flag ! = BOOTM_STATE_OS_GO ) )
return 1 ;
theKernel = ( void ( * ) ( char * ) ) images - > ep ;
int ret ;
char * of_flat_tree = NULL ;
# if defined(CONFIG_OF_LIBFDT)
ulong of_size = 0 ;
/* find flattened device tree */
ret = boot_get_fdt ( flag , argc , argv , images , & of_flat_tree , & of_size ) ;
if ( ret )
return 1 ;
# endif
theKernel = ( void ( * ) ( char * , ulong , ulong ) ) images - > ep ;
/* find ramdisk */
ret = boot_get_ramdisk ( argc , argv , images , IH_ARCH_MICROBLAZE ,
& rd_data_start , & rd_data_end ) ;
if ( ret )
return 1 ;
show_boot_progress ( 15 ) ;
if ( ! ( ulong ) of_flat_tree )
of_flat_tree = ( char * ) simple_strtoul ( argv [ 3 ] , NULL , 16 ) ;
# ifdef DEBUG
printf ( " ## Transferring control to Linux (at address %08lx) ... \n " ,
( ulong ) theKernel ) ;
printf ( " ## Transferring control to Linux (at address 0x%08lx) " \
" ramdisk 0x%08lx, FDT 0x%08lx... \n " ,
( ulong ) theKernel , rd_data_start , ( ulong ) of_flat_tree ) ;
# endif
theKernel ( commandline ) ;
/*
* Linux Kernel Parameters ( passing device tree ) :
* r5 : pointer to command line
* r6 : pointer to ramdisk
* r7 : pointer to the fdt , followed by the board info data
*/
theKernel ( commandline , rd_data_start , ( ulong ) of_flat_tree ) ;
/* does not return */
return 1 ;