]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
tools: kwbimage: Fix calculating size of kwbimage v0 header
authorPali Rohár <pali@kernel.org>
Thu, 17 Feb 2022 09:43:35 +0000 (10:43 +0100)
committerStefan Roese <sr@denx.de>
Thu, 17 Feb 2022 13:17:07 +0000 (14:17 +0100)
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>
tools/kwbimage.h

index 706bebddf4fa3e68615f4766289dbb07e60f3dce..502b6d5033050a98dd4a8664af5e2171fc0890fa 100644 (file)
@@ -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;