Skip to contentSkip to conversation

This little series fixes some issues with kwbimage.

PATCH New Reinhard Pfau 2 participants 5 messages Nov 27, 2015

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index d33f1b6..afba73f 100644
@@ -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
index 9d2585c..e6e3d1d 100644
@@ -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
#3 lore raw

PATCH 2/2 kwbimage: fix size computations for v1 images

In reply to 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.

---

 tools/kwbimage.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
tools/kwbimage.c +4 -3
index afba73f..ff06b19 100644
@@ -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
#4 lore raw

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.

Thanks,
Stefan