@ -471,6 +471,7 @@ struct pxe_label {
char * name ;
char * name ;
char * menu ;
char * menu ;
char * kernel ;
char * kernel ;
char * config ;
char * append ;
char * append ;
char * initrd ;
char * initrd ;
char * fdt ;
char * fdt ;
@ -538,6 +539,9 @@ static void label_destroy(struct pxe_label *label)
if ( label - > kernel )
if ( label - > kernel )
free ( label - > kernel ) ;
free ( label - > kernel ) ;
if ( label - > config )
free ( label - > config ) ;
if ( label - > append )
if ( label - > append )
free ( label - > append ) ;
free ( label - > append ) ;
@ -618,6 +622,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
char initrd_str [ 28 ] ;
char initrd_str [ 28 ] ;
char mac_str [ 29 ] = " " ;
char mac_str [ 29 ] = " " ;
char ip_str [ 68 ] = " " ;
char ip_str [ 68 ] = " " ;
char * fit_addr = NULL ;
int bootm_argc = 2 ;
int bootm_argc = 2 ;
int len = 0 ;
int len = 0 ;
ulong kernel_addr ;
ulong kernel_addr ;
@ -699,6 +704,18 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
}
}
bootm_argv [ 1 ] = env_get ( " kernel_addr_r " ) ;
bootm_argv [ 1 ] = env_get ( " kernel_addr_r " ) ;
/* for FIT, append the configuration identifier */
if ( label - > config ) {
int len = strlen ( bootm_argv [ 1 ] ) + strlen ( label - > config ) + 1 ;
fit_addr = malloc ( len ) ;
if ( ! fit_addr ) {
printf ( " malloc fail (FIT address) \n " ) ;
return 1 ;
}
snprintf ( fit_addr , len , " %s%s " , bootm_argv [ 1 ] , label - > config ) ;
bootm_argv [ 1 ] = fit_addr ;
}
/*
/*
* fdt usage is optional :
* fdt usage is optional :
@ -758,7 +775,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
fdtfilefree = malloc ( len ) ;
fdtfilefree = malloc ( len ) ;
if ( ! fdtfilefree ) {
if ( ! fdtfilefree ) {
printf ( " malloc fail (FDT filename) \n " ) ;
printf ( " malloc fail (FDT filename) \n " ) ;
return 1 ;
goto cleanup ;
}
}
snprintf ( fdtfilefree , len , " %s%s%s%s%s%s " ,
snprintf ( fdtfilefree , len , " %s%s%s%s%s%s " ,
@ -772,7 +789,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
if ( err < 0 ) {
if ( err < 0 ) {
printf ( " Skipping %s for failure retrieving fdt \n " ,
printf ( " Skipping %s for failure retrieving fdt \n " ,
label - > name ) ;
label - > name ) ;
return 1 ;
goto cleanup ;
}
}
} else {
} else {
bootm_argv [ 3 ] = NULL ;
bootm_argv [ 3 ] = NULL ;
@ -803,6 +820,10 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
do_bootz ( cmdtp , 0 , bootm_argc , bootm_argv ) ;
do_bootz ( cmdtp , 0 , bootm_argc , bootm_argv ) ;
# endif
# endif
unmap_sysmem ( buf ) ;
unmap_sysmem ( buf ) ;
cleanup :
if ( fit_addr )
free ( fit_addr ) ;
return 1 ;
return 1 ;
}
}
@ -1188,6 +1209,33 @@ static int parse_label_menu(char **c, struct pxe_menu *cfg,
}
}
/*
/*
* Handles parsing a ' kernel ' label .
* expecting " filename " or " <fit_filename>#cfg "
*/
static int parse_label_kernel ( char * * c , struct pxe_label * label )
{
char * s ;
int err ;
err = parse_sliteral ( c , & label - > kernel ) ;
if ( err < 0 )
return err ;
s = strstr ( label - > kernel , " # " ) ;
if ( ! s )
return 1 ;
label - > config = malloc ( strlen ( s ) + 1 ) ;
if ( ! label - > config )
return - ENOMEM ;
strcpy ( label - > config , s ) ;
* s = 0 ;
return 1 ;
}
/*
* Parses a label and adds it to the list of labels for a menu .
* Parses a label and adds it to the list of labels for a menu .
*
*
* A label ends when we either get to the end of a file , or
* A label ends when we either get to the end of a file , or
@ -1228,7 +1276,7 @@ static int parse_label(char **c, struct pxe_menu *cfg)
case T_KERNEL :
case T_KERNEL :
case T_LINUX :
case T_LINUX :
err = parse_slitera l ( c , & label - > kern el ) ;
err = parse_label_kerne l ( c , label ) ;
break ;
break ;
case T_APPEND :
case T_APPEND :