[new uImage] Define a API for image handling operations

- Add inline helper macros for basic header processing
- Move common non inline code common/image.c
- Replace direct header access with the API routines
- Rename IH_CPU_* to IH_ARCH_*

Signed-off-by: Marian Balakowicz <m8@semihalf.com>
diff --git a/common/Makefile b/common/Makefile
index 533c415..d3a4a85 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -36,6 +36,7 @@
 COBJS-$(CONFIG_CMD_BDI) += cmd_bdinfo.o
 COBJS-$(CONFIG_CMD_BEDBUG) += cmd_bedbug.o
 COBJS-$(CONFIG_CMD_BMP) += cmd_bmp.o
+COBJS-y += image.o
 COBJS-y += cmd_boot.o
 COBJS-y += cmd_bootm.o
 COBJS-$(CONFIG_CMD_CACHE) += cmd_cache.o
diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c
index a6038a6..3e68ced 100644
--- a/common/cmd_autoscript.c
+++ b/common/cmd_autoscript.c
@@ -49,56 +49,44 @@
 
 #if defined(CONFIG_AUTOSCRIPT) || defined(CONFIG_CMD_AUTOSCRIPT)
 
-extern image_header_t header;		/* from cmd_bootm.c */
 int
 autoscript (ulong addr)
 {
-	ulong crc, data, len;
-	image_header_t *hdr = &header;
+	ulong len;
+	image_header_t *hdr = (image_header_t *)addr;
 	ulong *len_ptr;
 	char *cmd;
 	int rcode = 0;
 	int verify;
 
-	cmd = getenv ("verify");
-	verify = (cmd && (*cmd == 'n')) ? 0 : 1;
+	verify = getenv_verify ();
 
-
-	memmove (hdr, (char *)addr, sizeof(image_header_t));
-
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 		puts ("Bad magic number\n");
 		return 1;
 	}
 
-	crc = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-	len = sizeof (image_header_t);
-	data = (ulong)hdr;
-	if (crc32(0, (uchar *)data, len) != crc) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("Bad header crc\n");
 		return 1;
 	}
 
-	data = addr + sizeof(image_header_t);
-	len = ntohl(hdr->ih_size);
-
 	if (verify) {
-		if (crc32(0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {
+		if (!image_check_dcrc (hdr)) {
 			puts ("Bad data crc\n");
 			return 1;
 		}
 	}
 
-	if (hdr->ih_type != IH_TYPE_SCRIPT) {
+	if (!image_check_type (hdr, IH_TYPE_SCRIPT)) {
 		puts ("Bad image type\n");
 		return 1;
 	}
 
 	/* get length of script */
-	len_ptr = (ulong *)data;
+	len_ptr = (ulong *)image_get_data (hdr);
 
-	if ((len = ntohl(*len_ptr)) == 0) {
+	if ((len = image_to_cpu (*len_ptr)) == 0) {
 		puts ("Empty Script\n");
 		return 1;
 	}
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 9546729..be8589d 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -21,6 +21,8 @@
  * MA 02111-1307 USA
  */
 
+#define DEBUG
+
 /*
  * Boot support
  */
@@ -73,9 +75,7 @@
  * we must make sure to split long operations like memmove() or
  * crc32() into reasonable chunks.
  */
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
-# define CHUNKSZ (64 * 1024)
-#endif
+#define CHUNKSZ (64 * 1024)
 
 int  gunzip (void *, int, unsigned char *, unsigned long *);
 
@@ -152,7 +152,7 @@
 {
 	ulong	iflag;
 	ulong	addr;
-	ulong	data, len, checksum;
+	ulong	data, len;
 	ulong  *len_ptr;
 	uint	unc_len = CFG_BOOTM_LEN;
 	int	i, verify;
@@ -160,8 +160,7 @@
 	int	(*appl)(int, char *[]);
 	image_header_t *hdr = &header;
 
-	s = getenv ("verify");
-	verify = (s && (*s == 'n')) ? 0 : 1;
+	verify = getenv_verify ();
 
 	if (argc < 2) {
 		addr = load_addr;
@@ -175,16 +174,16 @@
 	/* Copy header so we can blank CRC field for re-calculation */
 #ifdef CONFIG_HAS_DATAFLASH
 	if (addr_dataflash(addr)){
-		read_dataflash(addr, sizeof(image_header_t), (char *)&header);
+		read_dataflash (addr, image_get_header_size (), (char *)&header);
 	} else
 #endif
-	memmove (&header, (char *)addr, sizeof(image_header_t));
+	memmove (&header, (char *)addr, image_get_header_size ());
 
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 #ifdef __I386__	/* correct image format not implemented yet - fake it */
 		if (fake_header(hdr, (void*)addr, -1) != NULL) {
 			/* to compensate for the addition below */
-			addr -= sizeof(image_header_t);
+			addr -= image_get_header_size ();
 			/* turnof verify,
 			 * fake_header() does not fake the data crc
 			 */
@@ -199,13 +198,7 @@
 	}
 	show_boot_progress (2);
 
-	data = (ulong)&header;
-	len  = sizeof(image_header_t);
-
-	checksum = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-
-	if (crc32 (0, (uchar *)data, len) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("Bad Header Checksum\n");
 		show_boot_progress (-2);
 		return 1;
@@ -214,7 +207,7 @@
 
 #ifdef CONFIG_HAS_DATAFLASH
 	if (addr_dataflash(addr)){
-		len  = ntohl(hdr->ih_size) + sizeof(image_header_t);
+		len  = image_get_image_size (hdr);
 		read_dataflash(addr, len, (char *)CFG_LOAD_ADDR);
 		addr = CFG_LOAD_ADDR;
 	}
@@ -224,12 +217,13 @@
 	/* for multi-file images we need the data part, too */
 	print_image_hdr ((image_header_t *)addr);
 
-	data = addr + sizeof(image_header_t);
-	len  = ntohl(hdr->ih_size);
+	len = image_get_data_size (hdr);
+	data = addr + image_get_header_size ();
+	len_ptr = (ulong *)data;
 
 	if (verify) {
 		puts ("   Verifying Checksum ... ");
-		if (crc32 (0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {
+		if (!image_check_dcrc ((image_header_t *)addr)) {
 			printf ("Bad Data CRC\n");
 			show_boot_progress (-3);
 			return 1;
@@ -238,46 +232,19 @@
 	}
 	show_boot_progress (4);
 
-	len_ptr = (ulong *)data;
-
-#if defined(__ARM__)
-	if (hdr->ih_arch != IH_CPU_ARM)
-#elif defined(__avr32__)
-	if (hdr->ih_arch != IH_CPU_AVR32)
-#elif defined(__bfin__)
-	if (hdr->ih_arch != IH_CPU_BLACKFIN)
-#elif defined(__I386__)
-	if (hdr->ih_arch != IH_CPU_I386)
-#elif defined(__M68K__)
-	if (hdr->ih_arch != IH_CPU_M68K)
-#elif defined(__microblaze__)
-	if (hdr->ih_arch != IH_CPU_MICROBLAZE)
-#elif defined(__mips__)
-	if (hdr->ih_arch != IH_CPU_MIPS)
-#elif defined(__nios__)
-	if (hdr->ih_arch != IH_CPU_NIOS)
-#elif defined(__nios2__)
-	if (hdr->ih_arch != IH_CPU_NIOS2)
-#elif defined(__PPC__)
-	if (hdr->ih_arch != IH_CPU_PPC)
-#elif defined(__sh__)
-	if (hdr->ih_arch != IH_CPU_SH)
-#else
-# error Unknown CPU type
-#endif
-	{
-		printf ("Unsupported Architecture 0x%x\n", hdr->ih_arch);
+	if (!image_check_target_arch (hdr)) {
+		printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr));
 		show_boot_progress (-4);
 		return 1;
 	}
 	show_boot_progress (5);
 
-	switch (hdr->ih_type) {
+	switch (image_get_type (hdr)) {
 	case IH_TYPE_STANDALONE:
 		name = "Standalone Application";
 		/* A second argument overwrites the load address */
 		if (argc > 2) {
-			hdr->ih_load = htonl(simple_strtoul(argv[2], NULL, 16));
+			image_set_load (hdr, simple_strtoul (argv[2], NULL, 16));
 		}
 		break;
 	case IH_TYPE_KERNEL:
@@ -285,7 +252,7 @@
 		break;
 	case IH_TYPE_MULTI:
 		name = "Multi-File Image";
-		len  = ntohl(len_ptr[0]);
+		len  = image_to_cpu (len_ptr[0]);
 		/* OS kernel is always the first image */
 		data += 8; /* kernel_len + terminator */
 		for (i=1; len_ptr[i]; ++i)
@@ -316,14 +283,14 @@
 	dcache_disable();
 #endif
 
-	switch (hdr->ih_comp) {
+	switch (image_get_comp (hdr)) {
 	case IH_COMP_NONE:
-		if(ntohl(hdr->ih_load) == addr) {
+		if (image_get_load (hdr) == addr) {
 			printf ("   XIP %s ... ", name);
 		} else {
 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
 			size_t l = len;
-			void *to = (void *)ntohl(hdr->ih_load);
+			void *to = (void *)image_get_load (hdr);
 			void *from = (void *)data;
 
 			printf ("   Loading %s ... ", name);
@@ -337,13 +304,13 @@
 				l -= tail;
 			}
 #else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
-			memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
+			memmove ((void *)image_get_load (hdr), (uchar *)data, len);
 #endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
 		}
 		break;
 	case IH_COMP_GZIP:
 		printf ("   Uncompressing %s ... ", name);
-		if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,
+		if (gunzip ((void *)image_get_load (hdr), unc_len,
 			    (uchar *)data, &len) != 0) {
 			puts ("GUNZIP ERROR - must RESET board to recover\n");
 			show_boot_progress (-6);
@@ -358,7 +325,7 @@
 		 * use slower decompression algorithm which requires
 		 * at most 2300 KB of memory.
 		 */
-		i = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),
+		i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr),
 						&unc_len, (char *)data, len,
 						CFG_MALLOC_LEN < (4096 * 1024), 0);
 		if (i != BZ_OK) {
@@ -371,14 +338,14 @@
 	default:
 		if (iflag)
 			enable_interrupts();
-		printf ("Unimplemented compression type %d\n", hdr->ih_comp);
+		printf ("Unimplemented compression type %d\n", image_get_comp (hdr));
 		show_boot_progress (-7);
 		return 1;
 	}
 	puts ("OK\n");
 	show_boot_progress (7);
 
-	switch (hdr->ih_type) {
+	switch (image_get_type (hdr)) {
 	case IH_TYPE_STANDALONE:
 		if (iflag)
 			enable_interrupts();
@@ -392,7 +359,7 @@
 			setenv("filesize", buf);
 			return 0;
 		}
-		appl = (int (*)(int, char *[]))ntohl(hdr->ih_ep);
+		appl = (int (*)(int, char *[]))image_get_ep (hdr);
 		(*appl)(argc-1, &argv[1]);
 		return 0;
 	case IH_TYPE_KERNEL:
@@ -402,13 +369,13 @@
 	default:
 		if (iflag)
 			enable_interrupts();
-		printf ("Can't boot image type %d\n", hdr->ih_type);
+		printf ("Can't boot image type %d\n", image_get_type (hdr));
 		show_boot_progress (-8);
 		return 1;
 	}
 	show_boot_progress (8);
 
-	switch (hdr->ih_os) {
+	switch (image_get_os (hdr)) {
 	default:			/* handled by (original) Linux case */
 	case IH_OS_LINUX:
 #ifdef CONFIG_SILENT_CONSOLE
@@ -517,7 +484,7 @@
 		int	verify)
 {
 	ulong	sp;
-	ulong	len, checksum;
+	ulong	len;
 	ulong	initrd_start, initrd_end;
 	ulong	cmd_start, cmd_end;
 	ulong	initrd_high;
@@ -615,7 +582,7 @@
 #endif /* CONFIG_MPC5xxx */
 	}
 
-	kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong)) ntohl(hdr->ih_ep);
+	kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))image_get_ep (hdr);
 
 	/*
 	 * Check if there is an initrd image
@@ -636,60 +603,27 @@
 		addr = simple_strtoul(argv[2], NULL, 16);
 
 		printf ("## Loading RAMDisk Image at %08lx ...\n", addr);
+		hdr = (image_header_t *)addr;
 
-		/* Copy header so we can blank CRC field for re-calculation */
-		memmove (&header, (char *)addr, sizeof(image_header_t));
-
-		if (ntohl(hdr->ih_magic)  != IH_MAGIC) {
+		if (!image_check_magic (hdr)) {
 			puts ("Bad Magic Number\n");
 			show_boot_progress (-10);
 			do_reset (cmdtp, flag, argc, argv);
 		}
 
-		data = (ulong)&header;
-		len  = sizeof(image_header_t);
-
-		checksum = ntohl(hdr->ih_hcrc);
-		hdr->ih_hcrc = 0;
-
-		if (crc32 (0, (uchar *)data, len) != checksum) {
+		if (!image_check_hcrc (hdr)) {
 			puts ("Bad Header Checksum\n");
 			show_boot_progress (-11);
 			do_reset (cmdtp, flag, argc, argv);
 		}
-
 		show_boot_progress (10);
 
 		print_image_hdr (hdr);
 
-		data = addr + sizeof(image_header_t);
-		len  = ntohl(hdr->ih_size);
-
 		if (verify) {
-			ulong csum = 0;
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
-			ulong cdata = data, edata = cdata + len;
-#endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
-
 			puts ("   Verifying Checksum ... ");
 
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
-
-			while (cdata < edata) {
-				ulong chunk = edata - cdata;
-
-				if (chunk > CHUNKSZ)
-					chunk = CHUNKSZ;
-				csum = crc32 (csum, (uchar *)cdata, chunk);
-				cdata += chunk;
-
-				WATCHDOG_RESET();
-			}
-#else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
-			csum = crc32 (0, (uchar *)data, len);
-#endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
-
-			if (csum != ntohl(hdr->ih_dcrc)) {
+			if (!image_check_dcrc_wd (hdr, CHUNKSZ)) {
 				puts ("Bad Data CRC\n");
 				show_boot_progress (-12);
 				do_reset (cmdtp, flag, argc, argv);
@@ -699,19 +633,22 @@
 
 		show_boot_progress (11);
 
-		if ((hdr->ih_os   != IH_OS_LINUX)	||
-		    (hdr->ih_arch != IH_CPU_PPC)	||
-		    (hdr->ih_type != IH_TYPE_RAMDISK)	) {
+		if (!image_check_os (hdr, IH_OS_LINUX) ||
+		    !image_check_arch (hdr, IH_ARCH_PPC) ||
+		    !image_check_type (hdr, IH_TYPE_RAMDISK)) {
 			puts ("No Linux PPC Ramdisk Image\n");
 			show_boot_progress (-13);
 			do_reset (cmdtp, flag, argc, argv);
 		}
 
+		data = image_get_data (hdr);
+		len = image_get_data_size (hdr);
+
 		/*
 		 * Now check if we have a multifile image
 		 */
-	} else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) {
-		u_long tail    = ntohl(len_ptr[0]) % 4;
+	} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) {
+		u_long tail    = image_to_cpu (len_ptr[0]) % 4;
 		int i;
 
 		show_boot_progress (13);
@@ -722,12 +659,12 @@
 		for (i=1; len_ptr[i]; ++i)
 			data += 4;
 		/* add kernel length, and align */
-		data += ntohl(len_ptr[0]);
+		data += image_to_cpu (len_ptr[0]);
 		if (tail) {
 			data += 4 - tail;
 		}
 
-		len   = ntohl(len_ptr[1]);
+		len   = image_to_cpu (len_ptr[1]);
 
 	} else {
 		/*
@@ -743,70 +680,64 @@
 		of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);
 		hdr = (image_header_t *)of_flat_tree;
 #if defined(CONFIG_OF_FLAT_TREE)
-		if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) {
+		if (*((ulong *)(of_flat_tree + image_get_header_size ())) != OF_DT_HEADER) {
 #else
-		if (fdt_check_header(of_flat_tree + sizeof(image_header_t)) != 0) {
+		if (fdt_check_header (of_flat_tree + image_get_header_size ()) != 0) {
 #endif
 #ifndef CFG_NO_FLASH
 			if (addr2info((ulong)of_flat_tree) != NULL)
 				of_data = (ulong)of_flat_tree;
 #endif
-		} else if (ntohl(hdr->ih_magic) == IH_MAGIC) {
+		} else if (image_check_magic (hdr)) {
 			printf("## Flat Device Tree at %08lX\n", hdr);
-			print_image_hdr(hdr);
+			print_image_hdr (hdr);
 
-			if ((ntohl(hdr->ih_load) <  ((unsigned long)hdr + ntohl(hdr->ih_size) + sizeof(hdr))) &&
-			   ((ntohl(hdr->ih_load) + ntohl(hdr->ih_size)) > (unsigned long)hdr)) {
+			if ((image_get_load (hdr) <  ((unsigned long)hdr + image_get_image_size (hdr))) &&
+			   ((image_get_load (hdr) + image_get_data_size (hdr)) > (unsigned long)hdr)) {
 				puts ("ERROR: fdt overwritten - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
 
 			puts ("   Verifying Checksum ... ");
-			memmove (&header, (char *)hdr, sizeof(image_header_t));
-			checksum = ntohl(header.ih_hcrc);
-			header.ih_hcrc = 0;
-
-			if(checksum != crc32(0, (uchar *)&header, sizeof(image_header_t))) {
+			if (!image_check_hcrc (hdr)) {
 				puts ("ERROR: fdt header checksum invalid - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
 
-			checksum = ntohl(hdr->ih_dcrc);
-			addr = (ulong)((uchar *)(hdr) + sizeof(image_header_t));
-
-			if(checksum != crc32(0, (uchar *)addr, ntohl(hdr->ih_size))) {
+			if (!image_check_dcrc (hdr)) {
 				puts ("ERROR: fdt checksum invalid - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
 			puts ("OK\n");
 
-			if (ntohl(hdr->ih_type) != IH_TYPE_FLATDT) {
+			if (!image_check_type (hdr, IH_TYPE_FLATDT)) {
 				puts ("ERROR: uImage is not a fdt - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
-			if (ntohl(hdr->ih_comp) != IH_COMP_NONE) {
+			if (image_get_comp (hdr) != IH_COMP_NONE) {
 				puts ("ERROR: uImage is compressed - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
 #if defined(CONFIG_OF_FLAT_TREE)
-			if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) {
+			if (*((ulong *)(of_flat_tree + image_get_header_size ())) != OF_DT_HEADER) {
 #else
-			if (fdt_check_header(of_flat_tree + sizeof(image_header_t)) != 0) {
+			if (fdt_check_header (of_flat_tree + image_get_header_size ()) != 0) {
 #endif
 				puts ("ERROR: uImage data is not a fdt - "
 					"must RESET the board to recover.\n");
 				do_reset (cmdtp, flag, argc, argv);
 			}
 
-			memmove((void *)ntohl(hdr->ih_load),
-		       		(void *)(of_flat_tree + sizeof(image_header_t)),
-				ntohl(hdr->ih_size));
-			of_flat_tree = (char *)ntohl(hdr->ih_load);
+			memmove ((void *)image_get_load (hdr),
+				(void *)(of_flat_tree + image_get_header_size ()),
+				image_get_data_size (hdr));
+
+			of_flat_tree = (char *)image_get_load (hdr);
 		} else {
 			puts ("Did not find a flat Flat Device Tree.\n"
 				"Must RESET the board to recover.\n");
@@ -814,8 +745,8 @@
 		}
 		printf ("   Booting using the fdt at 0x%x\n",
 				of_flat_tree);
-	} else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1]) && (len_ptr[2])) {
-		u_long tail    = ntohl(len_ptr[0]) % 4;
+	} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1]) && (len_ptr[2])) {
+		u_long tail    = image_to_cpu (len_ptr[0]) % 4;
 		int i;
 
 		/* skip kernel length, initrd length, and terminator */
@@ -824,14 +755,14 @@
 		for (i=2; len_ptr[i]; ++i)
 			of_flat_tree += 4;
 		/* add kernel length, and align */
-		of_flat_tree += ntohl(len_ptr[0]);
+		of_flat_tree += image_to_cpu (len_ptr[0]);
 		if (tail) {
 			of_flat_tree += 4 - tail;
 		}
 
 		/* add initrd length, and align */
-		tail = ntohl(len_ptr[1]) % 4;
-		of_flat_tree += ntohl(len_ptr[1]);
+		tail = image_to_cpu (len_ptr[1]) % 4;
+		of_flat_tree += image_to_cpu (len_ptr[1]);
 		if (tail) {
 			of_flat_tree += 4 - tail;
 		}
@@ -855,10 +786,10 @@
 
 #if defined(CONFIG_OF_FLAT_TREE)
 		if (((struct boot_param_header *)of_flat_tree)->totalsize !=
-			ntohl (len_ptr[2])) {
+			image_to_cpu (len_ptr[2])) {
 #else
 		if (be32_to_cpu (fdt_totalsize (of_flat_tree)) !=
-			ntohl(len_ptr[2])) {
+			image_to_cpu (len_ptr[2])) {
 #endif
 			puts ("ERROR: fdt size != image size - "
 				"must RESET the board to recover.\n");
@@ -1098,7 +1029,7 @@
 	 */
 
 	img_addr = 0;
-	if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1]))
+	if ((image_check_type (hdr, IH_TYPE_MULTI)) && (len_ptr[1]))
 		img_addr = (image_header_t *) addr;
 
 
@@ -1131,7 +1062,7 @@
 		cmdline = "";
 	}
 
-	loader = (void (*)(bd_t *, image_header_t *, char *, char *)) ntohl(hdr->ih_ep);
+	loader = (void (*)(bd_t *, image_header_t *, char *, char *))image_get_ep (hdr);
 
 	printf ("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n",
 		(ulong)loader);
@@ -1234,7 +1165,7 @@
 	}
 	*ss++ = NULL;	/* terminate */
 
-	entry = (void (*)(bd_t *, char *, char **, ulong))ntohl(hdr->ih_ep);
+	entry = (void (*)(bd_t *, char *, char **, ulong))image_get_ep (hdr);
 	(*entry)(kbd, cmdline, fwenv, top);
 }
 #endif
@@ -1288,38 +1219,24 @@
 
 static int image_info (ulong addr)
 {
-	ulong	data, len, checksum;
-	image_header_t *hdr = &header;
+	image_header_t *hdr = (image_header_t *)addr;
 
 	printf ("\n## Checking Image at %08lx ...\n", addr);
 
-	/* Copy header so we can blank CRC field for re-calculation */
-	memmove (&header, (char *)addr, sizeof(image_header_t));
-
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 		puts ("   Bad Magic Number\n");
 		return 1;
 	}
 
-	data = (ulong)&header;
-	len  = sizeof(image_header_t);
-
-	checksum = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-
-	if (crc32 (0, (uchar *)data, len) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("   Bad Header Checksum\n");
 		return 1;
 	}
 
-	/* for multi-file images we need the data part, too */
-	print_image_hdr ((image_header_t *)addr);
-
-	data = addr + sizeof(image_header_t);
-	len  = ntohl(hdr->ih_size);
+	print_image_hdr (hdr);
 
 	puts ("   Verifying Checksum ... ");
-	if (crc32 (0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {
+	if (!image_check_dcrc (hdr)) {
 		puts ("   Bad Data CRC\n");
 		return 1;
 	}
@@ -1347,38 +1264,29 @@
 	flash_info_t *info;
 	int i, j;
 	image_header_t *hdr;
-	ulong data, len, checksum;
 
 	for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) {
 		if (info->flash_id == FLASH_UNKNOWN)
 			goto next_bank;
 		for (j=0; j<info->sector_count; ++j) {
 
-			if (!(hdr=(image_header_t *)info->start[j]) ||
-			    (ntohl(hdr->ih_magic) != IH_MAGIC))
-				goto next_sector;
+			hdr = (image_header_t *)info->start[j];
 
-			/* Copy header so we can blank CRC field for re-calculation */
-			memmove (&header, (char *)hdr, sizeof(image_header_t));
-
-			checksum = ntohl(header.ih_hcrc);
-			header.ih_hcrc = 0;
+			if (!hdr || !image_check_magic (hdr))
+				goto next_sector;
 
-			if (crc32 (0, (uchar *)&header, sizeof(image_header_t))
-			    != checksum)
+			if (!image_check_hcrc (hdr))
 				goto next_sector;
 
 			printf ("Image at %08lX:\n", (ulong)hdr);
-			print_image_hdr( hdr );
-
-			data = (ulong)hdr + sizeof(image_header_t);
-			len  = ntohl(hdr->ih_size);
+			print_image_hdr (hdr);
 
 			puts ("   Verifying Checksum ... ");
-			if (crc32 (0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {
-				puts ("   Bad Data CRC\n");
+			if (!image_check_dcrc (hdr)) {
+				puts ("Bad Data CRC\n");
+			} else {
+				puts ("OK\n");
 			}
-			puts ("OK\n");
 next_sector:		;
 		}
 next_bank:	;
@@ -1400,11 +1308,11 @@
 print_image_hdr (image_header_t *hdr)
 {
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
-	time_t timestamp = (time_t)ntohl(hdr->ih_time);
+	time_t timestamp = (time_t)image_get_time (hdr);
 	struct rtc_time tm;
 #endif
 
-	printf ("   Image Name:   %.*s\n", IH_NMLEN, hdr->ih_name);
+	printf ("   Image Name:   %.*s\n", IH_NMLEN, image_get_name (hdr));
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
 	to_tm (timestamp, &tm);
 	printf ("   Created:      %4d-%02d-%02d  %2d:%02d:%02d UTC\n",
@@ -1412,19 +1320,19 @@
 		tm.tm_hour, tm.tm_min, tm.tm_sec);
 #endif
 	puts ("   Image Type:   "); print_type(hdr);
-	printf ("\n   Data Size:    %d Bytes = ", ntohl(hdr->ih_size));
-	print_size (ntohl(hdr->ih_size), "\n");
+	printf ("\n   Data Size:    %d Bytes = ", image_get_data_size (hdr));
+	print_size (image_get_data_size (hdr), "\n");
 	printf ("   Load Address: %08x\n"
 		"   Entry Point:  %08x\n",
-		 ntohl(hdr->ih_load), ntohl(hdr->ih_ep));
+		 image_get_load (hdr), image_get_ep (hdr));
 
-	if (hdr->ih_type == IH_TYPE_MULTI) {
+	if (image_check_type (hdr, IH_TYPE_MULTI)) {
 		int i;
 		ulong len;
-		ulong *len_ptr = (ulong *)((ulong)hdr + sizeof(image_header_t));
+		ulong *len_ptr = (ulong *)((ulong)hdr + image_get_header_size ());
 
 		puts ("   Contents:\n");
-		for (i=0; (len = ntohl(*len_ptr)); ++i, ++len_ptr) {
+		for (i=0; (len = image_to_cpu (*len_ptr)); ++i, ++len_ptr) {
 			printf ("   Image %d: %8ld Bytes = ", i, len);
 			print_size (len, "\n");
 		}
@@ -1437,7 +1345,7 @@
 {
 	char *os, *arch, *type, *comp;
 
-	switch (hdr->ih_os) {
+	switch (image_get_os (hdr)) {
 	case IH_OS_INVALID:	os = "Invalid OS";		break;
 	case IH_OS_NETBSD:	os = "NetBSD";			break;
 	case IH_OS_LINUX:	os = "Linux";			break;
@@ -1454,29 +1362,29 @@
 	default:		os = "Unknown OS";		break;
 	}
 
-	switch (hdr->ih_arch) {
-	case IH_CPU_INVALID:	arch = "Invalid CPU";		break;
-	case IH_CPU_ALPHA:	arch = "Alpha";			break;
-	case IH_CPU_ARM:	arch = "ARM";			break;
-	case IH_CPU_AVR32:	arch = "AVR32";			break;
-	case IH_CPU_BLACKFIN:	arch = "Blackfin";		break;
-	case IH_CPU_I386:	arch = "Intel x86";		break;
-	case IH_CPU_IA64:	arch = "IA64";			break;
-	case IH_CPU_M68K:	arch = "M68K"; 			break;
-	case IH_CPU_MICROBLAZE:	arch = "Microblaze"; 		break;
-	case IH_CPU_MIPS64:	arch = "MIPS 64 Bit";		break;
-	case IH_CPU_MIPS:	arch = "MIPS";			break;
-	case IH_CPU_NIOS2:	arch = "Nios-II";		break;
-	case IH_CPU_NIOS:	arch = "Nios";			break;
-	case IH_CPU_PPC:	arch = "PowerPC";		break;
-	case IH_CPU_S390:	arch = "IBM S390";		break;
-	case IH_CPU_SH:		arch = "SuperH";		break;
-	case IH_CPU_SPARC64:	arch = "SPARC 64 Bit";		break;
-	case IH_CPU_SPARC:	arch = "SPARC";			break;
+	switch (image_get_arch (hdr)) {
+	case IH_ARCH_INVALID:	arch = "Invalid CPU";		break;
+	case IH_ARCH_ALPHA:	arch = "Alpha";			break;
+	case IH_ARCH_ARM:	arch = "ARM";			break;
+	case IH_ARCH_AVR32:	arch = "AVR32";			break;
+	case IH_ARCH_BLACKFIN:	arch = "Blackfin";		break;
+	case IH_ARCH_I386:	arch = "Intel x86";		break;
+	case IH_ARCH_IA64:	arch = "IA64";			break;
+	case IH_ARCH_M68K:	arch = "M68K"; 			break;
+	case IH_ARCH_MICROBLAZE:arch = "Microblaze"; 		break;
+	case IH_ARCH_MIPS64:	arch = "MIPS 64 Bit";		break;
+	case IH_ARCH_MIPS:	arch = "MIPS";			break;
+	case IH_ARCH_NIOS2:	arch = "Nios-II";		break;
+	case IH_ARCH_NIOS:	arch = "Nios";			break;
+	case IH_ARCH_PPC:	arch = "PowerPC";		break;
+	case IH_ARCH_S390:	arch = "IBM S390";		break;
+	case IH_ARCH_SH:	arch = "SuperH";		break;
+	case IH_ARCH_SPARC64:	arch = "SPARC 64 Bit";		break;
+	case IH_ARCH_SPARC:	arch = "SPARC";			break;
 	default:		arch = "Unknown Architecture";	break;
 	}
 
-	switch (hdr->ih_type) {
+	switch (image_get_type (hdr)) {
 	case IH_TYPE_INVALID:	type = "Invalid Image";		break;
 	case IH_TYPE_STANDALONE:type = "Standalone Program";	break;
 	case IH_TYPE_KERNEL:	type = "Kernel Image";		break;
@@ -1488,7 +1396,7 @@
 	default:		type = "Unknown Image";		break;
 	}
 
-	switch (hdr->ih_comp) {
+	switch (image_get_comp (hdr)) {
 	case IH_COMP_NONE:	comp = "uncompressed";		break;
 	case IH_COMP_GZIP:	comp = "gzip compressed";	break;
 	case IH_COMP_BZIP2:	comp = "bzip2 compressed";	break;
@@ -1594,7 +1502,7 @@
 	image_header_t *hdr = &header;
 	void	(*entry_point)(bd_t *);
 
-	entry_point = (void (*)(bd_t *)) ntohl(hdr->ih_ep);
+	entry_point = (void (*)(bd_t *))image_get_ep (hdr);
 
 	printf ("## Transferring control to RTEMS (at address %08lx) ...\n",
 		(ulong)entry_point);
@@ -1617,7 +1525,7 @@
 	image_header_t *hdr = &header;
 	char str[80];
 
-	sprintf(str, "%x", ntohl(hdr->ih_ep)); /* write entry-point into string */
+	sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */
 	setenv("loadaddr", str);
 	do_bootvx(cmdtp, 0, 0, NULL);
 }
@@ -1630,7 +1538,7 @@
 	char *local_args[2];
 	char str[16];
 
-	sprintf(str, "%x", ntohl(hdr->ih_ep)); /* write entry-point into string */
+	sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */
 	local_args[0] = argv[0];
 	local_args[1] = str;	/* and provide it via the arguments */
 	do_bootelf(cmdtp, 0, 2, local_args);
diff --git a/common/cmd_doc.c b/common/cmd_doc.c
index 3d717c0..b20a2e1 100644
--- a/common/cmd_doc.c
+++ b/common/cmd_doc.c
@@ -263,11 +263,11 @@
 
 	hdr = (image_header_t *)addr;
 
-	if (hdr->ih_magic == IH_MAGIC) {
+	if (image_check_magic (hdr)) {
 
 		print_image_hdr (hdr);
 
-		cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+		cnt = image_get_image_size (hdr);
 		cnt -= SECTORSIZE;
 	} else {
 		puts ("\n** Bad Magic Number **\n");
diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c
index 7349412..3b8f80b 100644
--- a/common/cmd_fdc.c
+++ b/common/cmd_fdc.c
@@ -836,13 +836,13 @@
 		return 1;
 	}
 	hdr = (image_header_t *)addr;
-	if (ntohl(hdr->ih_magic)  != IH_MAGIC) {
+	if (!image_get_magic (hdr)) {
 		printf ("Bad Magic Number\n");
 		return 1;
 	}
-	print_image_hdr(hdr);
+	print_image_hdr (hdr);
 
-	imsize= ntohl(hdr->ih_size)+sizeof(image_header_t);
+	imsize= image_get_image_size (hdr);
 	nrofblk=imsize/512;
 	if((imsize%512)>0)
 		nrofblk++;
@@ -861,7 +861,7 @@
 	/* Loading ok, update default load address */
 
 	load_addr = addr;
-	if(hdr->ih_type  == IH_TYPE_KERNEL) {
+	if(image_check_type (hdr, IH_TYPE_KERNEL)) {
 		/* Check if we should attempt an auto-start */
 		if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
 			char *local_args[2];
diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c
index f55447a..4030d04 100644
--- a/common/cmd_fpga.c
+++ b/common/cmd_fpga.c
@@ -221,13 +221,13 @@
 			image_header_t *hdr = &header;
 			ulong	data;
 
-			memmove (&header, (char *)fpga_data, sizeof(image_header_t));
-			if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+			memmove (&header, (char *)fpga_data, image_get_header_size ());
+			if (!image_check_magic (hdr)) {
 				puts ("Bad Magic Number\n");
 				return 1;
 			}
-			data = ((ulong)fpga_data + sizeof(image_header_t));
-			data_size  = ntohl(hdr->ih_size);
+			data = ((ulong)fpga_data + image_get_header_size ());
+			data_size = image_get_data_size (hdr);
 			rc = fpga_load (dev, (void *)data, data_size);
 		}
 		break;
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index c38be4f..bcd1325 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -366,7 +366,7 @@
 	char *boot_device = NULL;
 	char *ep;
 	int dev, part = 0;
-	ulong addr, cnt, checksum;
+	ulong addr, cnt;
 	disk_partition_t info;
 	image_header_t *hdr;
 	int rcode = 0;
@@ -448,27 +448,23 @@
 
 	hdr = (image_header_t *)addr;
 
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 		printf("\n** Bad Magic Number **\n");
 		show_boot_progress (-49);
 		return 1;
 	}
 	show_boot_progress (49);
 
-	checksum = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-
-	if (crc32 (0, (uchar *)hdr, sizeof(image_header_t)) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("\n** Bad Header Checksum **\n");
 		show_boot_progress (-50);
 		return 1;
 	}
 	show_boot_progress (50);
-	hdr->ih_hcrc = htonl(checksum); /* restore checksum for later use */
 
 	print_image_hdr (hdr);
 
-	cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+	cnt = image_get_image_size (hdr);
 	cnt += info.blksz - 1;
 	cnt /= info.blksz;
 	cnt -= 1;
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 8d6c959..bfa39d7 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -514,16 +514,16 @@
 
 	hdr = (image_header_t *) addr;
 
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
-		printf("\n** Bad Magic Number 0x%x **\n", hdr->ih_magic);
+	if (!image_check_magic (hdr)) {
+		printf("\n** Bad Magic Number 0x%x **\n", image_get_magic (hdr));
 		show_boot_progress (-57);
 		return 1;
 	}
 	show_boot_progress (57);
 
-	print_image_hdr(hdr);
+	print_image_hdr (hdr);
 
-	cnt = (ntohl(hdr->ih_size) + sizeof (image_header_t));
+	cnt = image_get_image_size (hdr);
 	if (jffs2) {
 		nand_read_options_t opts;
 		memset(&opts, 0, sizeof(opts));
@@ -982,14 +982,14 @@
 
 	hdr = (image_header_t *)addr;
 
-	if (ntohl(hdr->ih_magic) == IH_MAGIC) {
+	if (image_check_magic (hdr)) {
 
 		print_image_hdr (hdr);
 
-		cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+		cnt = image_get_image_size (hdr);
 		cnt -= SECTORSIZE;
 	} else {
-		printf ("\n** Bad Magic Number 0x%x **\n", ntohl(hdr->ih_magic));
+		printf ("\n** Bad Magic Number 0x%x **\n", image_get_magic (hdr));
 		show_boot_progress (-57);
 		return 1;
 	}
diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c
index 1cdec15..c2b27a5 100644
--- a/common/cmd_scsi.c
+++ b/common/cmd_scsi.c
@@ -207,7 +207,7 @@
 	char *boot_device = NULL;
 	char *ep;
 	int dev, part = 0;
-	ulong addr, cnt, checksum;
+	ulong addr, cnt;
 	disk_partition_t info;
 	image_header_t *hdr;
 	int rcode = 0;
@@ -275,22 +275,18 @@
 
 	hdr = (image_header_t *)addr;
 
-	if (ntohl(hdr->ih_magic) == IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 		printf("\n** Bad Magic Number **\n");
 		return 1;
 	}
 
-	checksum = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-
-	if (crc32 (0, (uchar *)hdr, sizeof(image_header_t)) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("\n** Bad Header Checksum **\n");
 		return 1;
 	}
-	hdr->ih_hcrc = htonl(checksum);	/* restore checksum for later use */
 
 	print_image_hdr (hdr);
-	cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+	cnt = image_get_image_size (hdr);
 	cnt += info.blksz - 1;
 	cnt /= info.blksz;
 	cnt -= 1;
diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index c6b17c2..db2e754 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -311,7 +311,7 @@
 	char *boot_device = NULL;
 	char *ep;
 	int dev, part=1, rcode;
-	ulong addr, cnt, checksum;
+	ulong addr, cnt;
 	disk_partition_t info;
 	image_header_t *hdr;
 	block_dev_desc_t *stor_dev;
@@ -388,23 +388,19 @@
 
 	hdr = (image_header_t *)addr;
 
-	if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+	if (!image_get_magic (hdr)) {
 		printf("\n** Bad Magic Number **\n");
 		return 1;
 	}
 
-	checksum = ntohl(hdr->ih_hcrc);
-	hdr->ih_hcrc = 0;
-
-	if (crc32 (0, (uchar *)hdr, sizeof(image_header_t)) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		puts ("\n** Bad Header Checksum **\n");
 		return 1;
 	}
-	hdr->ih_hcrc = htonl(checksum);	/* restore checksum for later use */
 
 	print_image_hdr (hdr);
 
-	cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+	cnt = image_get_image_size (hdr);
 	cnt += info.blksz - 1;
 	cnt /= info.blksz;
 	cnt -= 1;
diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c
index 52e0614..ab579cd 100644
--- a/common/cmd_ximg.c
+++ b/common/cmd_ximg.c
@@ -38,14 +38,13 @@
 do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
 	ulong addr = load_addr, dest = 0;
-	ulong data, len, checksum;
+	ulong data, len;
 	ulong *len_ptr;
 	int i, verify, part = 0;
 	char pbuf[10], *s;
-	image_header_t header;
+	image_header_t *hdr;
 
-	s = getenv("verify");
-	verify = (s && (*s == 'n')) ? 0 : 1;
+	verify = getenv_verify ();
 
 	if (argc > 1) {
 		addr = simple_strtoul(argv[1], NULL, 16);
@@ -59,50 +58,41 @@
 
 	printf("## Copying from image at %08lx ...\n", addr);
 
-	/* Copy header so we can blank CRC field for re-calculation */
-	memmove(&header, (char *) addr, sizeof (image_header_t));
+	hdr = (image_header_t *)addr;
 
-	if (ntohl(header.ih_magic) != IH_MAGIC) {
+	if (!image_check_magic (hdr)) {
 		printf("Bad Magic Number\n");
 		return 1;
 	}
 
-	data = (ulong) & header;
-	len = sizeof (image_header_t);
-
-	checksum = ntohl(header.ih_hcrc);
-	header.ih_hcrc = 0;
-
-	if (crc32(0, (char *) data, len) != checksum) {
+	if (!image_check_hcrc (hdr)) {
 		printf("Bad Header Checksum\n");
 		return 1;
 	}
 #ifdef DEBUG
-	print_image_hdr((image_header_t *) addr);
+	print_image_hdr (hdr);
 #endif
 
-	data = addr + sizeof (image_header_t);
-	len = ntohl(header.ih_size);
-
-	if (header.ih_type != IH_TYPE_MULTI) {
+	if (!image_check_type (hdr, IH_TYPE_MULTI)) {
 		printf("Wrong Image Type for %s command\n", cmdtp->name);
 		return 1;
 	}
 
-	if (header.ih_comp != IH_COMP_NONE) {
+	if (image_get_comp (hdr) != IH_COMP_NONE) {
 		printf("Wrong Compression Type for %s command\n", cmdtp->name);
 		return 1;
 	}
 
 	if (verify) {
 		printf("   Verifying Checksum ... ");
-		if (crc32(0, (char *) data, len) != ntohl(header.ih_dcrc)) {
+		if (!image_check_dcrc (hdr)) {
 			printf("Bad Data CRC\n");
 			return 1;
 		}
 		printf("OK\n");
 	}
 
+	data = image_get_data (hdr);
 	len_ptr = (ulong *) data;
 
 	data += 4;		/* terminator */
@@ -110,7 +100,7 @@
 		data += 4;
 		if (argc > 2 && part > i) {
 			u_long tail;
-			len = ntohl(len_ptr[i]);
+			len = image_to_cpu (len_ptr[i]);
 			tail = len % 4;
 			data += len;
 			if (tail) {
@@ -122,7 +112,7 @@
 		printf("Bad Image Part\n");
 		return 1;
 	}
-	len = ntohl(len_ptr[part]);
+	len = image_to_cpu (len_ptr[part]);
 
 	if (argc > 3) {
 		memcpy((char *) dest, (char *) data, len);
diff --git a/common/image.c b/common/image.c
new file mode 100644
index 0000000..7a0a3d2
--- /dev/null
+++ b/common/image.c
@@ -0,0 +1,91 @@
+/*
+ * (C) Copyright 2008 Semihalf
+ *
+ * (C) Copyright 2000-2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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
+ */
+#ifndef USE_HOSTCC
+# include <common.h>
+# include <watchdog.h>
+#else
+# include "mkimage.h"
+#endif
+
+#include <image.h>
+
+unsigned long crc32 (unsigned long, const unsigned char *, unsigned int);
+
+int image_check_hcrc (image_header_t *hdr)
+{
+	ulong hcrc;
+	ulong len = image_get_header_size ();
+	image_header_t header;
+
+	/* Copy header so we can blank CRC field for re-calculation */
+	memmove (&header, (char *)hdr, image_get_header_size ());
+	image_set_hcrc (&header, 0);
+
+	hcrc = crc32 (0, (unsigned char *)&header, len);
+
+	return (hcrc == image_get_hcrc (hdr));
+}
+
+int image_check_dcrc (image_header_t *hdr)
+{
+	ulong data = image_get_data (hdr);
+	ulong len = image_get_data_size (hdr);
+	ulong dcrc = crc32 (0, (unsigned char *)data, len);
+
+	return (dcrc == image_get_dcrc (hdr));
+}
+
+int image_check_dcrc_wd (image_header_t *hdr, ulong chunksz)
+{
+	ulong dcrc = 0;
+	ulong len = image_get_data_size (hdr);
+	ulong data = image_get_data (hdr);
+
+#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
+	ulong cdata = data;
+	ulong edata = cdata + len;
+
+	while (cdata < edata) {
+		ulong chunk = edata - cdata;
+
+		if (chunk > chunksz)
+			chunk = chunksz;
+		dcrc = crc32 (dcrc, (unsigned char *)cdata, chunk);
+		cdata += chunk;
+
+		WATCHDOG_RESET ();
+	}
+#else
+	dcrc = crc32 (0, (unsigned char *)data, len);
+#endif
+
+	return (dcrc == image_get_dcrc (hdr));
+}
+
+int getenv_verify (void)
+{
+	char *s = getenv ("verify");
+	return (s && (*s == 'n')) ? 0 : 1;
+}
diff --git a/common/lynxkdi.c b/common/lynxkdi.c
index 76a271b..16dc968 100644
--- a/common/lynxkdi.c
+++ b/common/lynxkdi.c
@@ -25,10 +25,10 @@
 #if defined(CONFIG_MPC8260) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
 void lynxkdi_boot ( image_header_t *hdr )
 {
-	void (*lynxkdi)(void) = (void(*)(void)) ntohl(hdr->ih_ep);
+	void (*lynxkdi)(void) = (void(*)(void))image_get_ep (hdr);
 	lynxos_bootparms_t *parms = (lynxos_bootparms_t *)0x0020;
 	bd_t *kbd;
-	u32 *psz = (u32 *)(ntohl(hdr->ih_load) + 0x0204);
+	u32 *psz = (u32 *)(image_get_load (hdr) + 0x0204);
 
 	memset( parms, 0, sizeof(*parms));
 	kbd = gd->bd;
@@ -40,9 +40,9 @@
 	/* Do a simple check for Bluecat so we can pass the
 	 * kernel command line parameters.
 	 */
-	if( le32_to_cpu(*psz) == ntohl(hdr->ih_size) ){	/* FIXME: NOT SURE HERE ! */
+	if( le32_to_cpu(*psz) == image_get_data_size (hdr) ){	/* FIXME: NOT SURE HERE ! */
 	    char *args;
-	    char *cmdline = (char *)(ntohl(hdr->ih_load) + 0x020c);
+	    char *cmdline = (char *)(image_get_load (hdr) + 0x020c);
 	    int len;
 
 	    printf("Booting Bluecat KDI ...\n");