Blame view

tools/mkimage.c 14.7 KB
5b1d71372   wdenk   Initial revision
1
  /*
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
2
3
   * (C) Copyright 2008 Semihalf
   *
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
4
   * (C) Copyright 2000-2009
5b1d71372   wdenk   Initial revision
5
6
   * DENX Software Engineering
   * Wolfgang Denk, wd@denx.de
0c852a288   wdenk   * Patch by Rahul ...
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
   * published by the Free Software Foundation; either version 2 of
   * the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
   * MA 02111-1307 USA
5b1d71372   wdenk   Initial revision
22
   */
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
23
  #include "mkimage.h"
5b1d71372   wdenk   Initial revision
24
  #include <image.h>
976b38c07   Wolfgang Denk   mkimage: add "-V"...
25
  #include <version.h>
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  
  static void copy_file(int, const char *, int);
  static void usage(void);
  
  /* image_type_params link list to maintain registered image type supports */
  struct image_type_params *mkimage_tparams = NULL;
  
  /* parameters initialized by core will be used by the image type code */
  struct mkimage_params params = {
  	.os = IH_OS_LINUX,
  	.arch = IH_ARCH_PPC,
  	.type = IH_TYPE_KERNEL,
  	.comp = IH_COMP_GZIP,
  	.dtc = MKIMAGE_DEFAULT_DTC_OPTIONS,
04387d24a   Wolfgang Denk   mkimage: fix Segm...
40
  	.imagename = "",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  };
  
  /*
   * mkimage_register -
   *
   * It is used to register respective image generation/list support to the
   * mkimage core
   *
   * the input struct image_type_params is checked and appended to the link
   * list, if the input structure is already registered, error
   */
  void mkimage_register (struct image_type_params *tparams)
  {
  	struct image_type_params **tp;
  
  	if (!tparams) {
  		fprintf (stderr, "%s: %s: Null input
  ",
  			params.cmdname, __FUNCTION__);
  		exit (EXIT_FAILURE);
  	}
  
  	/* scan the linked list, check for registry and point the last one */
  	for (tp = &mkimage_tparams; *tp != NULL; tp = &(*tp)->next) {
  		if (!strcmp((*tp)->name, tparams->name)) {
  			fprintf (stderr, "%s: %s already registered
  ",
  				params.cmdname, tparams->name);
  			return;
  		}
  	}
  
  	/* add input struct entry at the end of link list */
  	*tp = tparams;
  	/* mark input entry as last entry in the link list */
  	tparams->next = NULL;
  
  	debug ("Registered %s
  ", tparams->name);
  }
  
  /*
   * mkimage_get_type -
   *
   * It scans all registers image type supports
   * checks the input type_id for each supported image type
   *
   * if successful,
   * 	returns respective image_type_params pointer if success
   * if input type_id is not supported by any of image_type_support
   * 	returns NULL
   */
  struct image_type_params *mkimage_get_type(int type)
  {
  	struct image_type_params *curr;
  
  	for (curr = mkimage_tparams; curr != NULL; curr = curr->next) {
  		if (curr->check_image_type) {
  			if (!curr->check_image_type (type))
  				return curr;
  		}
  	}
  	return NULL;
  }
  
  /*
   * mkimage_verify_print_header -
   *
   * It scans mkimage_tparams link list,
   * verifies image_header for each supported image type
   * if verification is successful, prints respective header
   *
   * returns negative if input image format does not match with any of
   * supported image types
   */
  int mkimage_verify_print_header (void *ptr, struct stat *sbuf)
  {
  	int retval = -1;
  	struct image_type_params *curr;
  
  	for (curr = mkimage_tparams; curr != NULL; curr = curr->next ) {
  		if (curr->verify_header) {
  			retval = curr->verify_header (
  				(unsigned char *)ptr, sbuf->st_size,
  				&params);
  
  			if (retval == 0) {
  				/*
  				 * Print the image information
  				 * if verify is successful
  				 */
  				if (curr->print_header)
  					curr->print_header (ptr);
  				else {
  					fprintf (stderr,
  					"%s: print_header undefined for %s
  ",
  					params.cmdname, curr->name);
  				}
  				break;
  			}
  		}
  	}
  	return retval;
  }
5b1d71372   wdenk   Initial revision
146
147
148
149
  
  int
  main (int argc, char **argv)
  {
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
150
  	int ifd = -1;
5b1d71372   wdenk   Initial revision
151
  	struct stat sbuf;
a2513e27e   Peter Tyser   mkimage: Fix stri...
152
  	char *ptr;
449609f5b   Prafulla Wadaskar   tools: mkimage: F...
153
  	int retval = 0;
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
154
  	struct image_type_params *tparams = NULL;
5b1d71372   wdenk   Initial revision
155

aa0c7a86c   Prafulla Wadaskar   mkimage: Add Kirk...
156
157
  	/* Init Kirkwood Boot image generation/list support */
  	init_kwb_image_type ();
8edcde5e4   Stefano Babic   mkimage: Add Free...
158
159
  	/* Init Freescale imx Boot image generation/list support */
  	init_imx_image_type ();
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
160
161
  	/* Init FIT image generation/list support */
  	init_fit_image_type ();
3decb14ab   John Rigby   mkimage: Add OMAP...
162
163
  	/* Init TI OMAP Boot image generation/list support */
  	init_omap_image_type();
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
164
165
  	/* Init Default image generation/list support */
  	init_default_image_type ();
7816f2cf8   Heiko Schocher   mkimage: add UBL ...
166
167
  	/* Init Davinci UBL support */
  	init_ubl_image_type();
4962e38e9   Stefano Babic   mkimage: adding s...
168
169
  	/* Init Davinci AIS support */
  	init_ais_image_type();
5b1d71372   wdenk   Initial revision
170

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
171
172
  	params.cmdname = *argv;
  	params.addr = params.ep = 0;
5b1d71372   wdenk   Initial revision
173
174
175
176
177
  
  	while (--argc > 0 && **++argv == '-') {
  		while (*++*argv) {
  			switch (**argv) {
  			case 'l':
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
178
  				params.lflag = 1;
5b1d71372   wdenk   Initial revision
179
180
181
  				break;
  			case 'A':
  				if ((--argc <= 0) ||
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
182
183
  					(params.arch =
  					genimg_get_arch_id (*++argv)) < 0)
5b1d71372   wdenk   Initial revision
184
185
186
187
  					usage ();
  				goto NXTARG;
  			case 'C':
  				if ((--argc <= 0) ||
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
188
189
  					(params.comp =
  					genimg_get_comp_id (*++argv)) < 0)
5b1d71372   wdenk   Initial revision
190
191
  					usage ();
  				goto NXTARG;
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
192
193
194
  			case 'D':
  				if (--argc <= 0)
  					usage ();
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
195
  				params.dtc = *++argv;
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
196
  				goto NXTARG;
5b1d71372   wdenk   Initial revision
197
198
  			case 'O':
  				if ((--argc <= 0) ||
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
199
200
  					(params.os =
  					genimg_get_os_id (*++argv)) < 0)
5b1d71372   wdenk   Initial revision
201
202
203
204
  					usage ();
  				goto NXTARG;
  			case 'T':
  				if ((--argc <= 0) ||
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
205
206
  					(params.type =
  					genimg_get_type_id (*++argv)) < 0)
5b1d71372   wdenk   Initial revision
207
208
209
210
211
212
  					usage ();
  				goto NXTARG;
  
  			case 'a':
  				if (--argc <= 0)
  					usage ();
a2513e27e   Peter Tyser   mkimage: Fix stri...
213
  				params.addr = strtoul (*++argv, &ptr, 16);
5b1d71372   wdenk   Initial revision
214
215
216
217
  				if (*ptr) {
  					fprintf (stderr,
  						"%s: invalid load address %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
218
  						params.cmdname, *argv);
5b1d71372   wdenk   Initial revision
219
220
221
222
223
224
  					exit (EXIT_FAILURE);
  				}
  				goto NXTARG;
  			case 'd':
  				if (--argc <= 0)
  					usage ();
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
225
226
  				params.datafile = *++argv;
  				params.dflag = 1;
5b1d71372   wdenk   Initial revision
227
228
229
230
  				goto NXTARG;
  			case 'e':
  				if (--argc <= 0)
  					usage ();
a2513e27e   Peter Tyser   mkimage: Fix stri...
231
  				params.ep = strtoul (*++argv, &ptr, 16);
5b1d71372   wdenk   Initial revision
232
233
234
235
  				if (*ptr) {
  					fprintf (stderr,
  						"%s: invalid entry point %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
236
  						params.cmdname, *argv);
5b1d71372   wdenk   Initial revision
237
238
  					exit (EXIT_FAILURE);
  				}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
239
  				params.eflag = 1;
5b1d71372   wdenk   Initial revision
240
  				goto NXTARG;
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
241
242
243
  			case 'f':
  				if (--argc <= 0)
  					usage ();
1a99de2cb   Peter Tyser   tools/mkimage: As...
244
245
246
247
248
  				/*
  				 * The flattened image tree (FIT) format
  				 * requires a flattened device tree image type
  				 */
  				params.type = IH_TYPE_FLATDT;
fbc1c8f6f   Peter Tyser   tools/mkimage: Re...
249
250
  				params.datafile = *++argv;
  				params.fflag = 1;
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
251
  				goto NXTARG;
5b1d71372   wdenk   Initial revision
252
253
254
  			case 'n':
  				if (--argc <= 0)
  					usage ();
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
255
  				params.imagename = *++argv;
5b1d71372   wdenk   Initial revision
256
  				goto NXTARG;
f0662105b   Stefano Babic   mkimage: Add vari...
257
258
259
  			case 's':
  				params.skipcpy = 1;
  				break;
5b1d71372   wdenk   Initial revision
260
  			case 'v':
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
261
  				params.vflag++;
5b1d71372   wdenk   Initial revision
262
  				break;
976b38c07   Wolfgang Denk   mkimage: add "-V"...
263
264
265
266
  			case 'V':
  				printf("mkimage version %s
  ", PLAIN_VERSION);
  				exit(EXIT_SUCCESS);
5b1d71372   wdenk   Initial revision
267
  			case 'x':
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
268
  				params.xflag++;
5b1d71372   wdenk   Initial revision
269
270
271
272
273
274
275
  				break;
  			default:
  				usage ();
  			}
  		}
  NXTARG:		;
  	}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
276
277
278
279
280
281
282
283
284
285
286
  	if (argc != 1)
  		usage ();
  
  	/* set tparams as per input type_id */
  	tparams = mkimage_get_type(params.type);
  	if (tparams == NULL) {
  		fprintf (stderr, "%s: unsupported type %s
  ",
  			params.cmdname, genimg_get_type_name(params.type));
  		exit (EXIT_FAILURE);
  	}
5b1d71372   wdenk   Initial revision
287

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
288
289
290
291
292
293
294
295
296
297
  	/*
  	 * check the passed arguments parameters meets the requirements
  	 * as per image type to be generated/listed
  	 */
  	if (tparams->check_params)
  		if (tparams->check_params (&params))
  			usage ();
  
  	if (!params.eflag) {
  		params.ep = params.addr;
5b1d71372   wdenk   Initial revision
298
  		/* If XIP, entry point must be after the U-Boot header */
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
299
300
  		if (params.xflag)
  			params.ep += tparams->header_size;
5b1d71372   wdenk   Initial revision
301
  	}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
302
  	params.imagefile = *argv;
5b1d71372   wdenk   Initial revision
303

c81296c16   Peter Tyser   tools/mkimage: Pr...
304
305
306
307
308
309
310
311
312
  	if (params.fflag){
  		if (tparams->fflag_handle)
  			/*
  			 * in some cases, some additional processing needs
  			 * to be done if fflag is defined
  			 *
  			 * For ex. fit_handle_file for Fit file support
  			 */
  			retval = tparams->fflag_handle(&params);
5b1d71372   wdenk   Initial revision
313

c81296c16   Peter Tyser   tools/mkimage: Pr...
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
  		if (retval != EXIT_SUCCESS)
  			exit (retval);
  	}
  
  	if (params.lflag || params.fflag) {
  		ifd = open (params.imagefile, O_RDONLY|O_BINARY);
  	} else {
  		ifd = open (params.imagefile,
  			O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0666);
  	}
  
  	if (ifd < 0) {
  		fprintf (stderr, "%s: Can't open %s: %s
  ",
  			params.cmdname, params.imagefile,
  			strerror(errno));
  		exit (EXIT_FAILURE);
5b1d71372   wdenk   Initial revision
331
  	}
c81296c16   Peter Tyser   tools/mkimage: Pr...
332
  	if (params.lflag || params.fflag) {
5b1d71372   wdenk   Initial revision
333
334
335
336
337
338
  		/*
  		 * list header information of existing image
  		 */
  		if (fstat(ifd, &sbuf) < 0) {
  			fprintf (stderr, "%s: Can't stat %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
339
340
  				params.cmdname, params.imagefile,
  				strerror(errno));
5b1d71372   wdenk   Initial revision
341
342
  			exit (EXIT_FAILURE);
  		}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
343
  		if ((unsigned)sbuf.st_size < tparams->header_size) {
5b1d71372   wdenk   Initial revision
344
  			fprintf (stderr,
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
345
346
347
  				"%s: Bad size: \"%s\" is not valid image
  ",
  				params.cmdname, params.imagefile);
5b1d71372   wdenk   Initial revision
348
349
  			exit (EXIT_FAILURE);
  		}
fa956fde6   Mike Frysinger   mkimage: make mma...
350
351
  		ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, ifd, 0);
  		if (ptr == MAP_FAILED) {
5b1d71372   wdenk   Initial revision
352
353
  			fprintf (stderr, "%s: Can't read %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
354
355
  				params.cmdname, params.imagefile,
  				strerror(errno));
5b1d71372   wdenk   Initial revision
356
357
  			exit (EXIT_FAILURE);
  		}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
358
359
360
361
362
363
364
  		/*
  		 * scan through mkimage registry for all supported image types
  		 * and verify the input image file header for match
  		 * Print the image information for matched image type
  		 * Returns the error code if not matched
  		 */
  		retval = mkimage_verify_print_header (ptr, &sbuf);
5b1d71372   wdenk   Initial revision
365

5b1d71372   wdenk   Initial revision
366
367
  		(void) munmap((void *)ptr, sbuf.st_size);
  		(void) close (ifd);
f7644c0bf   Prafulla Wadaskar   tools: mkimage : ...
368
  		exit (retval);
5b1d71372   wdenk   Initial revision
369
370
371
  	}
  
  	/*
f0662105b   Stefano Babic   mkimage: Add vari...
372
373
374
375
  	 * In case there an header with a variable
  	 * length will be added, the corresponding
  	 * function is called. This is responsible to
  	 * allocate memory for the header itself.
5b1d71372   wdenk   Initial revision
376
  	 */
f0662105b   Stefano Babic   mkimage: Add vari...
377
378
379
380
  	if (tparams->vrec_header)
  		tparams->vrec_header(&params, tparams);
  	else
  		memset(tparams->hdr, 0, tparams->header_size);
5b1d71372   wdenk   Initial revision
381

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
382
383
  	if (write(ifd, tparams->hdr, tparams->header_size)
  					!= tparams->header_size) {
5b1d71372   wdenk   Initial revision
384
385
  		fprintf (stderr, "%s: Write error on %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
386
  			params.cmdname, params.imagefile, strerror(errno));
5b1d71372   wdenk   Initial revision
387
388
  		exit (EXIT_FAILURE);
  	}
d1be8f922   Christian Riesch   mkimage: Fix vari...
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
  	if (!params.skipcpy) {
  		if (params.type == IH_TYPE_MULTI ||
  		    params.type == IH_TYPE_SCRIPT) {
  			char *file = params.datafile;
  			uint32_t size;
  
  			for (;;) {
  				char *sep = NULL;
  
  				if (file) {
  					if ((sep = strchr(file, ':')) != NULL) {
  						*sep = '\0';
  					}
  
  					if (stat (file, &sbuf) < 0) {
  						fprintf (stderr, "%s: Can't stat %s: %s
  ",
  							 params.cmdname, file, strerror(errno));
  						exit (EXIT_FAILURE);
  					}
  					size = cpu_to_uimage (sbuf.st_size);
  				} else {
  					size = 0;
5b1d71372   wdenk   Initial revision
412
  				}
d1be8f922   Christian Riesch   mkimage: Fix vari...
413
414
415
416
417
  				if (write(ifd, (char *)&size, sizeof(size)) != sizeof(size)) {
  					fprintf (stderr, "%s: Write error on %s: %s
  ",
  						 params.cmdname, params.imagefile,
  						 strerror(errno));
5b1d71372   wdenk   Initial revision
418
419
  					exit (EXIT_FAILURE);
  				}
5b1d71372   wdenk   Initial revision
420

d1be8f922   Christian Riesch   mkimage: Fix vari...
421
422
423
  				if (!file) {
  					break;
  				}
5b1d71372   wdenk   Initial revision
424

d1be8f922   Christian Riesch   mkimage: Fix vari...
425
426
427
428
429
430
  				if (sep) {
  					*sep = ':';
  					file = sep + 1;
  				} else {
  					file = NULL;
  				}
5b1d71372   wdenk   Initial revision
431
  			}
d1be8f922   Christian Riesch   mkimage: Fix vari...
432
  			file = params.datafile;
5b1d71372   wdenk   Initial revision
433

d1be8f922   Christian Riesch   mkimage: Fix vari...
434
435
436
437
438
439
440
441
442
443
444
  			for (;;) {
  				char *sep = strchr(file, ':');
  				if (sep) {
  					*sep = '\0';
  					copy_file (ifd, file, 1);
  					*sep++ = ':';
  					file = sep;
  				} else {
  					copy_file (ifd, file, 0);
  					break;
  				}
5b1d71372   wdenk   Initial revision
445
  			}
d1be8f922   Christian Riesch   mkimage: Fix vari...
446
447
  		} else {
  			copy_file (ifd, params.datafile, 0);
5b1d71372   wdenk   Initial revision
448
  		}
5b1d71372   wdenk   Initial revision
449
450
451
  	}
  
  	/* We're a bit of paranoid */
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
452
453
454
455
  #if defined(_POSIX_SYNCHRONIZED_IO) && \
     !defined(__sun__) && \
     !defined(__FreeBSD__) && \
     !defined(__APPLE__)
5b1d71372   wdenk   Initial revision
456
457
458
459
460
461
462
463
  	(void) fdatasync (ifd);
  #else
  	(void) fsync (ifd);
  #endif
  
  	if (fstat(ifd, &sbuf) < 0) {
  		fprintf (stderr, "%s: Can't stat %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
464
  			params.cmdname, params.imagefile, strerror(errno));
5b1d71372   wdenk   Initial revision
465
466
  		exit (EXIT_FAILURE);
  	}
fa956fde6   Mike Frysinger   mkimage: make mma...
467
468
  	ptr = mmap(0, sbuf.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, ifd, 0);
  	if (ptr == MAP_FAILED) {
5b1d71372   wdenk   Initial revision
469
470
  		fprintf (stderr, "%s: Can't map %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
471
  			params.cmdname, params.imagefile, strerror(errno));
5b1d71372   wdenk   Initial revision
472
473
  		exit (EXIT_FAILURE);
  	}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
474
475
476
477
478
479
480
481
482
  	/* Setup the image header as per input image type*/
  	if (tparams->set_header)
  		tparams->set_header (ptr, &sbuf, ifd, &params);
  	else {
  		fprintf (stderr, "%s: Can't set header for %s: %s
  ",
  			params.cmdname, tparams->name, strerror(errno));
  		exit (EXIT_FAILURE);
  	}
5b1d71372   wdenk   Initial revision
483

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
484
485
486
487
488
489
490
491
492
  	/* Print the image information by processing image header */
  	if (tparams->print_header)
  		tparams->print_header (ptr);
  	else {
  		fprintf (stderr, "%s: Can't print header for %s: %s
  ",
  			params.cmdname, tparams->name, strerror(errno));
  		exit (EXIT_FAILURE);
  	}
5b1d71372   wdenk   Initial revision
493
494
495
496
  
  	(void) munmap((void *)ptr, sbuf.st_size);
  
  	/* We're a bit of paranoid */
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
497
498
499
500
  #if defined(_POSIX_SYNCHRONIZED_IO) && \
     !defined(__sun__) && \
     !defined(__FreeBSD__) && \
     !defined(__APPLE__)
5b1d71372   wdenk   Initial revision
501
502
503
504
505
506
507
508
  	(void) fdatasync (ifd);
  #else
  	(void) fsync (ifd);
  #endif
  
  	if (close(ifd)) {
  		fprintf (stderr, "%s: Write error on %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
509
  			params.cmdname, params.imagefile, strerror(errno));
5b1d71372   wdenk   Initial revision
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
  		exit (EXIT_FAILURE);
  	}
  
  	exit (EXIT_SUCCESS);
  }
  
  static void
  copy_file (int ifd, const char *datafile, int pad)
  {
  	int dfd;
  	struct stat sbuf;
  	unsigned char *ptr;
  	int tail;
  	int zero = 0;
  	int offset = 0;
  	int size;
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
526
  	struct image_type_params *tparams = mkimage_get_type (params.type);
5b1d71372   wdenk   Initial revision
527

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
528
  	if (params.vflag) {
5b1d71372   wdenk   Initial revision
529
530
531
  		fprintf (stderr, "Adding Image %s
  ", datafile);
  	}
ef1464cc0   wdenk   * Patch by Anders...
532
  	if ((dfd = open(datafile, O_RDONLY|O_BINARY)) < 0) {
5b1d71372   wdenk   Initial revision
533
534
  		fprintf (stderr, "%s: Can't open %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
535
  			params.cmdname, datafile, strerror(errno));
5b1d71372   wdenk   Initial revision
536
537
538
539
540
541
  		exit (EXIT_FAILURE);
  	}
  
  	if (fstat(dfd, &sbuf) < 0) {
  		fprintf (stderr, "%s: Can't stat %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
542
  			params.cmdname, datafile, strerror(errno));
5b1d71372   wdenk   Initial revision
543
544
  		exit (EXIT_FAILURE);
  	}
fa956fde6   Mike Frysinger   mkimage: make mma...
545
546
  	ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, dfd, 0);
  	if (ptr == MAP_FAILED) {
5b1d71372   wdenk   Initial revision
547
548
  		fprintf (stderr, "%s: Can't read %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
549
  			params.cmdname, datafile, strerror(errno));
5b1d71372   wdenk   Initial revision
550
551
  		exit (EXIT_FAILURE);
  	}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
552
  	if (params.xflag) {
5b1d71372   wdenk   Initial revision
553
554
555
556
557
558
  		unsigned char *p = NULL;
  		/*
  		 * XIP: do not append the image_header_t at the
  		 * beginning of the file, but consume the space
  		 * reserved for it.
  		 */
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
559
  		if ((unsigned)sbuf.st_size < tparams->header_size) {
5b1d71372   wdenk   Initial revision
560
561
562
  			fprintf (stderr,
  				"%s: Bad size: \"%s\" is too small for XIP
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
563
  				params.cmdname, datafile);
5b1d71372   wdenk   Initial revision
564
565
  			exit (EXIT_FAILURE);
  		}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
566
  		for (p = ptr; p < ptr + tparams->header_size; p++) {
5b1d71372   wdenk   Initial revision
567
568
569
570
  			if ( *p != 0xff ) {
  				fprintf (stderr,
  					"%s: Bad file: \"%s\" has invalid buffer for XIP
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
571
  					params.cmdname, datafile);
5b1d71372   wdenk   Initial revision
572
573
574
  				exit (EXIT_FAILURE);
  			}
  		}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
575
  		offset = tparams->header_size;
5b1d71372   wdenk   Initial revision
576
577
578
579
580
581
  	}
  
  	size = sbuf.st_size - offset;
  	if (write(ifd, ptr + offset, size) != size) {
  		fprintf (stderr, "%s: Write error on %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
582
  			params.cmdname, params.imagefile, strerror(errno));
5b1d71372   wdenk   Initial revision
583
584
585
586
587
588
589
590
  		exit (EXIT_FAILURE);
  	}
  
  	if (pad && ((tail = size % 4) != 0)) {
  
  		if (write(ifd, (char *)&zero, 4-tail) != 4-tail) {
  			fprintf (stderr, "%s: Write error on %s: %s
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
591
592
  				params.cmdname, params.imagefile,
  				strerror(errno));
5b1d71372   wdenk   Initial revision
593
594
595
596
597
598
599
600
601
602
603
604
605
  			exit (EXIT_FAILURE);
  		}
  	}
  
  	(void) munmap((void *)ptr, sbuf.st_size);
  	(void) close (dfd);
  }
  
  void
  usage ()
  {
  	fprintf (stderr, "Usage: %s -l image
  "
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
606
607
  			 "          -l ==> list image header information
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
608
  		params.cmdname);
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
609
610
611
612
613
  	fprintf (stderr, "       %s [-x] -A arch -O os -T type -C comp "
  			 "-a addr -e ep -n name -d data_file[:data_file...] image
  "
  			 "          -A ==> set architecture to 'arch'
  "
5b1d71372   wdenk   Initial revision
614
615
616
617
618
619
620
621
622
623
624
625
626
627
  			 "          -O ==> set operating system to 'os'
  "
  			 "          -T ==> set image type to 'type'
  "
  			 "          -C ==> set compression type 'comp'
  "
  			 "          -a ==> set load address to 'addr' (hex)
  "
  			 "          -e ==> set entry point to 'ep' (hex)
  "
  			 "          -n ==> set image name to 'name'
  "
  			 "          -d ==> use image data from 'datafile'
  "
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
628
629
  			 "          -x ==> set XIP (execute in place)
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
630
  		params.cmdname);
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
631
632
  	fprintf (stderr, "       %s [-D dtc_options] -f fit-image.its fit-image
  ",
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
633
  		params.cmdname);
976b38c07   Wolfgang Denk   mkimage: add "-V"...
634
635
636
  	fprintf (stderr, "       %s -V ==> print version information and exit
  ",
  		params.cmdname);
9d25438fe   Bartlomiej Sieka   [new uImage] Add ...
637

5b1d71372   wdenk   Initial revision
638
639
  	exit (EXIT_FAILURE);
  }