From: Pali Rohár <p...@kernel.org> Some image types have source address in non-bytes unit; for example for SATA images, it is in 512 B units.
We need to multiply by unit size when patching image type to UART. Signed-off-by: Pali Rohár <p...@kernel.org> [ refactored ] Signed-off-by: Marek Behún <marek.be...@nic.cz> --- tools/kwboot.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/kwboot.c b/tools/kwboot.c index c23357f5bc..9cc7936959 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -756,6 +756,7 @@ kwboot_img_patch_hdr(void *img, size_t size) { int rc; struct main_hdr_v1 *hdr; + uint32_t srcaddr; uint8_t csum; size_t hdrsz = sizeof(*hdr); int image_ver; @@ -805,8 +806,6 @@ kwboot_img_patch_hdr(void *img, size_t size) kwboot_printv("Patching image boot signature to UART\n"); } - hdr->blockid = IBR_HDR_UART_ID; - if (image_ver == 0) { struct main_hdr_v0 *hdr_v0 = img; @@ -818,6 +817,29 @@ kwboot_img_patch_hdr(void *img, size_t size) : sizeof(*hdr_v0); } + srcaddr = le32_to_cpu(hdr->srcaddr); + + switch (hdr->blockid) { + case IBR_HDR_SATA_ID: + if (srcaddr < 1) { + errno = EINVAL; + goto out; + } + hdr->srcaddr = cpu_to_le32((srcaddr - 1) * 512); + break; + + case IBR_HDR_SDIO_ID: + hdr->srcaddr = cpu_to_le32(srcaddr * 512); + break; + + case IBR_HDR_PEX_ID: + if (hdr->srcaddr == 0xFFFFFFFF) + hdr->srcaddr = cpu_to_le32(hdrsz); + break; + } + + hdr->blockid = IBR_HDR_UART_ID; + hdr->checksum = kwboot_img_csum8(hdr, hdrsz) - csum; rc = 0; -- 2.31.1