summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Babic <sbabic@denx.de>2013-08-19 19:03:19 +0200
committerStefano Babic <sbabic@denx.de>2013-08-31 15:06:29 +0200
commit9bac0bb37402ca72fd905f3e591080b4cfb98c42 (patch)
treea5a70267410495940ea38484c42472ffbbcd7f95
parent377e367a8558c5327c925387ecf1f0a4ee7ca177 (diff)
tools: add variable padding of data image in mkimage
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>
-rw-r--r--tools/mkimage.c24
-rw-r--r--tools/mkimage.h5
2 files changed, 25 insertions, 4 deletions
diff --git a/tools/mkimage.c b/tools/mkimage.c
index b700b9e8c0..58d25faed4 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -137,6 +137,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();
@@ -391,7 +392,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);
@@ -463,7 +464,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);
}
}
@@ -537,10 +538,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);
}
@@ -598,7 +608,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",
@@ -606,6 +617,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 950e19067f..ecb3032282 100644
--- a/tools/mkimage.h
+++ b/tools/mkimage.h
@@ -132,7 +132,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 *);