tools: kwboot: Fix invalid UART kwbimage v1 headersz
authorPali Rohár <pali@kernel.org>
Thu, 23 Mar 2023 19:57:52 +0000 (20:57 +0100)
committerStefan Roese <sr@denx.de>
Fri, 24 Mar 2023 12:13:35 +0000 (13:13 +0100)
Ensure that UART aligned header size is always stored into kwbimage v1
header. It is needed for proper UART booting. Calculation of headersz field
was broken in commit d656f5a0ee22 ("tools: kwboot: Calculate real used
space in kwbimage header when calling kwboot_img_grow_hdr()") which
introduced optimization of kwboot_img_grow_hdr() function.

Fixes: d656f5a0ee22 ("tools: kwboot: Calculate real used space in kwbimage header when calling kwboot_img_grow_hdr()")
Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
tools/kwboot.c

index 7c66648..ef108c8 100644 (file)
@@ -2168,6 +2168,17 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
 
                kwboot_printv("Aligning image header to Xmodem block size\n");
                kwboot_img_grow_hdr(img, size, grow);
+               hdrsz += grow;
+
+               /*
+                * kwbimage v1 contains header size field and for UART type it
+                * must be set to the aligned xmodem header size because BootROM
+                * rounds header size down to xmodem block size.
+                */
+               if (kwbimage_version(img) == 1) {
+                       hdr->headersz_msb = hdrsz >> 16;
+                       hdr->headersz_lsb = cpu_to_le16(hdrsz & 0xffff);
+               }
        }
 
        hdr->checksum = kwboot_hdr_csum8(hdr) - csum;