diff options
| author | Wolfgang Denk <wd@denx.de> | 2008-03-26 10:41:48 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-03-26 10:41:48 +0100 | 
| commit | b951f8d31711f3f10ad119ddcf5a3d0afe14d561 (patch) | |
| tree | 950ca2e675ec92ea7b5610a3a2ea2b739f0aaab5 /tools/mkimage.c | |
| parent | 218ca724c08ca8a649f0917cf201cf23d4b33f39 (diff) | |
| parent | 27f33e9f45ef7f9685cbdc65066a1828e85dde4f (diff) | |
| download | olio-uboot-2014.01-b951f8d31711f3f10ad119ddcf5a3d0afe14d561.tar.xz olio-uboot-2014.01-b951f8d31711f3f10ad119ddcf5a3d0afe14d561.zip | |
Merge branch 'master_merge_new-image' of /home/tur/git/u-boot
Diffstat (limited to 'tools/mkimage.c')
| -rw-r--r-- | tools/mkimage.c | 539 | 
1 files changed, 213 insertions, 326 deletions
| diff --git a/tools/mkimage.c b/tools/mkimage.c index 21251306a..6e1ff2b1e 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -1,4 +1,6 @@  /* + * (C) Copyright 2008 Semihalf + *   * (C) Copyright 2000-2004   * DENX Software Engineering   * Wolfgang Denk, wd@denx.de @@ -20,44 +22,7 @@   * MA 02111-1307 USA   */ -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef __WIN32__ -#include <netinet/in.h>		/* for host / network byte order conversions	*/ -#endif -#include <sys/mman.h> -#include <sys/stat.h> -#include <time.h> -#include <unistd.h> - -#if defined(__BEOS__) || defined(__NetBSD__) || defined(__APPLE__) -#include <inttypes.h> -#endif - -#ifdef __WIN32__ -typedef unsigned int __u32; - -#define SWAP_LONG(x) \ -	((__u32)( \ -		(((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ -		(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) | \ -		(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) | \ -		(((__u32)(x) & (__u32)0xff000000UL) >> 24) )) -typedef		unsigned char	uint8_t; -typedef		unsigned short	uint16_t; -typedef		unsigned int	uint32_t; - -#define     ntohl(a)	SWAP_LONG(a) -#define     htonl(a)	SWAP_LONG(a) -#endif	/* __WIN32__ */ - -#ifndef	O_BINARY		/* should be define'd on __WIN32__ */ -#define O_BINARY	0 -#endif - +#include "mkimage.h"  #include <image.h>  extern int errno; @@ -66,110 +31,27 @@ extern int errno;  #define MAP_FAILED (-1)  #endif -char *cmdname; - -extern unsigned long crc32 (unsigned long crc, const char *buf, unsigned int len); - -typedef struct table_entry { -	int	val;		/* as defined in image.h	*/ -	char	*sname;		/* short (input) name		*/ -	char	*lname;		/* long (output) name		*/ -} table_entry_t; - -table_entry_t arch_name[] = { -    {	IH_CPU_INVALID,		NULL,		"Invalid CPU",	}, -    {	IH_CPU_ALPHA,		"alpha",	"Alpha",	}, -    {	IH_CPU_ARM,		"arm",		"ARM",		}, -    {	IH_CPU_I386,		"x86",		"Intel x86",	}, -    {	IH_CPU_IA64,		"ia64",		"IA64",		}, -    {	IH_CPU_M68K,		"m68k",		"MC68000",	}, -    {	IH_CPU_MICROBLAZE,	"microblaze",	"MicroBlaze",	}, -    {	IH_CPU_MIPS,		"mips",		"MIPS",		}, -    {	IH_CPU_MIPS64,		"mips64",	"MIPS 64 Bit",	}, -    {	IH_CPU_NIOS,		"nios",		"NIOS",		}, -    {	IH_CPU_NIOS2,		"nios2",	"NIOS II",	}, -    {	IH_CPU_PPC,		"ppc",		"PowerPC",	}, -    {	IH_CPU_S390,		"s390",		"IBM S390",	}, -    {	IH_CPU_SH,		"sh",		"SuperH",	}, -    {	IH_CPU_SPARC,		"sparc",	"SPARC",	}, -    {	IH_CPU_SPARC64,		"sparc64",	"SPARC 64 Bit",	}, -    {	IH_CPU_BLACKFIN,	"blackfin",	"Blackfin",	}, -    {	IH_CPU_AVR32,		"avr32",	"AVR32",	}, -    {	-1,			"",		"",		}, -}; - -table_entry_t os_name[] = { -    {	IH_OS_INVALID,	NULL,		"Invalid OS",		}, -    {	IH_OS_4_4BSD,	"4_4bsd",	"4_4BSD",		}, -    {	IH_OS_ARTOS,	"artos",	"ARTOS",		}, -    {	IH_OS_DELL,	"dell",		"Dell",			}, -    {	IH_OS_ESIX,	"esix",		"Esix",			}, -    {	IH_OS_FREEBSD,	"freebsd",	"FreeBSD",		}, -    {	IH_OS_IRIX,	"irix",		"Irix",			}, -    {	IH_OS_LINUX,	"linux",	"Linux",		}, -    {	IH_OS_LYNXOS,	"lynxos",	"LynxOS",		}, -    {	IH_OS_NCR,	"ncr",		"NCR",			}, -    {	IH_OS_NETBSD,	"netbsd",	"NetBSD",		}, -    {	IH_OS_OPENBSD,	"openbsd",	"OpenBSD",		}, -    {	IH_OS_PSOS,	"psos",		"pSOS",			}, -    {	IH_OS_QNX,	"qnx",		"QNX",			}, -    {	IH_OS_RTEMS,	"rtems",	"RTEMS",		}, -    {	IH_OS_SCO,	"sco",		"SCO",			}, -    {	IH_OS_SOLARIS,	"solaris",	"Solaris",		}, -    {	IH_OS_SVR4,	"svr4",		"SVR4",			}, -    {	IH_OS_U_BOOT,	"u-boot",	"U-Boot",		}, -    {	IH_OS_VXWORKS,	"vxworks",	"VxWorks",		}, -    {	-1,		"",		"",			}, -}; - -table_entry_t type_name[] = { -    {	IH_TYPE_INVALID,    NULL,	  "Invalid Image",	}, -    {	IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image",	}, -    {	IH_TYPE_FIRMWARE,   "firmware",	  "Firmware",		}, -    {	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	}, -    {	IH_TYPE_MULTI,	    "multi",	  "Multi-File Image",	}, -    {	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	}, -    {	IH_TYPE_SCRIPT,     "script",	  "Script",		}, -    {	IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, -    {	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	}, -    {	-1,		    "",		  "",			}, -}; - -table_entry_t comp_name[] = { -    {	IH_COMP_NONE,	"none",		"uncompressed",		}, -    {	IH_COMP_BZIP2,	"bzip2",	"bzip2 compressed",	}, -    {	IH_COMP_GZIP,	"gzip",		"gzip compressed",	}, -    {	-1,		"",		"",			}, -}; - -static	void	copy_file (int, const char *, int); -static	void	usage	(void); -static	void	print_header (image_header_t *); -static	void	print_type (image_header_t *); -static	char	*put_table_entry (table_entry_t *, char *, int); -static	char	*put_arch (int); -static	char	*put_type (int); -static	char	*put_os   (int); -static	char	*put_comp (int); -static	int	get_table_entry (table_entry_t *, char *, char *); -static	int	get_arch(char *); -static	int	get_comp(char *); -static	int	get_os  (char *); -static	int	get_type(char *); - +extern	unsigned long	crc32 (unsigned long crc, const char *buf, unsigned int len); +static	void		copy_file (int, const char *, int); +static	void		usage (void); +static	void		image_verify_header (char *, int); +static	void		fit_handle_file (void);  char	*datafile;  char	*imagefile; +char	*cmdname;  int dflag    = 0;  int eflag    = 0; +int fflag    = 0;  int lflag    = 0;  int vflag    = 0;  int xflag    = 0;  int opt_os   = IH_OS_LINUX; -int opt_arch = IH_CPU_PPC; +int opt_arch = IH_ARCH_PPC;  int opt_type = IH_TYPE_KERNEL;  int opt_comp = IH_COMP_GZIP; +char *opt_dtc = MKIMAGE_DEFAULT_DTC_OPTIONS;  image_header_t header;  image_header_t *hdr = &header; @@ -177,7 +59,7 @@ image_header_t *hdr = &header;  int  main (int argc, char **argv)  { -	int ifd; +	int ifd = -1;  	uint32_t checksum;  	uint32_t addr;  	uint32_t ep; @@ -197,22 +79,28 @@ main (int argc, char **argv)  				break;  			case 'A':  				if ((--argc <= 0) || -				    (opt_arch = get_arch(*++argv)) < 0) +				    (opt_arch = genimg_get_arch_id (*++argv)) < 0)  					usage ();  				goto NXTARG;  			case 'C':  				if ((--argc <= 0) || -				    (opt_comp = get_comp(*++argv)) < 0) +				    (opt_comp = genimg_get_comp_id (*++argv)) < 0) +					usage (); +				goto NXTARG; +			case 'D': +				if (--argc <= 0)  					usage (); +				opt_dtc = *++argv;  				goto NXTARG; +  			case 'O':  				if ((--argc <= 0) || -				    (opt_os = get_os(*++argv)) < 0) +				    (opt_os = genimg_get_os_id (*++argv)) < 0)  					usage ();  				goto NXTARG;  			case 'T':  				if ((--argc <= 0) || -				    (opt_type = get_type(*++argv)) < 0) +				    (opt_type = genimg_get_type_id (*++argv)) < 0)  					usage ();  				goto NXTARG; @@ -245,6 +133,12 @@ main (int argc, char **argv)  				}  				eflag = 1;  				goto NXTARG; +			case 'f': +				if (--argc <= 0) +					usage (); +				datafile = *++argv; +				fflag = 1; +				goto NXTARG;  			case 'n':  				if (--argc <= 0)  					usage (); @@ -263,14 +157,17 @@ main (int argc, char **argv)  NXTARG:		;  	} -	if ((argc != 1) || ((lflag ^ dflag) == 0)) +	if ((argc != 1) || +		(dflag && (fflag || lflag)) || +		(fflag && (dflag || lflag)) || +		(lflag && (dflag || fflag)))  		usage();  	if (!eflag) {  		ep = addr;  		/* If XIP, entry point must be after the U-Boot header */  		if (xflag) -			ep += sizeof(image_header_t); +			ep += image_get_header_size ();  	}  	/* @@ -278,32 +175,33 @@ NXTARG:		;  	 * the size of the U-Boot header.  	 */  	if (xflag) { -		if (ep != addr + sizeof(image_header_t)) { +		if (ep != addr + image_get_header_size ()) {  			fprintf (stderr,  				"%s: For XIP, the entry point must be the load addr + %lu\n",  				cmdname, -				(unsigned long)sizeof(image_header_t)); +				(unsigned long)image_get_header_size ());  			exit (EXIT_FAILURE);  		}  	}  	imagefile = *argv; -	if (lflag) { -		ifd = open(imagefile, O_RDONLY|O_BINARY); -	} else { -		ifd = open(imagefile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0666); -	} +	if (!fflag){ +		if (lflag) { +			ifd = open (imagefile, O_RDONLY|O_BINARY); +		} else { +			ifd = open (imagefile, +				O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0666); +		} -	if (ifd < 0) { -		fprintf (stderr, "%s: Can't open %s: %s\n", -			cmdname, imagefile, strerror(errno)); -		exit (EXIT_FAILURE); +		if (ifd < 0) { +			fprintf (stderr, "%s: Can't open %s: %s\n", +				cmdname, imagefile, strerror(errno)); +			exit (EXIT_FAILURE); +		}  	}  	if (lflag) { -		int len; -		char *data;  		/*  		 * list header information of existing image  		 */ @@ -313,7 +211,7 @@ NXTARG:		;  			exit (EXIT_FAILURE);  		} -		if ((unsigned)sbuf.st_size < sizeof(image_header_t)) { +		if ((unsigned)sbuf.st_size < image_get_header_size ()) {  			fprintf (stderr,  				"%s: Bad size: \"%s\" is no valid image\n",  				cmdname, imagefile); @@ -328,50 +226,24 @@ NXTARG:		;  			exit (EXIT_FAILURE);  		} -		/* -		 * create copy of header so that we can blank out the -		 * checksum field for checking - this can't be done -		 * on the PROT_READ mapped data. -		 */ -		memcpy (hdr, ptr, sizeof(image_header_t)); - -		if (ntohl(hdr->ih_magic) != IH_MAGIC) { -			fprintf (stderr, -				"%s: Bad Magic Number: \"%s\" is no valid image\n", -				cmdname, imagefile); -			exit (EXIT_FAILURE); +		if (fdt_check_header (ptr)) { +			/* old-style image */ +			image_verify_header ((char *)ptr, sbuf.st_size); +			image_print_contents_noindent ((image_header_t *)ptr); +		} else { +			/* FIT image */ +			fit_print_contents_noindent (ptr);  		} -		data = (char *)hdr; -		len  = sizeof(image_header_t); - -		checksum = ntohl(hdr->ih_hcrc); -		hdr->ih_hcrc = htonl(0);	/* clear for re-calculation */ - -		if (crc32 (0, data, len) != checksum) { -			fprintf (stderr, -				"%s: ERROR: \"%s\" has bad header checksum!\n", -				cmdname, imagefile); -			exit (EXIT_FAILURE); -		} - -		data = (char *)(ptr + sizeof(image_header_t)); -		len  = sbuf.st_size - sizeof(image_header_t) ; - -		if (crc32 (0, data, len) != ntohl(hdr->ih_dcrc)) { -			fprintf (stderr, -				"%s: ERROR: \"%s\" has corrupted data!\n", -				cmdname, imagefile); -			exit (EXIT_FAILURE); -		} - -		/* for multi-file images we need the data part, too */ -		print_header ((image_header_t *)ptr); -  		(void) munmap((void *)ptr, sbuf.st_size);  		(void) close (ifd);  		exit (EXIT_SUCCESS); +	} else if (fflag) { +		/* Flattened Image Tree (FIT) format  handling */ +		debug ("FIT format handling\n"); +		fit_handle_file (); +		exit (EXIT_SUCCESS);  	}  	/* @@ -379,9 +251,9 @@ NXTARG:		;  	 *  	 * write dummy header, to be fixed later  	 */ -	memset (hdr, 0, sizeof(image_header_t)); +	memset (hdr, 0, image_get_header_size ()); -	if (write(ifd, hdr, sizeof(image_header_t)) != sizeof(image_header_t)) { +	if (write(ifd, hdr, image_get_header_size ()) != image_get_header_size ()) {  		fprintf (stderr, "%s: Write error on %s: %s\n",  			cmdname, imagefile, strerror(errno));  		exit (EXIT_FAILURE); @@ -404,7 +276,7 @@ NXTARG:		;  						cmdname, file, strerror(errno));  					exit (EXIT_FAILURE);  				} -				size = htonl(sbuf.st_size); +				size = cpu_to_uimage (sbuf.st_size);  			} else {  				size = 0;  			} @@ -469,29 +341,29 @@ NXTARG:		;  	hdr = (image_header_t *)ptr;  	checksum = crc32 (0, -			  (const char *)(ptr + sizeof(image_header_t)), -			  sbuf.st_size - sizeof(image_header_t) +			  (const char *)(ptr + image_get_header_size ()), +			  sbuf.st_size - image_get_header_size ()  			 );  	/* Build new header */ -	hdr->ih_magic = htonl(IH_MAGIC); -	hdr->ih_time  = htonl(sbuf.st_mtime); -	hdr->ih_size  = htonl(sbuf.st_size - sizeof(image_header_t)); -	hdr->ih_load  = htonl(addr); -	hdr->ih_ep    = htonl(ep); -	hdr->ih_dcrc  = htonl(checksum); -	hdr->ih_os    = opt_os; -	hdr->ih_arch  = opt_arch; -	hdr->ih_type  = opt_type; -	hdr->ih_comp  = opt_comp; +	image_set_magic (hdr, IH_MAGIC); +	image_set_time (hdr, sbuf.st_mtime); +	image_set_size (hdr, sbuf.st_size - image_get_header_size ()); +	image_set_load (hdr, addr); +	image_set_ep (hdr, ep); +	image_set_dcrc (hdr, checksum); +	image_set_os (hdr, opt_os); +	image_set_arch (hdr, opt_arch); +	image_set_type (hdr, opt_type); +	image_set_comp (hdr, opt_comp); -	strncpy((char *)hdr->ih_name, name, IH_NMLEN); +	image_set_name (hdr, name); -	checksum = crc32(0,(const char *)hdr,sizeof(image_header_t)); +	checksum = crc32 (0, (const char *)hdr, image_get_header_size ()); -	hdr->ih_hcrc = htonl(checksum); +	image_set_hcrc (hdr, checksum); -	print_header (hdr); +	image_print_contents_noindent (hdr);  	(void) munmap((void *)ptr, sbuf.st_size); @@ -554,14 +426,14 @@ copy_file (int ifd, const char *datafile, int pad)  		 * reserved for it.  		 */ -		if ((unsigned)sbuf.st_size < sizeof(image_header_t)) { +		if ((unsigned)sbuf.st_size < image_get_header_size ()) {  			fprintf (stderr,  				"%s: Bad size: \"%s\" is too small for XIP\n",  				cmdname, datafile);  			exit (EXIT_FAILURE);  		} -		for (p=ptr; p < ptr+sizeof(image_header_t); p++) { +		for (p = ptr; p < ptr + image_get_header_size (); p++) {  			if ( *p != 0xff ) {  				fprintf (stderr,  					"%s: Bad file: \"%s\" has invalid buffer for XIP\n", @@ -570,7 +442,7 @@ copy_file (int ifd, const char *datafile, int pad)  			}  		} -		offset = sizeof(image_header_t); +		offset = image_get_header_size ();  	}  	size = sbuf.st_size - offset; @@ -597,11 +469,11 @@ void  usage ()  {  	fprintf (stderr, "Usage: %s -l image\n" -			 "          -l ==> list image header information\n" -			 "       %s [-x] -A arch -O os -T type -C comp " -			 "-a addr -e ep -n name -d data_file[:data_file...] image\n", -		cmdname, cmdname); -	fprintf (stderr, "          -A ==> set architecture to 'arch'\n" +			 "          -l ==> list image header information\n", +		cmdname); +	fprintf (stderr, "       %s [-x] -A arch -O os -T type -C comp " +			 "-a addr -e ep -n name -d data_file[:data_file...] image\n" +			 "          -A ==> set architecture to 'arch'\n"  			 "          -O ==> set operating system to 'os'\n"  			 "          -T ==> set image type to 'type'\n"  			 "          -C ==> set compression type 'comp'\n" @@ -609,143 +481,158 @@ usage ()  			 "          -e ==> set entry point to 'ep' (hex)\n"  			 "          -n ==> set image name to 'name'\n"  			 "          -d ==> use image data from 'datafile'\n" -			 "          -x ==> set XIP (execute in place)\n" -		); +			 "          -x ==> set XIP (execute in place)\n", +		cmdname); +	fprintf (stderr, "       %s [-D dtc_options] -f fit-image.its fit-image\n", +		cmdname); +  	exit (EXIT_FAILURE);  }  static void -print_header (image_header_t *hdr) +image_verify_header (char *ptr, int image_size)  { -	time_t timestamp; -	uint32_t size; - -	timestamp = (time_t)ntohl(hdr->ih_time); -	size = ntohl(hdr->ih_size); +	int len; +	char *data; +	uint32_t checksum; +	image_header_t header; +	image_header_t *hdr = &header; -	printf ("Image Name:   %.*s\n", IH_NMLEN, hdr->ih_name); -	printf ("Created:      %s", ctime(×tamp)); -	printf ("Image Type:   "); print_type(hdr); -	printf ("Data Size:    %d Bytes = %.2f kB = %.2f MB\n", -		size, (double)size / 1.024e3, (double)size / 1.048576e6 ); -	printf ("Load Address: 0x%08X\n", ntohl(hdr->ih_load)); -	printf ("Entry Point:  0x%08X\n", ntohl(hdr->ih_ep)); +	/* +	 * create copy of header so that we can blank out the +	 * checksum field for checking - this can't be done +	 * on the PROT_READ mapped data. +	 */ +	memcpy (hdr, ptr, sizeof(image_header_t)); -	if (hdr->ih_type == IH_TYPE_MULTI || hdr->ih_type == IH_TYPE_SCRIPT) { -		int i, ptrs; -		uint32_t pos; -		uint32_t *len_ptr = (uint32_t *) ( -					(unsigned long)hdr + sizeof(image_header_t) -				); +	if (ntohl(hdr->ih_magic) != IH_MAGIC) { +		fprintf (stderr, +			"%s: Bad Magic Number: \"%s\" is no valid image\n", +			cmdname, imagefile); +		exit (EXIT_FAILURE); +	} -		/* determine number of images first (to calculate image offsets) */ -		for (i=0; len_ptr[i]; ++i)	/* null pointer terminates list */ -			; -		ptrs = i;		/* null pointer terminates list */ +	data = (char *)hdr; +	len  = sizeof(image_header_t); -		pos = sizeof(image_header_t) + ptrs * sizeof(long); -		printf ("Contents:\n"); -		for (i=0; len_ptr[i]; ++i) { -			size = ntohl(len_ptr[i]); +	checksum = ntohl(hdr->ih_hcrc); +	hdr->ih_hcrc = htonl(0);	/* clear for re-calculation */ -			printf ("   Image %d: %8d Bytes = %4d kB = %d MB\n", -				i, size, size>>10, size>>20); -			if (hdr->ih_type == IH_TYPE_SCRIPT && i > 0) { -				/* -				 * the user may need to know offsets -				 * if planning to do something with -				 * multiple files -				 */ -				printf ("    Offset = %08X\n", pos); -			} -			/* copy_file() will pad the first files to even word align */ -			size += 3; -			size &= ~3; -			pos += size; -		} +	if (crc32 (0, data, len) != checksum) { +		fprintf (stderr, +			"%s: ERROR: \"%s\" has bad header checksum!\n", +			cmdname, imagefile); +		exit (EXIT_FAILURE);  	} -} - -static void -print_type (image_header_t *hdr) -{ -	printf ("%s %s %s (%s)\n", -		put_arch (hdr->ih_arch), -		put_os   (hdr->ih_os  ), -		put_type (hdr->ih_type), -		put_comp (hdr->ih_comp) -	); -} - -static char *put_arch (int arch) -{ -	return (put_table_entry(arch_name, "Unknown Architecture", arch)); -} +	data = ptr + sizeof(image_header_t); +	len  = image_size - sizeof(image_header_t) ; -static char *put_os (int os) -{ -	return (put_table_entry(os_name, "Unknown OS", os)); +	if (crc32 (0, data, len) != ntohl(hdr->ih_dcrc)) { +		fprintf (stderr, +			"%s: ERROR: \"%s\" has corrupted data!\n", +			cmdname, imagefile); +		exit (EXIT_FAILURE); +	}  } -static char *put_type (int type) +/** + * fit_handle_file - main FIT file processing function + * + * fit_handle_file() runs dtc to convert .its to .itb, includes + * binary data, updates timestamp property and calculates hashes. + * + * datafile  - .its file + * imagefile - .itb file + * + * returns: + *     only on success, otherwise calls exit (EXIT_FAILURE); + */ +static void fit_handle_file (void)  { -	return (put_table_entry(type_name, "Unknown Image", type)); -} +	char tmpfile[MKIMAGE_MAX_TMPFILE_LEN]; +	char cmd[MKIMAGE_MAX_DTC_CMDLINE_LEN]; +	int tfd; +	struct stat sbuf; +	unsigned char *ptr; -static char *put_comp (int comp) -{ -	return (put_table_entry(comp_name, "Unknown Compression", comp)); -} +	/* call dtc to include binary properties into the tmp file */ +	if (strlen (imagefile) + strlen (MKIMAGE_TMPFILE_SUFFIX) + 1 > +		sizeof (tmpfile)) { +		fprintf (stderr, "%s: Image file name (%s) too long, " +				"can't create tmpfile", +				imagefile, cmdname); +		exit (EXIT_FAILURE); +	} +	sprintf (tmpfile, "%s%s", imagefile, MKIMAGE_TMPFILE_SUFFIX); -static char *put_table_entry (table_entry_t *table, char *msg, int type) -{ -	for (; table->val>=0; ++table) { -		if (table->val == type) -			return (table->lname); +	/* dtc -I dts -O -p 200 datafile > tmpfile */ +	sprintf (cmd, "%s %s %s > %s", +			MKIMAGE_DTC, opt_dtc, datafile, tmpfile); +	debug ("Trying to execute \"%s\"\n", cmd); +	if (system (cmd) == -1) { +		fprintf (stderr, "%s: system(%s) failed: %s\n", +				cmdname, cmd, strerror(errno)); +		unlink (tmpfile); +		exit (EXIT_FAILURE);  	} -	return (msg); -} -static int get_arch(char *name) -{ -	return (get_table_entry(arch_name, "CPU", name)); -} +	/* load FIT blob into memory */ +	tfd = open (tmpfile, O_RDWR|O_BINARY); +	if (tfd < 0) { +		fprintf (stderr, "%s: Can't open %s: %s\n", +				cmdname, tmpfile, strerror(errno)); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} -static int get_comp(char *name) -{ -	return (get_table_entry(comp_name, "Compression", name)); -} +	if (fstat (tfd, &sbuf) < 0) { +		fprintf (stderr, "%s: Can't stat %s: %s\n", +				cmdname, tmpfile, strerror(errno)); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} +	ptr = (unsigned char *)mmap (0, sbuf.st_size, +			PROT_READ|PROT_WRITE, MAP_SHARED, tfd, 0); +	if ((caddr_t)ptr == (caddr_t)-1) { +		fprintf (stderr, "%s: Can't read %s: %s\n", +				cmdname, tmpfile, strerror(errno)); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} -static int get_os (char *name) -{ -	return (get_table_entry(os_name, "OS", name)); -} +	/* check if ptr has a valid blob */ +	if (fdt_check_header (ptr)) { +		fprintf (stderr, "%s: Invalid FIT blob\n", cmdname); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} +	/* set hashes for images in the blob */ +	if (fit_set_hashes (ptr)) { +		fprintf (stderr, "%s Can't add hashes to FIT blob", cmdname); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} -static int get_type(char *name) -{ -	return (get_table_entry(type_name, "Image", name)); -} +	/* add a timestamp at offset 0 i.e., root  */ +	if (fit_set_timestamp (ptr, 0, sbuf.st_mtime)) { +		fprintf (stderr, "%s: Can't add image timestamp\n", cmdname); +		unlink (tmpfile); +		exit (EXIT_FAILURE); +	} +	debug ("Added timestamp successfully\n"); -static int get_table_entry (table_entry_t *table, char *msg, char *name) -{ -	table_entry_t *t; -	int first = 1; +	munmap ((void *)ptr, sbuf.st_size); +	close (tfd); -	for (t=table; t->val>=0; ++t) { -		if (t->sname && strcasecmp(t->sname, name)==0) -			return (t->val); -	} -	fprintf (stderr, "\nInvalid %s Type - valid names are", msg); -	for (t=table; t->val>=0; ++t) { -		if (t->sname == NULL) -			continue; -		fprintf (stderr, "%c %s", (first) ? ':' : ',', t->sname); -		first = 0; +	if (rename (tmpfile, imagefile) == -1) { +		fprintf (stderr, "%s: Can't rename %s to %s: %s\n", +				cmdname, tmpfile, imagefile, strerror (errno)); +		unlink (tmpfile); +		unlink (imagefile); +		exit (EXIT_FAILURE);  	} -	fprintf (stderr, "\n"); -	return (-1);  } |