diff mbox

[U-Boot,v4,5/7] tools: add padding of data image file for imximage

Message ID 1377616660-31849-1-git-send-email-sbabic@denx.de
State Changes Requested
Delegated to: Stefano Babic
Headers show

Commit Message

Stefano Babic Aug. 27, 2013, 3:17 p.m. UTC
Implement function vrec_header to be able to pad the final
data image file according the what has been calculated for
boot_data.length.

Signed-off-by: Stefano Babic <sbabic@denx.de>

---
Changes in v4:
- fix crash when imximage_init_loadsize is not set
Found during regression tests with boards ima3-mx53 and m53evk (Stefano Babic)

Changes in v3:
- uses stat instead of open / fstat / close (Marek Vasut)

Changes in v2: None

 tools/imximage.c |   88 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 85 insertions(+), 3 deletions(-)

Comments

York Sun Sept. 10, 2013, 10:14 p.m. UTC | #1
On 08/27/2013 08:17 AM, Stefano Babic wrote:
> Implement function vrec_header to be able to pad the final
> data image file according the what has been calculated for
> boot_data.length.
> 
> Signed-off-by: Stefano Babic <sbabic@denx.de>
> 
> ---
> Changes in v4:
> - fix crash when imximage_init_loadsize is not set
> Found during regression tests with boards ima3-mx53 and m53evk (Stefano Babic)
> 
> Changes in v3:
> - uses stat instead of open / fstat / close (Marek Vasut)
> 
> Changes in v2: None
> 
>  tools/imximage.c |   88 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 85 insertions(+), 3 deletions(-)
> 

<snip>

> +static int imximage_generate(struct mkimage_params *params,
> +	struct image_type_params *tparams)
> +{
> +	struct imx_header *imxhdr;
> +	size_t alloc_len;
> +	struct stat sbuf;
> +	char *datafile = params->datafile;
> +	uint32_t pad_len;
> +
> +	memset(&imximage_header, 0, sizeof(imximage_header));
> +
> +	/*
> +	 * In order to not change the old imx cfg file
> +	 * by adding VERSION command into it, here need
> +	 * set up function ptr group to V1 by default.
> +	 */
> +	imximage_version = IMXIMAGE_V1;
> +	/* Be able to detect if the cfg file has no BOOT_FROM tag */
> +	imximage_ivt_offset = FLASH_OFFSET_UNDEFINED;
> +	imximage_csf_size = 0;
> +	set_hdr_func(imxhdr);

Doesn't this line has compiling warning for you?

imximage.c: In function ‘imximage_generate’:
imximage.c:634: warning: ‘imxhdr’ is used uninitialized in this function

York
Stefano Babic Sept. 11, 2013, 7:13 a.m. UTC | #2
Hi York,

On 11/09/2013 00:14, York Sun wrote:

>> +static int imximage_generate(struct mkimage_params *params,
>> +	struct image_type_params *tparams)
>> +{
>> +	struct imx_header *imxhdr;
>> +	size_t alloc_len;
>> +	struct stat sbuf;
>> +	char *datafile = params->datafile;
>> +	uint32_t pad_len;
>> +
>> +	memset(&imximage_header, 0, sizeof(imximage_header));
>> +
>> +	/*
>> +	 * In order to not change the old imx cfg file
>> +	 * by adding VERSION command into it, here need
>> +	 * set up function ptr group to V1 by default.
>> +	 */
>> +	imximage_version = IMXIMAGE_V1;
>> +	/* Be able to detect if the cfg file has no BOOT_FROM tag */
>> +	imximage_ivt_offset = FLASH_OFFSET_UNDEFINED;
>> +	imximage_csf_size = 0;
>> +	set_hdr_func(imxhdr);
> 
> Doesn't this line has compiling warning for you?
> 
> imximage.c: In function ‘imximage_generate’:
> imximage.c:634: warning: ‘imxhdr’ is used uninitialized in this function

I see the issue, but I hadn't warnings, gcc version 4.6.3 (Ubuntu/Linaro
4.6.3-1ubuntu5). Which gcc version do you have ?

Anyway, set_hdr_func() does not use parameters anymore. It can be
converted to set_hdr_func(void) and we get rid of warnings.

Stefano
York Sun Sept. 11, 2013, 3:20 p.m. UTC | #3
On 09/11/2013 12:13 AM, Stefano Babic wrote:
> Hi York,
> 
> On 11/09/2013 00:14, York Sun wrote:
> 
>>> +static int imximage_generate(struct mkimage_params *params,
>>> +	struct image_type_params *tparams)
>>> +{
>>> +	struct imx_header *imxhdr;
>>> +	size_t alloc_len;
>>> +	struct stat sbuf;
>>> +	char *datafile = params->datafile;
>>> +	uint32_t pad_len;
>>> +
>>> +	memset(&imximage_header, 0, sizeof(imximage_header));
>>> +
>>> +	/*
>>> +	 * In order to not change the old imx cfg file
>>> +	 * by adding VERSION command into it, here need
>>> +	 * set up function ptr group to V1 by default.
>>> +	 */
>>> +	imximage_version = IMXIMAGE_V1;
>>> +	/* Be able to detect if the cfg file has no BOOT_FROM tag */
>>> +	imximage_ivt_offset = FLASH_OFFSET_UNDEFINED;
>>> +	imximage_csf_size = 0;
>>> +	set_hdr_func(imxhdr);
>>
>> Doesn't this line has compiling warning for you?
>>
>> imximage.c: In function ‘imximage_generate’:
>> imximage.c:634: warning: ‘imxhdr’ is used uninitialized in this function
> 
> I see the issue, but I hadn't warnings, gcc version 4.6.3 (Ubuntu/Linaro
> 4.6.3-1ubuntu5). Which gcc version do you have ?
> 
> Anyway, set_hdr_func() does not use parameters anymore. It can be
> converted to set_hdr_func(void) and we get rid of warnings.
> 

I have gcc version 4.6.2 and 4.7.2.

York
diff mbox

Patch

diff --git a/tools/imximage.c b/tools/imximage.c
index 2b4909e..26460bf 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -365,6 +365,13 @@  static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 				name, lineno, token);
 			exit(EXIT_FAILURE);
 		}
+
+		/*
+		 * The SOC loads from the storage starting at address 0
+		 * then ensures that the load size contains the offset
+		 */
+		if (imximage_init_loadsize < imximage_ivt_offset)
+			imximage_init_loadsize = imximage_ivt_offset;
 		if (unlikely(cmd_ver_first != 1))
 			cmd_ver_first = 0;
 		break;
@@ -439,7 +446,8 @@  static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name)
 		exit(EXIT_FAILURE);
 	}
 
-	/* Very simple parsing, line starting with # are comments
+	/*
+	 * Very simple parsing, line starting with # are comments
 	 * and are dropped
 	 */
 	while ((getline(&line, &len, fd)) > 0) {
@@ -571,18 +579,92 @@  int imximage_check_params(struct mkimage_params *params)
 		(params->xflag) || !(strlen(params->imagename));
 }
 
+static int imximage_generate(struct mkimage_params *params,
+	struct image_type_params *tparams)
+{
+	struct imx_header *imxhdr;
+	size_t alloc_len;
+	struct stat sbuf;
+	char *datafile = params->datafile;
+	uint32_t pad_len;
+
+	memset(&imximage_header, 0, sizeof(imximage_header));
+
+	/*
+	 * In order to not change the old imx cfg file
+	 * by adding VERSION command into it, here need
+	 * set up function ptr group to V1 by default.
+	 */
+	imximage_version = IMXIMAGE_V1;
+	/* Be able to detect if the cfg file has no BOOT_FROM tag */
+	imximage_ivt_offset = FLASH_OFFSET_UNDEFINED;
+	imximage_csf_size = 0;
+	set_hdr_func(imxhdr);
+
+	/* Parse dcd configuration file */
+	parse_cfg_file(&imximage_header, params->imagename);
+
+	/* TODO: check i.MX image V1 handling, for now use 'old' style */
+	if (imximage_version == IMXIMAGE_V1) {
+		alloc_len = 4096;
+	} else {
+		if (imximage_init_loadsize < imximage_ivt_offset +
+			sizeof(imx_header_v2_t))
+				imximage_init_loadsize = imximage_ivt_offset +
+					sizeof(imx_header_v2_t);
+		alloc_len = imximage_init_loadsize - imximage_ivt_offset;
+	}
+
+	if (alloc_len < sizeof(struct imx_header)) {
+		fprintf(stderr, "%s: header error\n",
+			params->cmdname);
+		exit(EXIT_FAILURE);
+	}
+
+	imxhdr = malloc(alloc_len);
+
+	if (!imxhdr) {
+		fprintf(stderr, "%s: malloc return failure: %s\n",
+			params->cmdname, strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	memset(imxhdr, 0, alloc_len);
+
+	tparams->header_size = alloc_len;
+	tparams->hdr         = imxhdr;
+
+	/* determine data image file length */
+
+	if (stat(datafile, &sbuf) < 0) {
+		fprintf(stderr, "%s: Can't stat %s: %s\n",
+			params->cmdname, datafile, strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	pad_len = ROUND(sbuf.st_size, 4096) - sbuf.st_size;
+
+	/* TODO: check i.MX image V1 handling, for now use 'old' style */
+	if (imximage_version == IMXIMAGE_V1)
+		return 0;
+	else
+		return pad_len;
+}
+
+
 /*
  * imximage parameters
  */
 static struct image_type_params imximage_params = {
 	.name		= "Freescale i.MX Boot Image support",
-	.header_size	= sizeof(struct imx_header),
-	.hdr		= (void *)&imximage_header,
+	.header_size	= 0,
+	.hdr		= NULL,
 	.check_image_type = imximage_check_image_types,
 	.verify_header	= imximage_verify_header,
 	.print_header	= imximage_print_header,
 	.set_header	= imximage_set_header,
 	.check_params	= imximage_check_params,
+	.vrec_header	= imximage_generate,
 };
 
 void init_imx_image_type(void)