This little series fixes some issues with kwbimage.
cover This little series fixes some issues with kwbimage.
It makes kwbimage working on BE build hosts and fixes some flaws in computation of image header sizes.
Reinhard Pfau (2):
kwbimage: fix endianess issue
kwbimage: fix size computations for v1 images
tools/kwbimage.c | 50 ++++++++++++++++++++++++++++---------------------- tools/kwbimage.h | 3 ++- 2 files changed, 30 insertions(+), 23 deletions(-)
Signature · 1 line
1.8.3
PATCH 1/2 kwbimage: fix endianess issue
KWB image header values are in little endian (LE).
So adding appropriate cpu_to_leXX() calls to allow building those images on BE hosts, too.
---
tools/kwbimage.c | 43 ++++++++++++++++++++++++------------------- tools/kwbimage.h | 3 ++- 2 files changed, 26 insertions(+), 20 deletions(-)
tools/kwbimage.c +24 -19
@@ -232,11 +232,12 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params, main_hdr = image;/* Fill in the main header */ - main_hdr->blocksize = payloadsz +sizeof (uint32_t ) - headersz; - main_hdr->srcaddr = headersz; + main_hdr->blocksize = +cpu_to_le32 (payloadsz +sizeof (uint32_t ) - headersz); + main_hdr->srcaddr =cpu_to_le32 (headersz); main_hdr->ext = has_ext; - main_hdr->destaddr = params->addr; - main_hdr->execaddr = params->ep; + main_hdr->destaddr =cpu_to_le32 (params->addr); + main_hdr->execaddr =cpu_to_le32 (params->ep); e =image_find_option (IMAGE_CFG_BOOT_FROM );if (e)
@@ -246,7 +247,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params, main_hdr->nandeccmode = e->nandeccmode; e =image_find_option (IMAGE_CFG_NAND_PAGESZ );if (e) - main_hdr->nandpagesize = e->nandpagesz; + main_hdr->nandpagesize =cpu_to_le16 (e->nandpagesz); main_hdr->checksum =image_checksum8 (image,sizeof (struct main_hdr_v0 ));
@@ -255,15 +256,17 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,int cfgi, datai; ext_hdr = image +sizeof (struct main_hdr_v0 ); - ext_hdr->offset =0x40 ; + ext_hdr->offset =cpu_to_le32 (0x40 );for (cfgi =0 , datai =0 ; cfgi < cfgn; cfgi++) { e = &image_cfg[cfgi];if (e->type !=IMAGE_CFG_DATA )continue ; - ext_hdr->rcfg[datai].raddr = e->regdata.raddr; - ext_hdr->rcfg[datai].rdata = e->regdata.rdata; + ext_hdr->rcfg[datai].raddr = +cpu_to_le32 (e->regdata.raddr); + ext_hdr->rcfg[datai].rdata = +cpu_to_le32 (e->regdata.rdata); datai++; }
@@ -376,12 +379,13 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, cur +=sizeof (struct main_hdr_v1 );/* Fill the main header */ - main_hdr->blocksize = payloadsz - headersz +sizeof (uint32_t ); - main_hdr->headersz_lsb = headersz &0xFFFF ; + main_hdr->blocksize = +cpu_to_le32 (payloadsz - headersz +sizeof (uint32_t )); + main_hdr->headersz_lsb =cpu_to_le16 (headersz &0xFFFF ); main_hdr->headersz_msb = (headersz &0xFFFF0000 ) >>16 ; - main_hdr->destaddr = params->addr; - main_hdr->execaddr = params->ep; - main_hdr->srcaddr = headersz; + main_hdr->destaddr =cpu_to_le32 (params->addr); + main_hdr->execaddr =cpu_to_le32 (params->ep); + main_hdr->srcaddr =cpu_to_le32 (headersz); main_hdr->ext = hasext; main_hdr->version =1 ; e =image_find_option (IMAGE_CFG_BOOT_FROM );
@@ -397,7 +401,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, binarye =image_find_option (IMAGE_CFG_BINARY );if (binarye) {struct opt_hdr_v1 *hdr = cur; -unsigned int *args; +uint32_t *args;size_t binhdrsz;struct stat s;int argi;
@@ -418,18 +422,18 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, (binarye->binary.nargs +1 ) *sizeof (unsigned int ) + s.st_size; binhdrsz =ALIGN_SUP (binhdrsz,32 ); - hdr->headersz_lsb = binhdrsz &0xFFFF ; + hdr->headersz_lsb =cpu_to_le16 (binhdrsz &0xFFFF ); hdr->headersz_msb = (binhdrsz &0xFFFF0000 ) >>16 ; cur +=sizeof (struct opt_hdr_v1 ); args = cur; - *args = binarye->binary.nargs; + *args =cpu_to_le32 (binarye->binary.nargs); args++;for (argi =0 ; argi < binarye->binary.nargs; argi++) - args[argi] = binarye->binary.args[argi]; + args[argi] =cpu_to_le32 (binarye->binary.args[argi]); - cur += (binarye->binary.nargs +1 ) *sizeof (unsigned int ); + cur += (binarye->binary.nargs +1 ) *sizeof (uint32_t ); ret =fread (cur, s.st_size,1 , bin);if (ret !=1 ) {
@@ -714,7 +718,8 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,free (image_cfg);/* Build and add image checksum header */ - checksum =image_checksum32 ((uint32_t *)ptr, sbuf->st_size); + checksum = +cpu_to_le32 (image_checksum32 ((uint32_t *)ptr, sbuf->st_size)); size =write (ifd, &checksum,sizeof (uint32_t ));if (size !=sizeof (uint32_t )) { fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n",
tools/kwbimage.h +2 -1
@@ -9,6 +9,7 @@#ifndef _KWBIMAGE_H_#define _KWBIMAGE_H_ +#include <compiler.h> #include <stdint.h> #define KWBIMAGE_MAX_CONFIG ((0x1dc - 0x20)/sizeof(struct reg_config))
@@ -115,7 +116,7 @@ struct opt_hdr_v1 {#define OPT_HDR_V1_REGISTER_TYPE 0x3#define KWBHEADER_V1_SIZE (hdr) \ - (((hdr)->headersz_msb << 16) | (hdr)->headersz_lsb) + (((hdr)->headersz_msb << 16) | le16_to_cpu((hdr)->headersz_lsb))enum kwbimage_cmd {CMD_INVALID ,
Signature · 1 line
1.8.3
PATCH 1/2 kwbimage: fix endianess issue
Quoted 6 lines · Reinhard Pfau
KWB image header values are in little endian (LE).
So adding appropriatecpu_to_leXX()calls to allow building those images on BE hosts, too.Signed-off-by Reinhard Pfau <[email protected]>Cc Luka Perkov <[email protected]>
Thanks,
Stefan
PATCH 2/2 kwbimage: fix size computations for v1 images
In reply to Reinhard PfauFix computation of haeder size and binary header size.
Size of opt header and some 32bit values were not taken into account. This could result in invalid boot images (due to the wrong binary header size, the image could claim to have another extension header after the binary extension although there is none).
Use "uint32_t" instead of "unsigned int" for header size computation.
---
tools/kwbimage.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
tools/kwbimage.c +4 -3
@@ -324,8 +324,9 @@ static size_t image_headersz_v1(struct image_tool_params *params,return 0 ; } - headersz += s.st_size + - binarye->binary.nargs *sizeof (unsigned int ); + headersz +=sizeof (struct opt_hdr_v1 ) + + s.st_size + + (binarye->binary.nargs +2 ) *sizeof (uint32_t );if (hasext) *hasext =1 ; }
@@ -419,7 +420,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,fstat (fileno (bin), &s); binhdrsz =sizeof (struct opt_hdr_v1 ) + - (binarye->binary.nargs +1 ) *sizeof (unsigned int ) + + (binarye->binary.nargs +2 ) *sizeof (uint32_t ) + s.st_size; binhdrsz =ALIGN_SUP (binhdrsz,32 ); hdr->headersz_lsb =cpu_to_le16 (binhdrsz &0xFFFF );
Signature · 1 line
1.8.3
PATCH 2/2 kwbimage: fix size computations for v1 images
Quoted 10 lines · Reinhard Pfau
Fix computation of haeder size and binary header size.
Size of opt header and some 32bit values were not taken into account. This could result in invalid boot images (due to the wrong binary header size, the image could claim to have another extension header after the binary extension although there is none).Use "
uint32_t" instead of "unsigned int" for header size computation.Signed-off-by Reinhard Pfau <[email protected]>Cc Luka Perkov <[email protected]>
Thanks,
Stefan