From: Martin Kaiser <mar...@kaiser.cx>

We can use the same mechanism for the imximage v1 header length
calculations that we're using for v2. Doing so, we can share more code
between v1 and v2.

Additionally, *header_size_ptr in imximage_set_header() will then have
the correct value for both v1 and v2.

Signed-off-by: Martin Kaiser <mar...@kaiser.cx>
---

I discovered the problem when I tried to use csf_ptr with imximage v1
(as part of a private modification).

*csf_ptr = params->ep + *header_size_ptr - imximage_init_loadsize;
         = params->ep + sbuf->st_size +
                     imximage_ivt_offset - imximage_init_loadsize;
         = params->ep + padded data file size + alloc_len -
                     (imximage_init_loadsize - imximage_ivt_offset);

This works only if
alloc_len == imximage_init_loadsize - imximage_ivt_offset,
not if alloc_len is always 4096.

 tools/imximage.c |   43 ++++++++++++++++++++-----------------------
 1 file changed, 20 insertions(+), 23 deletions(-)




Resending this patch after one month of silence. Is there anything I can do to
get this reviewed? My tests haven't shown any problems so far.



diff --git a/tools/imximage.c b/tools/imximage.c
index 092d550..e280da6 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -291,8 +291,7 @@ static void set_imx_hdr_v1(struct imx_header *imxhdr, 
uint32_t dcd_len,
        /* Set magic number */
        fhdr_v1->app_code_barker = APP_CODE_BARKER;
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       hdr_base = entry_point - 4096;
+       hdr_base = entry_point - imximage_init_loadsize + flash_offset;
        fhdr_v1->app_dest_ptr = hdr_base - flash_offset;
        fhdr_v1->app_code_jump_vector = entry_point;
 
@@ -649,6 +648,7 @@ static void imximage_set_header(void *ptr, struct stat 
*sbuf, int ifd,
 {
        struct imx_header *imxhdr = (struct imx_header *)ptr;
        uint32_t dcd_len;
+       uint32_t imx_hdr_size;
 
        /*
         * In order to not change the old imx cfg file
@@ -664,12 +664,13 @@ static void imximage_set_header(void *ptr, struct stat 
*sbuf, int ifd,
        /* Parse dcd configuration file */
        dcd_len = parse_cfg_file(imxhdr, params->imagename);
 
-       if (imximage_version == IMXIMAGE_V2) {
-               if (imximage_init_loadsize < imximage_ivt_offset +
-                       sizeof(imx_header_v2_t))
-                               imximage_init_loadsize = imximage_ivt_offset +
-                                       sizeof(imx_header_v2_t);
-       }
+       if (imximage_version == IMXIMAGE_V1)
+               imx_hdr_size = sizeof(imx_header_v1_t);
+       else
+               imx_hdr_size = sizeof(imx_header_v2_t);
+
+       if (imximage_init_loadsize < imximage_ivt_offset + imx_hdr_size)
+               imximage_init_loadsize = imximage_ivt_offset + imx_hdr_size;
 
        /* Set the imx header */
        (*set_imx_hdr)(imxhdr, dcd_len, params->ep, imximage_ivt_offset);
@@ -722,6 +723,7 @@ static int imximage_generate(struct image_tool_params 
*params,
        struct stat sbuf;
        char *datafile = params->datafile;
        uint32_t pad_len;
+       uint32_t imx_hdr_size;
 
        memset(&imximage_header, 0, sizeof(imximage_header));
 
@@ -739,16 +741,15 @@ static int imximage_generate(struct image_tool_params 
*params,
        /* 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 (imximage_version == IMXIMAGE_V1)
+               imx_hdr_size = sizeof(imx_header_v1_t);
+       else
+               imx_hdr_size = sizeof(imx_header_v2_t);
+
+       if (imximage_init_loadsize < imximage_ivt_offset + imx_hdr_size)
+               imximage_init_loadsize = imximage_ivt_offset + imx_hdr_size;
+
+       alloc_len = imximage_init_loadsize - imximage_ivt_offset;
 
        if (alloc_len < sizeof(struct imx_header)) {
                fprintf(stderr, "%s: header error\n",
@@ -779,11 +780,7 @@ static int imximage_generate(struct image_tool_params 
*params,
 
        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;
+       return pad_len;
 }
 
 
-- 
1.7.10.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to