
From: Pali Rohár pali@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 pali@kernel.org [ refactored ] Signed-off-by: Marek Behún marek.behun@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;