summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2022-02-17 10:43:35 +0100
committerStefan Roese <sr@denx.de>2022-02-17 14:17:07 +0100
commit9a9a2c1acf6d343f943815b561e870b7746701ca (patch)
treefc5d2a3e877d5c5a09dab2b6b166be5dad19f9c9 /tools
parent3917ec57f71ca8284d8c32deb5037e8779235535 (diff)
tools: kwbimage: Fix calculating size of kwbimage v0 header
Extended and binary headers are optional and are part of the image header. Fixes kwboot to determinate correct length of Dove images. Signed-off-by: Pali Rohár <pali@kernel.org> Tested-by: Tony Dinh <mibodhi@gmail.com> Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'tools')
-rw-r--r--tools/kwbimage.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/tools/kwbimage.h b/tools/kwbimage.h
index 706bebddf4..502b6d5033 100644
--- a/tools/kwbimage.h
+++ b/tools/kwbimage.h
@@ -240,8 +240,20 @@ static inline size_t kwbheader_size(const void *header)
if (kwbimage_version(header) == 0) {
const struct main_hdr_v0 *hdr = header;
+ /*
+ * First extension header starts immediately after the main
+ * header without any padding. Between extension headers is
+ * 0x20 byte padding. There is no padding after the last
+ * extension header. First binary code header starts immediately
+ * after the last extension header (or immediately after the
+ * main header if there is no extension header) without any
+ * padding. There is no padding between binary code headers and
+ * neither after the last binary code header.
+ */
return sizeof(*hdr) +
- hdr->ext ? sizeof(struct ext_hdr_v0) : 0;
+ hdr->ext * sizeof(struct ext_hdr_v0) +
+ ((hdr->ext > 1) ? ((hdr->ext - 1) * 0x20) : 0) +
+ hdr->bin * sizeof(struct bin_hdr_v0);
} else {
const struct main_hdr_v1 *hdr = header;