]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
tools: kwboot: Fix parsing UART image without data checksum
authorPali Rohár <pali@kernel.org>
Sun, 8 Jan 2023 12:38:27 +0000 (13:38 +0100)
committerStefan Roese <sr@denx.de>
Wed, 1 Mar 2023 05:39:17 +0000 (06:39 +0100)
The 32-bit data checksum in UART image is not checked by the BootROM and
also Marvell tools do not generate it.

So if data checksum stored in UART image does not match calculated checksum
from the image then treat those checksum bytes as part of the executable
image code (and not as the checksum) and for compatibility with the rest of
the code manually insert data checksum into the in-memory image after the
executable code, without overwriting it.

This should allow to boot UART images generated by Marvell tools.

Signed-off-by: Pali Rohár <pali@kernel.org>
tools/kwboot.c

index 7a7dd5bf3d7be1c1e31d99543c862f3377ca22b2..da840864b56577d08144a4d6913d383444051788 100644 (file)
@@ -1990,8 +1990,18 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
            *size < le32_to_cpu(hdr->srcaddr) + le32_to_cpu(hdr->blocksize))
                goto err;
 
-       if (kwboot_img_csum32(img) != *kwboot_img_csum32_ptr(img))
-               goto err;
+       /*
+        * The 32-bit data checksum is optional for UART image. If it is not
+        * present (checksum detected as invalid) then grow data part of the
+        * image for the checksum, so it can be inserted there.
+        */
+       if (kwboot_img_csum32(img) != *kwboot_img_csum32_ptr(img)) {
+               if (hdr->blockid != IBR_HDR_UART_ID) {
+                       fprintf(stderr, "Image has invalid data checksum\n");
+                       goto err;
+               }
+               kwboot_img_grow_data_right(img, size, sizeof(uint32_t));
+       }
 
        is_secure = kwboot_img_is_secure(img);
 
@@ -2256,6 +2266,7 @@ main(int argc, char **argv)
                                 KWBOOT_XM_BLKSZ +
                                 sizeof(kwboot_baud_code) +
                                 sizeof(kwboot_baud_code_data_jump) +
+                                sizeof(uint32_t) +
                                 KWBOOT_XM_BLKSZ;
 
        if (imgpath) {