1
0
Fork 0

tools/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.

Signed-off-by: Reinhard Pfau <reinhard.pfau@gdsys.cc>
Reviewed-by: Stefan Roese <sr@denx.de>
utp
Reinhard Pfau 2015-11-29 15:48:25 +01:00 committed by Luka Perkov
parent 7772085930
commit a8840dced0
2 changed files with 26 additions and 20 deletions

View File

@ -232,11 +232,12 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
main_hdr = image; main_hdr = image;
/* Fill in the main header */ /* Fill in the main header */
main_hdr->blocksize = payloadsz + sizeof(uint32_t) - headersz; main_hdr->blocksize =
main_hdr->srcaddr = headersz; cpu_to_le32(payloadsz + sizeof(uint32_t) - headersz);
main_hdr->srcaddr = cpu_to_le32(headersz);
main_hdr->ext = has_ext; main_hdr->ext = has_ext;
main_hdr->destaddr = params->addr; main_hdr->destaddr = cpu_to_le32(params->addr);
main_hdr->execaddr = params->ep; main_hdr->execaddr = cpu_to_le32(params->ep);
e = image_find_option(IMAGE_CFG_BOOT_FROM); e = image_find_option(IMAGE_CFG_BOOT_FROM);
if (e) if (e)
@ -246,7 +247,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
main_hdr->nandeccmode = e->nandeccmode; main_hdr->nandeccmode = e->nandeccmode;
e = image_find_option(IMAGE_CFG_NAND_PAGESZ); e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
if (e) if (e)
main_hdr->nandpagesize = e->nandpagesz; main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
main_hdr->checksum = image_checksum8(image, main_hdr->checksum = image_checksum8(image,
sizeof(struct main_hdr_v0)); 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; int cfgi, datai;
ext_hdr = image + sizeof(struct main_hdr_v0); 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++) { for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
e = &image_cfg[cfgi]; e = &image_cfg[cfgi];
if (e->type != IMAGE_CFG_DATA) if (e->type != IMAGE_CFG_DATA)
continue; continue;
ext_hdr->rcfg[datai].raddr = e->regdata.raddr; ext_hdr->rcfg[datai].raddr =
ext_hdr->rcfg[datai].rdata = e->regdata.rdata; cpu_to_le32(e->regdata.raddr);
ext_hdr->rcfg[datai].rdata =
cpu_to_le32(e->regdata.rdata);
datai++; datai++;
} }
@ -376,12 +379,13 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
cur += sizeof(struct main_hdr_v1); cur += sizeof(struct main_hdr_v1);
/* Fill the main header */ /* Fill the main header */
main_hdr->blocksize = payloadsz - headersz + sizeof(uint32_t); main_hdr->blocksize =
main_hdr->headersz_lsb = headersz & 0xFFFF; 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->headersz_msb = (headersz & 0xFFFF0000) >> 16;
main_hdr->destaddr = params->addr; main_hdr->destaddr = cpu_to_le32(params->addr);
main_hdr->execaddr = params->ep; main_hdr->execaddr = cpu_to_le32(params->ep);
main_hdr->srcaddr = headersz; main_hdr->srcaddr = cpu_to_le32(headersz);
main_hdr->ext = hasext; main_hdr->ext = hasext;
main_hdr->version = 1; main_hdr->version = 1;
e = image_find_option(IMAGE_CFG_BOOT_FROM); 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); binarye = image_find_option(IMAGE_CFG_BINARY);
if (binarye) { if (binarye) {
struct opt_hdr_v1 *hdr = cur; struct opt_hdr_v1 *hdr = cur;
unsigned int *args; uint32_t *args;
size_t binhdrsz; size_t binhdrsz;
struct stat s; struct stat s;
int argi; int argi;
@ -424,18 +428,18 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
* next-header byte and 3-byte alignment at the end. * next-header byte and 3-byte alignment at the end.
*/ */
binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4; binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
hdr->headersz_lsb = binhdrsz & 0xFFFF; hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16; hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
cur += sizeof(struct opt_hdr_v1); cur += sizeof(struct opt_hdr_v1);
args = cur; args = cur;
*args = binarye->binary.nargs; *args = cpu_to_le32(binarye->binary.nargs);
args++; args++;
for (argi = 0; argi < binarye->binary.nargs; argi++) 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); ret = fread(cur, s.st_size, 1, bin);
if (ret != 1) { if (ret != 1) {
@ -720,7 +724,8 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
free(image_cfg); free(image_cfg);
/* Build and add image checksum header */ /* 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)); size = write(ifd, &checksum, sizeof(uint32_t));
if (size != sizeof(uint32_t)) { if (size != sizeof(uint32_t)) {
fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n", fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n",

View File

@ -9,6 +9,7 @@
#ifndef _KWBIMAGE_H_ #ifndef _KWBIMAGE_H_
#define _KWBIMAGE_H_ #define _KWBIMAGE_H_
#include <compiler.h>
#include <stdint.h> #include <stdint.h>
#define KWBIMAGE_MAX_CONFIG ((0x1dc - 0x20)/sizeof(struct reg_config)) #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 OPT_HDR_V1_REGISTER_TYPE 0x3
#define KWBHEADER_V1_SIZE(hdr) \ #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 { enum kwbimage_cmd {
CMD_INVALID, CMD_INVALID,