Patchwork [U-Boot,v1,4/7] tools: add variable padding of data image in mkimage

login
register
mail settings
Submitter Stefano Babic
Date July 11, 2013, 1:06 p.m.
Message ID <1373548001-19728-5-git-send-email-sbabic@denx.de>
Download mbox | patch
Permalink /patch/258450/
State Superseded
Headers show

Comments

Stefano Babic - July 11, 2013, 1:06 p.m.
Use previously unused return value of function vrec_header
to return a padding size to generic mkimage. This padding
size is used in copy_files to pad with zeros after copying
the data image.

Signed-off-by: Stefano Babic <sbabic@denx.de>
---
 tools/mkimage.c |   24 +++++++++++++++++++++---
 tools/mkimage.h |    5 ++++-
 2 files changed, 25 insertions(+), 4 deletions(-)

Patch

diff --git a/tools/mkimage.c b/tools/mkimage.c
index d312844..d2f24e4 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -150,6 +150,7 @@  main (int argc, char **argv)
 	char *ptr;
 	int retval = 0;
 	struct image_type_params *tparams = NULL;
+	int pad_len = 0;
 
 	/* Init Freescale PBL Boot image generation/list support */
 	init_pbl_image_type();
@@ -404,7 +405,7 @@  NXTARG:		;
 	 * allocate memory for the header itself.
 	 */
 	if (tparams->vrec_header)
-		tparams->vrec_header(&params, tparams);
+		pad_len = tparams->vrec_header(&params, tparams);
 	else
 		memset(tparams->hdr, 0, tparams->header_size);
 
@@ -476,7 +477,7 @@  NXTARG:		;
 			/* PBL has special Image format, implements its' own */
 			pbl_load_uboot(ifd, &params);
 		} else {
-			copy_file (ifd, params.datafile, 0);
+			copy_file(ifd, params.datafile, pad_len);
 		}
 	}
 
@@ -550,10 +551,19 @@  copy_file (int ifd, const char *datafile, int pad)
 	unsigned char *ptr;
 	int tail;
 	int zero = 0;
+	uint8_t zeros[4096];
 	int offset = 0;
 	int size;
 	struct image_type_params *tparams = mkimage_get_type (params.type);
 
+	if (pad >= sizeof(zeros)) {
+		fprintf(stderr, "%s: Can't pad to %d\n",
+			params.cmdname, pad);
+		exit(EXIT_FAILURE);
+	}
+
+	memset(zeros, 0, sizeof(zeros));
+
 	if (params.vflag) {
 		fprintf (stderr, "Adding Image %s\n", datafile);
 	}
@@ -611,7 +621,8 @@  copy_file (int ifd, const char *datafile, int pad)
 		exit (EXIT_FAILURE);
 	}
 
-	if (pad && ((tail = size % 4) != 0)) {
+	tail = size % 4;
+	if ((pad == 1) && (tail != 0)) {
 
 		if (write(ifd, (char *)&zero, 4-tail) != 4-tail) {
 			fprintf (stderr, "%s: Write error on %s: %s\n",
@@ -619,6 +630,13 @@  copy_file (int ifd, const char *datafile, int pad)
 				strerror(errno));
 			exit (EXIT_FAILURE);
 		}
+	} else if (pad > 1) {
+		if (write(ifd, (char *)&zeros, pad) != pad) {
+			fprintf(stderr, "%s: Write error on %s: %s\n",
+				params.cmdname, params.imagefile,
+				strerror(errno));
+			exit(EXIT_FAILURE);
+		}
 	}
 
 	(void) munmap((void *)ptr, sbuf.st_size);
diff --git a/tools/mkimage.h b/tools/mkimage.h
index 1d9984e..5b63ebf 100644
--- a/tools/mkimage.h
+++ b/tools/mkimage.h
@@ -145,7 +145,10 @@  struct image_type_params {
 	/*
 	 * This callback function will be executed for variable size record
 	 * It is expected to build this header in memory and return its length
-	 * and a pointer to it
+	 * and a pointer to it by using image_type_params.header_size and
+	 * image_type_params.hdr. The return value shall indicate if an
+	 * additional padding should be used when copying the data image
+	 * by returning the padding length.
 	 */
 	int (*vrec_header) (struct mkimage_params *,
 		struct image_type_params *);