spl: spl_legacy: fix the use of SPL_COPY_PAYLOAD_ONLY
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>
This commit is contained in:
committed by
Daniel Schwierzeck
parent
4c4bf046a5
commit
fdc03bf4e9
@@ -88,15 +88,29 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
|
|||||||
/* Read header into local struct */
|
/* Read header into local struct */
|
||||||
load->read(load, header, sizeof(hdr), &hdr);
|
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);
|
ret = spl_parse_image_header(spl_image, bootdev, &hdr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
dataptr = header + sizeof(hdr);
|
|
||||||
|
|
||||||
/* Read image */
|
/* Read image */
|
||||||
switch (spl_image_get_comp(&hdr)) {
|
switch (spl_image_get_comp(&hdr)) {
|
||||||
case IH_COMP_NONE:
|
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,
|
load->read(load, dataptr, spl_image->size,
|
||||||
(void *)(unsigned long)spl_image->load_addr);
|
(void *)(unsigned long)spl_image->load_addr);
|
||||||
break;
|
break;
|
||||||
@@ -104,6 +118,9 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
|
|||||||
case IH_COMP_LZMA:
|
case IH_COMP_LZMA:
|
||||||
lzma_len = LZMA_LEN;
|
lzma_len = LZMA_LEN;
|
||||||
|
|
||||||
|
/* dataptr points to compressed payload */
|
||||||
|
dataptr = header + sizeof(hdr);
|
||||||
|
|
||||||
debug("LZMA: Decompressing %08lx to %08lx\n",
|
debug("LZMA: Decompressing %08lx to %08lx\n",
|
||||||
dataptr, spl_image->load_addr);
|
dataptr, spl_image->load_addr);
|
||||||
src = malloc(spl_image->size);
|
src = malloc(spl_image->size);
|
||||||
|
|||||||
Reference in New Issue
Block a user