
From: Pali Rohár pali@kernel.org
The kwbimage v1 format supports multiple BINARY executable headers. Add support for it into mkimage/kwbimage tool.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Marek Behún marek.behun@nic.cz --- tools/kwbimage.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-)
diff --git a/tools/kwbimage.c b/tools/kwbimage.c index 656f3f9ae9..08c9ba99d4 100644 --- a/tools/kwbimage.c +++ b/tools/kwbimage.c @@ -942,6 +942,7 @@ static size_t image_headersz_v1(int *hasext) { struct image_cfg_element *binarye; size_t headersz; + int cfgi;
/* * Calculate the size of the header and the size of the @@ -949,21 +950,19 @@ static size_t image_headersz_v1(int *hasext) */ headersz = sizeof(struct main_hdr_v1);
- if (image_count_options(IMAGE_CFG_BINARY) > 1) { - fprintf(stderr, "More than one binary blob, not supported\n"); - return 0; - } - if (image_count_options(IMAGE_CFG_PAYLOAD) > 1) { fprintf(stderr, "More than one payload, not possible\n"); return 0; }
- binarye = image_find_option(IMAGE_CFG_BINARY); - if (binarye) { + for (cfgi = 0; cfgi < cfgn; cfgi++) { int ret; struct stat s;
+ binarye = &image_cfg[cfgi]; + if (binarye->type != IMAGE_CFG_BINARY) + continue; + ret = stat(binarye->binary.file, &s); if (ret < 0) { char cwd[PATH_MAX]; @@ -1005,9 +1004,9 @@ static size_t image_headersz_v1(int *hasext) return ALIGN(headersz, 4096); }
-int add_binary_header_v1(uint8_t *cur) +int add_binary_header_v1(uint8_t *cur, uint8_t **next_ext, + struct image_cfg_element *binarye) { - struct image_cfg_element *binarye; struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)cur; uint32_t *args; size_t binhdrsz; @@ -1016,11 +1015,6 @@ int add_binary_header_v1(uint8_t *cur) 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"); @@ -1071,13 +1065,8 @@ int add_binary_header_v1(uint8_t *cur)
cur += ALIGN(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; + **next_ext = 1; + *next_ext = cur;
cur += sizeof(uint32_t);
@@ -1212,6 +1201,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, uint8_t *image, *cur; int hasext = 0; uint8_t *next_ext = NULL; + int cfgi;
/* * Calculate the size of the header and the size of the @@ -1288,13 +1278,19 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, */ secure_hdr = (struct secure_hdr_v1 *)cur; cur += sizeof(struct secure_hdr_v1); + *next_ext = 1; next_ext = &secure_hdr->next; } #endif - *next_ext = 1;
- if (add_binary_header_v1(cur)) - return NULL; + for (cfgi = 0; cfgi < cfgn; cfgi++) { + e = &image_cfg[cfgi]; + if (e->type != IMAGE_CFG_BINARY) + continue; + + if (add_binary_header_v1(cur, &next_ext, e)) + return NULL; + }
#if defined(CONFIG_KWB_SECURE) if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz,