diff options
| author | Stefano Babic <sbabic@denx.de> | 2010-02-05 15:16:02 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-02-24 00:04:03 +0100 | 
| commit | 5b28e913f4519870ad2ca06cd7845b053f78bf0f (patch) | |
| tree | 4c17b6e46b257fed51f3b9c75bfeeafa8516dc5f /tools | |
| parent | 77e7273c40315abd2f3c17ad8d46a78950e3e65f (diff) | |
| download | olio-uboot-2014.01-5b28e913f4519870ad2ca06cd7845b053f78bf0f.tar.xz olio-uboot-2014.01-5b28e913f4519870ad2ca06cd7845b053f78bf0f.zip | |
mkimage: SEGFAULT with imximage on 64 bit systems
Running mkimage to generate an imximage produces a SEGFAULT
on 64 bit machines due to pointer arithmetic limited to 32 bit.
Signed-off-by: Stefano Babic <sbabic@denx.de>
Acked-by: Kim Phillips <kim.phillips@freescale.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/imximage.c | 30 | ||||
| -rw-r--r-- | tools/imximage.h | 2 | 
2 files changed, 15 insertions, 17 deletions
| diff --git a/tools/imximage.c b/tools/imximage.c index 59923ffef..43da67800 100644 --- a/tools/imximage.c +++ b/tools/imximage.c @@ -101,22 +101,23 @@ static void imximage_print_header(const void *ptr)  	struct imx_header *imx_hdr = (struct imx_header *) ptr;  	flash_header_t *hdr = &imx_hdr->fhdr;  	uint32_t size; -	flash_cfg_parms_t *ext_header; +	uint32_t length; +	dcd_t *dcd = &imx_hdr->dcd_table;  	size = imx_hdr->dcd_table.preamble.length;  	if (size > (MAX_HW_CFG_SIZE * sizeof(dcd_type_addr_data_t))) {  		fprintf(stderr,  			"Error: Image corrupt DCD size %d exceed maximum %d\n", -			size / sizeof(dcd_type_addr_data_t), MAX_HW_CFG_SIZE); +			(uint32_t)(size / sizeof(dcd_type_addr_data_t)), +			MAX_HW_CFG_SIZE);  		exit(EXIT_FAILURE);  	} -	ext_header = (flash_cfg_parms_t *) ((uint32_t)&imx_hdr->dcd_table + -			sizeof(dcd_preamble_t) + size); +	length =  dcd->preamble.length / sizeof(dcd_type_addr_data_t);  	printf("Image Type:   Freescale IMX Boot Image\n");  	printf("Data Size:    "); -	genimg_print_size(ext_header->length); +	genimg_print_size(dcd->addr_data[length].type);  	printf("Load Address: %08x\n", (unsigned int)hdr->app_dest_ptr);  	printf("Entry Point:  %08x\n", (unsigned int)hdr->app_code_jump_vector);  } @@ -237,7 +238,7 @@ static uint32_t imximage_parse_cfg_file(struct imx_header *imxhdr, char *name)  	dcd->preamble.length = dcd_len * sizeof(dcd_type_addr_data_t);  	fclose(fd); -	return dcd->preamble.length; +	return dcd_len;  }  static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd, @@ -246,7 +247,7 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,  	struct imx_header *hdr = (struct imx_header *)ptr;  	flash_header_t *fhdr = &hdr->fhdr;  	int dcd_len; -	flash_cfg_parms_t *ext_header; +	dcd_t *dcd = &hdr->dcd_table;  	uint32_t base_offset;  	/* Set default offset */ @@ -264,24 +265,21 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,  	fhdr->app_code_jump_vector = params->ep;  	base_offset = fhdr->app_dest_ptr + hdr->flash_offset ; -	fhdr->dcd_ptr_ptr = (uint32_t) ((uint32_t)&fhdr->dcd_ptr - -		(uint32_t)&fhdr->app_code_jump_vector) + base_offset ; +	fhdr->dcd_ptr_ptr = (uint32_t) (offsetof(flash_header_t, dcd_ptr) - +		offsetof(flash_header_t, app_code_jump_vector) + +		base_offset);  	fhdr->dcd_ptr = base_offset + -			((uint32_t)&hdr->dcd_table - -			(uint32_t)&hdr->fhdr); +			offsetof(struct imx_header, dcd_table);  	/* The external flash header must be at the end of the DCD table */ -	ext_header = (flash_cfg_parms_t *) ((uint32_t)&hdr->dcd_table + -			dcd_len + -			sizeof(dcd_preamble_t)); -	ext_header->length = sbuf->st_size + +	dcd->addr_data[dcd_len].type = sbuf->st_size +  				hdr->flash_offset +  				sizeof(struct imx_header);  	/* Security feature are not supported */  	fhdr->app_code_csf = 0; -	fhdr->super_root_key = NULL; +	fhdr->super_root_key = 0;  } diff --git a/tools/imximage.h b/tools/imximage.h index c579f513d..b4d926d81 100644 --- a/tools/imximage.h +++ b/tools/imximage.h @@ -81,7 +81,7 @@ typedef struct {  	uint32_t app_code_barker;  	uint32_t app_code_csf;  	uint32_t dcd_ptr_ptr; -	hab_rsa_public_key *super_root_key; +	uint32_t super_root_key;  	uint32_t dcd_ptr;  	uint32_t app_dest_ptr;  } flash_header_t; |