@ -369,6 +369,7 @@ static size_t image_headersz_v1(int *hasext)
fprintf ( stderr , " Increase CONFIG_SYS_U_BOOT_OFFS! \n " ) ;
return 0 ;
}
headersz = CONFIG_SYS_U_BOOT_OFFS ;
# endif
@ -379,10 +380,85 @@ static size_t image_headersz_v1(int *hasext)
return ALIGN_SUP ( headersz , 4096 ) ;
}
int add_binary_header_v1 ( uint8_t * cur )
{
struct image_cfg_element * binarye ;
struct opt_hdr_v1 * hdr = ( struct opt_hdr_v1 * ) cur ;
uint32_t * args ;
size_t binhdrsz ;
struct stat s ;
int argi ;
FILE * bin ;
int ret ;
binarye = image_find_option ( IMAGE_CFG_BINARY ) ;
if ( ! binarye )
return 0 ;
hdr - > headertype = OPT_HDR_V1_BINARY_TYPE ;
bin = fopen ( binarye - > binary . file , " r " ) ;
if ( ! bin ) {
fprintf ( stderr , " Cannot open binary file %s \n " ,
binarye - > binary . file ) ;
return - 1 ;
}
fstat ( fileno ( bin ) , & s ) ;
binhdrsz = sizeof ( struct opt_hdr_v1 ) +
( binarye - > binary . nargs + 2 ) * sizeof ( uint32_t ) +
s . st_size ;
/*
* The size includes the binary image size , rounded
* up to a 4 - byte boundary . Plus 4 bytes for the
* next - header byte and 3 - byte alignment at the end .
*/
binhdrsz = ALIGN_SUP ( binhdrsz , 4 ) + 4 ;
hdr - > headersz_lsb = cpu_to_le16 ( binhdrsz & 0xFFFF ) ;
hdr - > headersz_msb = ( binhdrsz & 0xFFFF0000 ) > > 16 ;
cur + = sizeof ( struct opt_hdr_v1 ) ;
args = ( uint32_t * ) cur ;
* args = cpu_to_le32 ( binarye - > binary . nargs ) ;
args + + ;
for ( argi = 0 ; argi < binarye - > binary . nargs ; argi + + )
args [ argi ] = cpu_to_le32 ( binarye - > binary . args [ argi ] ) ;
cur + = ( binarye - > binary . nargs + 1 ) * sizeof ( uint32_t ) ;
ret = fread ( cur , s . st_size , 1 , bin ) ;
if ( ret ! = 1 ) {
fprintf ( stderr ,
" Could not read binary image %s \n " ,
binarye - > binary . file ) ;
return - 1 ;
}
fclose ( bin ) ;
cur + = ALIGN_SUP ( s . st_size , 4 ) ;
/*
* For now , we don ' t support more than one binary
* header , and no other header types are
* supported . So , the binary header is necessarily the
* last one
*/
* ( ( uint32_t * ) cur ) = 0x00000000 ;
cur + = sizeof ( uint32_t ) ;
return 0 ;
}
static void * image_create_v1 ( size_t * imagesz , struct image_tool_params * params ,
int payloadsz )
{
struct image_cfg_element * e , * binarye ;
struct image_cfg_element * e ;
struct main_hdr_v1 * main_hdr ;
size_t headersz ;
uint8_t * image , * cur ;
@ -434,72 +510,8 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
if ( e )
main_hdr - > flags = e - > debug ? 0x1 : 0 ;
binarye = image_find_option ( IMAGE_CFG_BINARY ) ;
if ( binarye ) {
struct opt_hdr_v1 * hdr = ( struct opt_hdr_v1 * ) cur ;
uint32_t * args ;
size_t binhdrsz ;
struct stat s ;
int argi ;
FILE * bin ;
int ret ;
hdr - > headertype = OPT_HDR_V1_BINARY_TYPE ;
bin = fopen ( binarye - > binary . file , " r " ) ;
if ( ! bin ) {
fprintf ( stderr , " Cannot open binary file %s \n " ,
binarye - > binary . file ) ;
return NULL ;
}
fstat ( fileno ( bin ) , & s ) ;
binhdrsz = sizeof ( struct opt_hdr_v1 ) +
( binarye - > binary . nargs + 2 ) * sizeof ( uint32_t ) +
s . st_size ;
/*
* The size includes the binary image size , rounded
* up to a 4 - byte boundary . Plus 4 bytes for the
* next - header byte and 3 - byte alignment at the end .
*/
binhdrsz = ALIGN_SUP ( binhdrsz , 4 ) + 4 ;
hdr - > headersz_lsb = cpu_to_le16 ( binhdrsz & 0xFFFF ) ;
hdr - > headersz_msb = ( binhdrsz & 0xFFFF0000 ) > > 16 ;
cur + = sizeof ( struct opt_hdr_v1 ) ;
args = ( uint32_t * ) cur ;
* args = cpu_to_le32 ( binarye - > binary . nargs ) ;
args + + ;
for ( argi = 0 ; argi < binarye - > binary . nargs ; argi + + )
args [ argi ] = cpu_to_le32 ( binarye - > binary . args [ argi ] ) ;
cur + = ( binarye - > binary . nargs + 1 ) * sizeof ( uint32_t ) ;
ret = fread ( cur , s . st_size , 1 , bin ) ;
if ( ret ! = 1 ) {
fprintf ( stderr ,
" Could not read binary image %s \n " ,
binarye - > binary . file ) ;
return NULL ;
}
fclose ( bin ) ;
cur + = ALIGN_SUP ( s . st_size , 4 ) ;
/*
* For now , we don ' t support more than one binary
* header , and no other header types are
* supported . So , the binary header is necessarily the
* last one
*/
* ( ( uint32_t * ) cur ) = 0x00000000 ;
cur + = sizeof ( uint32_t ) ;
}
if ( add_binary_header_v1 ( cur ) )
return NULL ;
/* Calculate and set the header checksum */
main_hdr - > checksum = image_checksum8 ( main_hdr , headersz ) ;