On Wed, 25 Aug 2021 15:46:30 +0200 Marek Behún <marek.be...@nic.cz> wrote:
> @@ -765,6 +1187,37 @@ kwboot_img_is_secure(void *img) > return 0; > } > > +static void * > +kwboot_img_grow_data_left(void *img, size_t *size, size_t grow) > +{ > + uint32_t hdrsz, datasz, srcaddr; > + struct main_hdr_v1 *hdr = img; > + uint8_t *data; > + > + srcaddr = le32_to_cpu(hdr->srcaddr); > + > + hdrsz = kwbheader_size(hdr); > + data = (uint8_t *)img + srcaddr; > + datasz = *size - srcaddr; > + > + /* only move data if there is not enough space */ > + if (hdrsz + grow > srcaddr) { > + size_t need = hdrsz + grow - srcaddr; > + > + /* move data by enough bytes */ > + memmove(data + need, data, datasz); > + *size += need; > + srcaddr += need; > + } > + > + srcaddr -= grow; > + hdr->srcaddr = cpu_to_le32(srcaddr); > + hdr->destaddr = cpu_to_le32(le32_to_cpu(hdr->destaddr) - grow); > + hdr->execaddr = cpu_to_le32(le32_to_cpu(hdr->execaddr) - grow); Sorry, we need to do one more thing here: hdr->blocksize = cpu_to_le32(le32_to_cpu(hdr->blocksize) + grow); I will fix this in v2, unless Stefan is willing to fix this himself. Marek