spl: spl_legacy: fix the use of SPL_COPY_PAYLOAD_ONLY
authorWeijie Gao <weijie.gao@mediatek.com>
Fri, 20 May 2022 03:23:58 +0000 (11:23 +0800)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Wed, 13 Jul 2022 21:03:37 +0000 (23:03 +0200)
If the payload is compressed, SPL_COPY_PAYLOAD_ONLY should always be set
since the payload will not be directly read to its load address. The
payload will first be read to a temporary buffer, and then be decompressed
to its load address, without image header.

If the payload is not compressed, and SPL_COPY_PAYLOAD_ONLY is set, image
header should be skipped on loading. Otherwise image header should also be
read to its load address.

Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
common/spl/spl_legacy.c

index 2ec7154..ae8731c 100644 (file)
@@ -88,15 +88,29 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
        /* Read header into local struct */
        load->read(load, header, sizeof(hdr), &hdr);
 
+       /*
+        * If the payload is compressed, the decompressed data should be
+        * directly write to its load address.
+        */
+       if (spl_image_get_comp(&hdr) != IH_COMP_NONE)
+               spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
+
        ret = spl_parse_image_header(spl_image, bootdev, &hdr);
        if (ret)
                return ret;
 
-       dataptr = header + sizeof(hdr);
-
        /* Read image */
        switch (spl_image_get_comp(&hdr)) {
        case IH_COMP_NONE:
+               dataptr = header;
+
+               /*
+                * Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY
+                * is set
+                */
+               if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY)
+                       dataptr += sizeof(hdr);
+
                load->read(load, dataptr, spl_image->size,
                           (void *)(unsigned long)spl_image->load_addr);
                break;
@@ -104,6 +118,9 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
        case IH_COMP_LZMA:
                lzma_len = LZMA_LEN;
 
+               /* dataptr points to compressed payload  */
+               dataptr = header + sizeof(hdr);
+
                debug("LZMA: Decompressing %08lx to %08lx\n",
                      dataptr, spl_image->load_addr);
                src = malloc(spl_image->size);