[PATCH u-boot-marvell 07/11] tools: kwbimage: Do not put final image padding to the image data size
Stefan Roese
sr at denx.de
Wed Nov 10 09:28:32 CET 2021
On 08.11.21 18:12, Marek Behún wrote:
> From: Pali Rohár <pali at kernel.org>
>
> This change allows to convert image from one format to another without need
> to include unnecessary padding (e.g. when target image format has smaller
> alignment requirement as source image format).
>
> Do it by storing real image data size without padding to the kwbimage
> header.
>
> Signed-off-by: Pali Rohár <pali at kernel.org>
> Signed-off-by: Marek Behún <marek.behun at nic.cz>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
> ---
> tools/kwbimage.c | 30 +++++++++++++++++++++---------
> 1 file changed, 21 insertions(+), 9 deletions(-)
>
> diff --git a/tools/kwbimage.c b/tools/kwbimage.c
> index b939b4cb49..a6f2659ab4 100644
> --- a/tools/kwbimage.c
> +++ b/tools/kwbimage.c
> @@ -890,7 +890,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
>
> /* Fill in the main header */
> main_hdr->blocksize =
> - cpu_to_le32(payloadsz - headersz);
> + cpu_to_le32(payloadsz);
> main_hdr->srcaddr = cpu_to_le32(headersz);
> main_hdr->ext = has_ext;
> main_hdr->version = 0;
> @@ -1234,7 +1234,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
>
> /* Fill the main header */
> main_hdr->blocksize =
> - cpu_to_le32(payloadsz - headersz);
> + cpu_to_le32(payloadsz);
> main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
> main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
> main_hdr->destaddr = cpu_to_le32(params->addr);
> @@ -1345,7 +1345,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
> return NULL;
> }
>
> - if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz,
> + if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz + headersz,
> headersz, image, secure_hdr))
> return NULL;
>
> @@ -1575,9 +1575,22 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
> void *image = NULL;
> int version;
> size_t headersz = 0;
> + size_t datasz;
> uint32_t checksum;
> + struct stat s;
> int ret;
>
> + /*
> + * Do not use sbuf->st_size as it contains size with padding.
> + * We need original image data size, so stat original file.
> + */
> + if (stat(params->datafile, &s)) {
> + fprintf(stderr, "Could not stat data file %s: %s\n",
> + params->datafile, strerror(errno));
> + exit(EXIT_FAILURE);
> + }
> + datasz = ALIGN(s.st_size, 4);
> +
> fcfg = fopen(params->imagename, "r");
> if (!fcfg) {
> fprintf(stderr, "Could not open input file %s\n",
> @@ -1612,11 +1625,11 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
> */
> case -1:
> case 0:
> - image = image_create_v0(&headersz, params, sbuf->st_size);
> + image = image_create_v0(&headersz, params, datasz + 4);
> break;
>
> case 1:
> - image = image_create_v1(&headersz, params, ptr, sbuf->st_size);
> + image = image_create_v1(&headersz, params, ptr, datasz + 4);
> break;
>
> default:
> @@ -1633,11 +1646,10 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
>
> free(image_cfg);
>
> - /* Build and add image checksum header */
> + /* Build and add image data checksum */
> checksum = cpu_to_le32(image_checksum32((uint8_t *)ptr + headersz,
> - sbuf->st_size - headersz - sizeof(uint32_t)));
> - memcpy((uint8_t *)ptr + sbuf->st_size - sizeof(uint32_t), &checksum,
> - sizeof(uint32_t));
> + datasz));
> + memcpy((uint8_t *)ptr + headersz + datasz, &checksum, sizeof(uint32_t));
>
> /* Finally copy the header into the image area */
> memcpy(ptr, image, headersz);
>
Viele Grüße,
Stefan Roese
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list