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 <p...@kernel.org>
---
 tools/kwboot.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/tools/kwboot.c b/tools/kwboot.c
index c131711444ec..dd894e80db1c 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -2171,6 +2171,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;
-- 
2.20.1

Reply via email to