tools: kwbimage: Factor out add_binary_header_v1
In preparation of adding the creation of secure headers, we factor the add_binary_header_v1 function out of the image_create_v1 function. Signed-off-by: Mario Six <mario.six@gdsys.cc> Reviewed-by: Stefan Roese <sr@denx.de> Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
e93cf53f14
commit
79066ef8c9
146
tools/kwbimage.c
146
tools/kwbimage.c
@ -369,6 +369,7 @@ static size_t image_headersz_v1(int *hasext)
|
||||
fprintf(stderr, "Increase CONFIG_SYS_U_BOOT_OFFS!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
headersz = CONFIG_SYS_U_BOOT_OFFS;
|
||||
#endif
|
||||
|
||||
@ -379,10 +380,85 @@ static size_t image_headersz_v1(int *hasext)
|
||||
return ALIGN_SUP(headersz, 4096);
|
||||
}
|
||||
|
||||
int add_binary_header_v1(uint8_t *cur)
|
||||
{
|
||||
struct image_cfg_element *binarye;
|
||||
struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)cur;
|
||||
uint32_t *args;
|
||||
size_t binhdrsz;
|
||||
struct stat s;
|
||||
int argi;
|
||||
FILE *bin;
|
||||
int ret;
|
||||
|
||||
binarye = image_find_option(IMAGE_CFG_BINARY);
|
||||
|
||||
if (!binarye)
|
||||
return 0;
|
||||
|
||||
hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
|
||||
|
||||
bin = fopen(binarye->binary.file, "r");
|
||||
if (!bin) {
|
||||
fprintf(stderr, "Cannot open binary file %s\n",
|
||||
binarye->binary.file);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fstat(fileno(bin), &s);
|
||||
|
||||
binhdrsz = sizeof(struct opt_hdr_v1) +
|
||||
(binarye->binary.nargs + 2) * sizeof(uint32_t) +
|
||||
s.st_size;
|
||||
|
||||
/*
|
||||
* The size includes the binary image size, rounded
|
||||
* up to a 4-byte boundary. Plus 4 bytes for the
|
||||
* next-header byte and 3-byte alignment at the end.
|
||||
*/
|
||||
binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
|
||||
hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
|
||||
hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
|
||||
|
||||
cur += sizeof(struct opt_hdr_v1);
|
||||
|
||||
args = (uint32_t *)cur;
|
||||
*args = cpu_to_le32(binarye->binary.nargs);
|
||||
args++;
|
||||
for (argi = 0; argi < binarye->binary.nargs; argi++)
|
||||
args[argi] = cpu_to_le32(binarye->binary.args[argi]);
|
||||
|
||||
cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
|
||||
|
||||
ret = fread(cur, s.st_size, 1, bin);
|
||||
if (ret != 1) {
|
||||
fprintf(stderr,
|
||||
"Could not read binary image %s\n",
|
||||
binarye->binary.file);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fclose(bin);
|
||||
|
||||
cur += ALIGN_SUP(s.st_size, 4);
|
||||
|
||||
/*
|
||||
* For now, we don't support more than one binary
|
||||
* header, and no other header types are
|
||||
* supported. So, the binary header is necessarily the
|
||||
* last one
|
||||
*/
|
||||
*((uint32_t *)cur) = 0x00000000;
|
||||
|
||||
cur += sizeof(uint32_t);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
|
||||
int payloadsz)
|
||||
{
|
||||
struct image_cfg_element *e, *binarye;
|
||||
struct image_cfg_element *e;
|
||||
struct main_hdr_v1 *main_hdr;
|
||||
size_t headersz;
|
||||
uint8_t *image, *cur;
|
||||
@ -434,72 +510,8 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
|
||||
if (e)
|
||||
main_hdr->flags = e->debug ? 0x1 : 0;
|
||||
|
||||
binarye = image_find_option(IMAGE_CFG_BINARY);
|
||||
if (binarye) {
|
||||
struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)cur;
|
||||
uint32_t *args;
|
||||
size_t binhdrsz;
|
||||
struct stat s;
|
||||
int argi;
|
||||
FILE *bin;
|
||||
int ret;
|
||||
|
||||
hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
|
||||
|
||||
bin = fopen(binarye->binary.file, "r");
|
||||
if (!bin) {
|
||||
fprintf(stderr, "Cannot open binary file %s\n",
|
||||
binarye->binary.file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fstat(fileno(bin), &s);
|
||||
|
||||
binhdrsz = sizeof(struct opt_hdr_v1) +
|
||||
(binarye->binary.nargs + 2) * sizeof(uint32_t) +
|
||||
s.st_size;
|
||||
|
||||
/*
|
||||
* The size includes the binary image size, rounded
|
||||
* up to a 4-byte boundary. Plus 4 bytes for the
|
||||
* next-header byte and 3-byte alignment at the end.
|
||||
*/
|
||||
binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
|
||||
hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
|
||||
hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
|
||||
|
||||
cur += sizeof(struct opt_hdr_v1);
|
||||
|
||||
args = (uint32_t *)cur;
|
||||
*args = cpu_to_le32(binarye->binary.nargs);
|
||||
args++;
|
||||
for (argi = 0; argi < binarye->binary.nargs; argi++)
|
||||
args[argi] = cpu_to_le32(binarye->binary.args[argi]);
|
||||
|
||||
cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
|
||||
|
||||
ret = fread(cur, s.st_size, 1, bin);
|
||||
if (ret != 1) {
|
||||
fprintf(stderr,
|
||||
"Could not read binary image %s\n",
|
||||
binarye->binary.file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fclose(bin);
|
||||
|
||||
cur += ALIGN_SUP(s.st_size, 4);
|
||||
|
||||
/*
|
||||
* For now, we don't support more than one binary
|
||||
* header, and no other header types are
|
||||
* supported. So, the binary header is necessarily the
|
||||
* last one
|
||||
*/
|
||||
*((uint32_t *)cur) = 0x00000000;
|
||||
|
||||
cur += sizeof(uint32_t);
|
||||
}
|
||||
if (add_binary_header_v1(cur))
|
||||
return NULL;
|
||||
|
||||
/* Calculate and set the header checksum */
|
||||
main_hdr->checksum = image_checksum8(main_hdr, headersz);
|
||||
|
Loading…
Reference in New Issue
Block a user