mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/5] image: factorise string helper
@ 2010-09-23 10:14 Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 2/5] image: rename IH_CPU to IH_ARCH to be more concistant Jean-Christophe PLAGNIOL-VILLARD
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-09-23 10:14 UTC (permalink / raw)
  To: barebox

before we duplicate it between common/bootm.c and scripts/mkimage.c

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 commands/bootm.c  |   93 ++-----------------------------------
 common/Makefile   |    1 +
 common/image.c    |  134 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/image.h   |   27 +++++++++++
 scripts/mkimage.c |  122 +++---------------------------------------------
 5 files changed, 175 insertions(+), 202 deletions(-)
 create mode 100644 common/image.c

diff --git a/commands/bootm.c b/commands/bootm.c
index 11325dc..aa83566 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -95,92 +95,6 @@ fixup_silent_linux ()
 }
 #endif /* CONFIG_SILENT_CONSOLE */
 
-#ifdef CONFIG_CMD_BOOTM_SHOW_TYPE
-static const char *image_os(image_header_t *hdr)
-{
-	char *os;
-
-	switch (hdr->ih_os) {
-	case IH_OS_INVALID:	os = "Invalid OS";		break;
-	case IH_OS_NETBSD:	os = "NetBSD";			break;
-	case IH_OS_LINUX:	os = "Linux";			break;
-	case IH_OS_VXWORKS:	os = "VxWorks";			break;
-	case IH_OS_QNX:		os = "QNX";			break;
-	case IH_OS_BAREBOX:	os = "barebox";			break;
-	case IH_OS_RTEMS:	os = "RTEMS";			break;
-#ifdef CONFIG_ARTOS
-	case IH_OS_ARTOS:	os = "ARTOS";			break;
-#endif
-#ifdef CONFIG_LYNXKDI
-	case IH_OS_LYNXOS:	os = "LynxOS";			break;
-#endif
-	default:		os = "Unknown OS";		break;
-	}
-
-	return os;
-}
-
-static const char *image_arch(image_header_t *hdr)
-{
-	char *arch;
-
-	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_I386:	arch = "Intel x86";		break;
-	case IH_CPU_IA64:	arch = "IA64";			break;
-	case IH_CPU_MIPS:	arch = "MIPS";			break;
-	case IH_CPU_MIPS64:	arch = "MIPS 64 Bit";		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_SPARC:	arch = "SPARC";			break;
-	case IH_CPU_SPARC64:	arch = "SPARC 64 Bit";		break;
-	case IH_CPU_M68K:	arch = "M68K"; 			break;
-	case IH_CPU_MICROBLAZE:	arch = "Microblaze"; 		break;
-	case IH_CPU_NIOS:	arch = "Nios";			break;
-	case IH_CPU_NIOS2:	arch = "Nios-II";		break;
-	default:		arch = "Unknown Architecture";	break;
-	}
-
-	return arch;
-}
-
-static const char *image_type(image_header_t *hdr)
-{
-	char *type;
-
-	switch (hdr->ih_type) {
-	case IH_TYPE_INVALID:	type = "Invalid Image";		break;
-	case IH_TYPE_STANDALONE:type = "Standalone Program";	break;
-	case IH_TYPE_KERNEL:	type = "Kernel Image";		break;
-	case IH_TYPE_RAMDISK:	type = "RAMDisk Image";		break;
-	case IH_TYPE_MULTI:	type = "Multi-File Image";	break;
-	case IH_TYPE_FIRMWARE:	type = "Firmware";		break;
-	case IH_TYPE_SCRIPT:	type = "Script";		break;
-	case IH_TYPE_FLATDT:	type = "Flat Device Tree";	break;
-	default:		type = "Unknown Image";		break;
-	}
-	return type;
-}
-
-static const char *image_compression(image_header_t *hdr)
-{
-	char *comp;
-
-	switch (hdr->ih_comp) {
-	case IH_COMP_NONE:	comp = "uncompressed";		break;
-	case IH_COMP_GZIP:	comp = "gzip compressed";	break;
-	case IH_COMP_BZIP2:	comp = "bzip2 compressed";	break;
-	default:		comp = "unknown compression";	break;
-	}
-
-	return comp;
-}
-#endif
-
 int relocate_image(struct image_handle *handle, void *load_address)
 {
 	image_header_t *hdr = &handle->header;
@@ -549,8 +463,11 @@ print_image_hdr (image_header_t *hdr)
 		tm.tm_hour, tm.tm_min, tm.tm_sec);
 #endif	/* CONFIG_CMD_DATE, CONFIG_TIMESTAMP */
 #ifdef CONFIG_CMD_BOOTM_SHOW_TYPE
-	printf ("   Image Type:   %s %s %s (%s)\n", image_arch(hdr), image_os(hdr),
-			image_type(hdr), image_compression(hdr));
+	printf ("   Image Type:   %s %s %s (%s)\n",
+			image_get_arch_name(hdr->ih_arch),
+			image_get_os_name(hdr->ih_os),
+			image_get_type_name(hdr->ih_type),
+			image_get_comp_name(hdr->ih_comp));
 #endif
 	printf ("   Data Size:    %d Bytes = %s\n"
 		"   Load Address: %08x\n"
diff --git a/common/Makefile b/common/Makefile
index 6ca3d98..94b1387 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_CONSOLE_FULL) += console.o
 obj-$(CONFIG_CONSOLE_SIMPLE) += console_simple.o
 obj-$(CONFIG_DIGEST) += digest.o
 obj-y += env.o
+obj-$(CONFIG_CMD_BOOTM_SHOW_TYPE) += image.o
 obj-y += startup.o
 obj-y += misc.o
 obj-y += memsize.o
diff --git a/common/image.c b/common/image.c
new file mode 100644
index 0000000..e6ab26b
--- /dev/null
+++ b/common/image.c
@@ -0,0 +1,134 @@
+/*
+ * (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
+ */
+
+#ifdef __BAREBOX__
+#include <image.h>
+#endif
+
+typedef struct table_entry {
+	int	id;		/* as defined in image.h	*/
+	char	*sname;		/* short (input) name		*/
+	char	*lname;		/* long (output) name		*/
+} table_entry_t;
+
+static 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,			"",		"",		},
+};
+
+static table_entry_t os_name[] = {
+	{ IH_OS_INVALID,	NULL,		"Invalid OS",	},
+#ifndef __BAREBOX__
+	{ 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",		},
+#endif
+	{ IH_OS_LINUX,		"linux",	"Linux",	},
+#ifndef __BAREBOX__
+	{ 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",		},
+#endif
+	{ IH_OS_BAREBOX,	"barebox",	"barebox",	},
+#ifndef __BAREBOX__
+	{ IH_OS_VXWORKS,	"vxworks",	"VxWorks",	},
+#endif
+	{ -1,			"",		"",		},
+};
+
+static 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,			"",		"",			},
+};
+
+static table_entry_t comp_name[] = {
+	{ IH_COMP_NONE,		"none",		"uncompressed",		},
+	{ IH_COMP_BZIP2,	"bzip2",	"bzip2 compressed",	},
+	{ IH_COMP_GZIP,		"gzip",		"gzip compressed",	},
+	{ -1,			"",		"",			},
+};
+
+static char *get_table_entry_name(table_entry_t *table, char *msg, int id)
+{
+	for (; table->id >= 0; ++table) {
+		if (table->id == id)
+			return table->lname;
+	}
+
+	return msg;
+}
+
+const char *image_get_os_name(uint8_t os)
+{
+	return get_table_entry_name(os_name, "Unknown OS", os);
+}
+
+const char *image_get_arch_name(uint8_t arch)
+{
+	return get_table_entry_name(arch_name, "Unknown Architecture", arch);
+}
+
+const char *image_get_type_name(uint8_t type)
+{
+	return get_table_entry_name(type_name, "Unknown Image", type);
+}
+
+const char *image_get_comp_name(uint8_t comp)
+{
+	return get_table_entry_name(comp_name, "Unknown Compression", comp);
+}
diff --git a/include/image.h b/include/image.h
index 13d0303..6bc8027 100644
--- a/include/image.h
+++ b/include/image.h
@@ -187,6 +187,33 @@ struct image_handle {
 	int flags;
 };
 
+#if defined(CONFIG_CMD_BOOTM_SHOW_TYPE) || !defined(__BAREBOX__)
+const char *image_get_os_name(uint8_t os);
+const char *image_get_arch_name(uint8_t arch);
+const char *image_get_type_name(uint8_t type);
+const char *image_get_comp_name(uint8_t comp);
+#else
+static inline const char *image_get_os_name(uint8_t os)
+{
+	return NULL;
+}
+
+static inline const char *image_get_arch_name(uint8_t arch)
+{
+	return NULL;
+}
+
+static inline const char *image_get_type_name(uint8_t type)
+{
+	return NULL;
+}
+
+static inline const char *image_get_comp_name(uint8_t comp)
+{
+	return NULL;
+}
+#endif
+
 /* commamds/bootm.c */
 void	print_image_hdr (image_header_t *hdr);
 
diff --git a/scripts/mkimage.c b/scripts/mkimage.c
index 240c5cf..0e5ec1e 100644
--- a/scripts/mkimage.c
+++ b/scripts/mkimage.c
@@ -59,6 +59,7 @@ typedef		unsigned int	uint32_t;
 #endif
 
 #include "../include/image.h"
+#include "../common/image.c"
 
 #ifndef MAP_FAILED
 #define MAP_FAILED (-1)
@@ -71,87 +72,10 @@ 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_BAREBOX,	"barebox",	"barebox",		},
-    {	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 *);
@@ -672,40 +596,10 @@ 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));
-}
-
-static char *put_os (int os)
-{
-	return (put_table_entry(os_name, "Unknown OS", os));
-}
-
-static char *put_type (int type)
-{
-	return (put_table_entry(type_name, "Unknown Image", type));
-}
-
-static char *put_comp (int comp)
-{
-	return (put_table_entry(comp_name, "Unknown Compression", comp));
-}
-
-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);
-	}
-	return (msg);
+		image_get_arch_name(hdr->ih_arch),
+		image_get_os_name(hdr->ih_os),
+		image_get_type_name(hdr->ih_type),
+		image_get_comp_name(hdr->ih_comp));
 }
 
 static int get_arch(char *name)
@@ -736,12 +630,12 @@ static int get_table_entry (table_entry_t *table, char *msg, char *name)
 	table_entry_t *t;
 	int first = 1;
 
-	for (t=table; t->val>=0; ++t) {
+	for (t=table; t->id>=0; ++t) {
 		if (t->sname && strcasecmp(t->sname, name)==0)
-			return (t->val);
+			return (t->id);
 	}
 	fprintf (stderr, "\nInvalid %s Type - valid names are", msg);
-	for (t=table; t->val>=0; ++t) {
+	for (t=table; t->id>=0; ++t) {
 		if (t->sname == NULL)
 			continue;
 		fprintf (stderr, "%c %s", (first) ? ':' : ',', t->sname);
-- 
1.7.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/5] image: rename IH_CPU to IH_ARCH to be more concistant
  2010-09-23 10:14 [PATCH 1/5] image: factorise string helper Jean-Christophe PLAGNIOL-VILLARD
@ 2010-09-23 10:14 ` Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 3/5] host: introduce compiler.h to handle host include Jean-Christophe PLAGNIOL-VILLARD
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-09-23 10:14 UTC (permalink / raw)
  To: barebox

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 commands/bootm.c  |    2 +-
 common/image.c    |   36 +++++++++++++++++-----------------
 include/image.h   |   56 ++++++++++++++++++++++++++--------------------------
 scripts/mkimage.c |    2 +-
 4 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/commands/bootm.c b/commands/bootm.c
index aa83566..98de2e9 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -330,7 +330,7 @@ static int do_bootm(struct command *cmdtp, int argc, char *argv[])
 
 	os_header = &os_handle->header;
 
-	if (os_header->ih_arch != IH_CPU)	{
+	if (os_header->ih_arch != IH_ARCH)	{
 		printf ("Unsupported Architecture 0x%x\n", os_header->ih_arch);
 		goto err_out;
 	}
diff --git a/common/image.c b/common/image.c
index e6ab26b..75346f5 100644
--- a/common/image.c
+++ b/common/image.c
@@ -32,24 +32,24 @@ typedef struct table_entry {
 } table_entry_t;
 
 static 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",	},
+	{ IH_ARCH_INVALID,	NULL,		"Invalid CPU",	},
+	{ IH_ARCH_ALPHA,	"alpha",	"Alpha",	},
+	{ IH_ARCH_ARM,		"arm",		"ARM",		},
+	{ IH_ARCH_I386,		"x86",		"Intel x86",	},
+	{ IH_ARCH_IA64,		"ia64",		"IA64",		},
+	{ IH_ARCH_M68K,		"m68k",		"MC68000",	},
+	{ IH_ARCH_MICROBLAZE,	"microblaze",	"MicroBlaze",	},
+	{ IH_ARCH_MIPS,		"mips",		"MIPS",		},
+	{ IH_ARCH_MIPS64,	"mips64",	"MIPS 64 Bit",	},
+	{ IH_ARCH_NIOS,		"nios",		"NIOS",		},
+	{ IH_ARCH_NIOS2,	"nios2",	"NIOS II",	},
+	{ IH_ARCH_PPC,		"ppc",		"PowerPC",	},
+	{ IH_ARCH_S390,		"s390",		"IBM S390",	},
+	{ IH_ARCH_SH,		"sh",		"SuperH",	},
+	{ IH_ARCH_SPARC,	"sparc",	"SPARC",	},
+	{ IH_ARCH_SPARC64,	"sparc64",	"SPARC 64 Bit",	},
+	{ IH_ARCH_BLACKFIN,	"blackfin",	"Blackfin",	},
+	{ IH_ARCH_AVR32,	"avr32",	"AVR32",	},
 	{ -1,			"",		"",		},
 };
 
diff --git a/include/image.h b/include/image.h
index 6bc8027..185ba64 100644
--- a/include/image.h
+++ b/include/image.h
@@ -61,45 +61,45 @@
 /*
  * CPU Architecture Codes (supported by Linux)
  */
-#define IH_CPU_INVALID		0	/* Invalid CPU	*/
-#define IH_CPU_ALPHA		1	/* Alpha	*/
-#define IH_CPU_ARM		2	/* ARM		*/
-#define IH_CPU_I386		3	/* Intel x86	*/
-#define IH_CPU_IA64		4	/* IA64		*/
-#define IH_CPU_MIPS		5	/* MIPS		*/
-#define IH_CPU_MIPS64		6	/* MIPS	 64 Bit */
-#define IH_CPU_PPC		7	/* PowerPC	*/
-#define IH_CPU_S390		8	/* IBM S390	*/
-#define IH_CPU_SH		9	/* SuperH	*/
-#define IH_CPU_SPARC		10	/* Sparc	*/
-#define IH_CPU_SPARC64		11	/* Sparc 64 Bit */
-#define IH_CPU_M68K		12	/* M68K		*/
-#define IH_CPU_NIOS		13	/* Nios-32	*/
-#define IH_CPU_MICROBLAZE	14	/* MicroBlaze   */
-#define IH_CPU_NIOS2		15	/* Nios-II	*/
-#define IH_CPU_BLACKFIN		16	/* Blackfin	*/
-#define IH_CPU_AVR32		17	/* AVR32	*/
+#define IH_ARCH_INVALID		0	/* Invalid CPU	*/
+#define IH_ARCH_ALPHA		1	/* Alpha	*/
+#define IH_ARCH_ARM		2	/* ARM		*/
+#define IH_ARCH_I386		3	/* Intel x86	*/
+#define IH_ARCH_IA64		4	/* IA64		*/
+#define IH_ARCH_MIPS		5	/* MIPS		*/
+#define IH_ARCH_MIPS64		6	/* MIPS	 64 Bit */
+#define IH_ARCH_PPC		7	/* PowerPC	*/
+#define IH_ARCH_S390		8	/* IBM S390	*/
+#define IH_ARCH_SH		9	/* SuperH	*/
+#define IH_ARCH_SPARC		10	/* Sparc	*/
+#define IH_ARCH_SPARC64		11	/* Sparc 64 Bit */
+#define IH_ARCH_M68K		12	/* M68K		*/
+#define IH_ARCH_NIOS		13	/* Nios-32	*/
+#define IH_ARCH_MICROBLAZE	14	/* MicroBlaze	*/
+#define IH_ARCH_NIOS2		15	/* Nios-II	*/
+#define IH_ARCH_BLACKFIN	16	/* Blackfin	*/
+#define IH_ARCH_AVR32		17	/* AVR32	*/
 
 #if defined(__PPC__)
-#define IH_CPU IH_CPU_PPC
+#define IH_ARCH IH_ARCH_PPC
 #elif defined(__ARM__)
-#define IH_CPU IH_CPU_ARM
+#define IH_ARCH IH_ARCH_ARM
 #elif defined(__I386__) || defined(__x86_64__)
-#define IH_CPU IH_CPU_I386
+#define IH_ARCH IH_ARCH_I386
 #elif defined(__mips__)
-#define IH_CPU IH_CPU_MIPS
+#define IH_ARCH IH_ARCH_MIPS
 #elif defined(__nios__)
-#define IH_CPU IH_CPU_NIOS
+#define IH_ARCH IH_ARCH_NIOS
 #elif defined(__M68K__)
-#define IH_CPU IH_CPU_M68K
+#define IH_ARCH IH_ARCH_M68K
 #elif defined(__microblaze__)
-#define IH_CPU IH_CPU_MICROBLAZE
+#define IH_ARCH IH_ARCH_MICROBLAZE
 #elif defined(__nios2__)
-#define IH_CPU IH_CPU_NIOS2
+#define IH_ARCH IH_ARCH_NIOS2
 #elif defined(__blackfin__)
-#define IH_CPU IH_CPU_BLACKFIN
+#define IH_ARCH IH_ARCH_BLACKFIN
 #elif defined(__avr32__)
-#define IH_CPU IH_CPU_AVR32
+#define IH_ARCH IH_ARCH_AVR32
 #endif
 
 /*
diff --git a/scripts/mkimage.c b/scripts/mkimage.c
index 0e5ec1e..15812e5 100644
--- a/scripts/mkimage.c
+++ b/scripts/mkimage.c
@@ -92,7 +92,7 @@ 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;
 
-- 
1.7.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/5] host: introduce compiler.h to handle host include
  2010-09-23 10:14 [PATCH 1/5] image: factorise string helper Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 2/5] image: rename IH_CPU to IH_ARCH to be more concistant Jean-Christophe PLAGNIOL-VILLARD
@ 2010-09-23 10:14 ` Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 4/5] image: Replace direct header access with the API routines Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 5/5] image: factorise image printing contents Jean-Christophe PLAGNIOL-VILLARD
  3 siblings, 0 replies; 5+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-09-23 10:14 UTC (permalink / raw)
  To: barebox

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 scripts/compiler.h |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 scripts/mkimage.c  |   38 +------------------
 2 files changed, 108 insertions(+), 37 deletions(-)
 create mode 100644 scripts/compiler.h

diff --git a/scripts/compiler.h b/scripts/compiler.h
new file mode 100644
index 0000000..f4b1432
--- /dev/null
+++ b/scripts/compiler.h
@@ -0,0 +1,107 @@
+/*
+ * Keep all the ugly #ifdef for system stuff here
+ */
+
+#ifndef __COMPILER_H__
+#define __COMPILER_H__
+
+#include <stddef.h>
+
+#if defined(__BEOS__)	 || \
+    defined(__NetBSD__)  || \
+    defined(__FreeBSD__) || \
+    defined(__sun__)	 || \
+    defined(__APPLE__)
+# include <inttypes.h>
+#elif defined(__linux__) || defined(__WIN32__) || defined(__MINGW32__)
+# include <stdint.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#if !defined(__WIN32__) && !defined(__MINGW32__)
+#include <sys/mman.h>
+#include <netinet/in.h>		/* for host / network byte order conversions	*/
+#endif
+
+/* Not all systems (like Windows) has this define, and yes
+ * we do replace/emulate mmap() on those systems ...
+ */
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void *)-1)
+#endif
+
+#include <fcntl.h>
+#ifndef O_BINARY		/* should be define'd on __WIN32__ */
+#define O_BINARY	0
+#endif
+
+#ifdef __linux__
+# include <endian.h>
+# include <byteswap.h>
+#elif defined(__MACH__)
+# include <machine/endian.h>
+typedef unsigned long ulong;
+typedef unsigned int  uint;
+#endif
+
+typedef uint8_t __u8;
+typedef uint16_t __u16;
+typedef uint32_t __u32;
+
+#define uswap_16(x) \
+	((((x) & 0xff00) >> 8) | \
+	 (((x) & 0x00ff) << 8))
+#define uswap_32(x) \
+	((((x) & 0xff000000) >> 24) | \
+	 (((x) & 0x00ff0000) >>  8) | \
+	 (((x) & 0x0000ff00) <<  8) | \
+	 (((x) & 0x000000ff) << 24))
+#define _uswap_64(x, sfx) \
+	((((x) & 0xff00000000000000##sfx) >> 56) | \
+	 (((x) & 0x00ff000000000000##sfx) >> 40) | \
+	 (((x) & 0x0000ff0000000000##sfx) >> 24) | \
+	 (((x) & 0x000000ff00000000##sfx) >>  8) | \
+	 (((x) & 0x00000000ff000000##sfx) <<  8) | \
+	 (((x) & 0x0000000000ff0000##sfx) << 24) | \
+	 (((x) & 0x000000000000ff00##sfx) << 40) | \
+	 (((x) & 0x00000000000000ff##sfx) << 56))
+#if defined(__GNUC__)
+# define uswap_64(x) _uswap_64(x, ull)
+#else
+# define uswap_64(x) _uswap_64(x, )
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define cpu_to_le16(x)		(x)
+# define cpu_to_le32(x)		(x)
+# define cpu_to_le64(x)		(x)
+# define le16_to_cpu(x)		(x)
+# define le32_to_cpu(x)		(x)
+# define le64_to_cpu(x)		(x)
+# define cpu_to_be16(x)		uswap_16(x)
+# define cpu_to_be32(x)		uswap_32(x)
+# define cpu_to_be64(x)		uswap_64(x)
+# define be16_to_cpu(x)		uswap_16(x)
+# define be32_to_cpu(x)		uswap_32(x)
+# define be64_to_cpu(x)		uswap_64(x)
+#else
+# define cpu_to_le16(x)		uswap_16(x)
+# define cpu_to_le32(x)		uswap_32(x)
+# define cpu_to_le64(x)		uswap_64(x)
+# define le16_to_cpu(x)		uswap_16(x)
+# define le32_to_cpu(x)		uswap_32(x)
+# define le64_to_cpu(x)		uswap_64(x)
+# define cpu_to_be16(x)		(x)
+# define cpu_to_be32(x)		(x)
+# define cpu_to_be64(x)		(x)
+# define be16_to_cpu(x)		(x)
+# define be32_to_cpu(x)		(x)
+# define be64_to_cpu(x)		(x)
+#endif
+
+#endif
diff --git a/scripts/mkimage.c b/scripts/mkimage.c
index 15812e5..8abd3ac 100644
--- a/scripts/mkimage.c
+++ b/scripts/mkimage.c
@@ -20,51 +20,15 @@
  * 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 "compiler.h"
 
 #include "../include/image.h"
 #include "../common/image.c"
 
-#ifndef MAP_FAILED
-#define MAP_FAILED (-1)
-#endif
-
 char *cmdname;
 
 #include "../include/zlib.h"
-- 
1.7.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 4/5] image: Replace direct header access with the API routines
  2010-09-23 10:14 [PATCH 1/5] image: factorise string helper Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 2/5] image: rename IH_CPU to IH_ARCH to be more concistant Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 3/5] host: introduce compiler.h to handle host include Jean-Christophe PLAGNIOL-VILLARD
@ 2010-09-23 10:14 ` Jean-Christophe PLAGNIOL-VILLARD
  2010-09-23 10:14 ` [PATCH 5/5] image: factorise image printing contents Jean-Christophe PLAGNIOL-VILLARD
  3 siblings, 0 replies; 5+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-09-23 10:14 UTC (permalink / raw)
  To: barebox

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 arch/arm/lib/armlinux.c            |    6 +-
 arch/blackfin/lib/blackfin_linux.c |    4 +-
 arch/m68k/lib/m68k-linuxboot.c     |    8 +-
 arch/ppc/lib/ppclinux.c            |    6 +-
 commands/bootm.c                   |   79 +++++++++--------
 include/image.h                    |  161 ++++++++++++++++++++++++++++++++++++
 scripts/mkimage.c                  |   85 ++++++++++---------
 7 files changed, 259 insertions(+), 90 deletions(-)

diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index b50d535..7c2cbf9 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -212,7 +212,7 @@ int do_bootm_linux(struct image_data *data)
 	void (*theKernel)(int zero, int arch, void *params);
 	image_header_t *os_header = &data->os->header;
 
-	if (os_header->ih_type == IH_TYPE_MULTI) {
+	if (image_check_type(os_header, IH_TYPE_MULTI)) {
 		printf("Multifile images not handled at the moment\n");
 		return -1;
 	}
@@ -227,14 +227,14 @@ int do_bootm_linux(struct image_data *data)
 		return -1;
 	}
 
-	theKernel = (void *)ntohl(os_header->ih_ep);
+	theKernel = (void *)image_get_ep(os_header);
 
 	debug("## Transferring control to Linux (at address 0x%p) ...\n",
 	       theKernel);
 
 	setup_tags();
 
-	if (relocate_image(data->os, (void *)ntohl(os_header->ih_load)))
+	if (relocate_image(data->os, (void *)image_get_load(os_header)))
 		return -1;
 
 	/* we assume that the kernel is in place */
diff --git a/arch/blackfin/lib/blackfin_linux.c b/arch/blackfin/lib/blackfin_linux.c
index ce5f3a5..eda3f4c 100644
--- a/arch/blackfin/lib/blackfin_linux.c
+++ b/arch/blackfin/lib/blackfin_linux.c
@@ -47,10 +47,10 @@ static int do_bootm_linux(struct image_data *idata)
 	struct image_handle *os_handle = idata->os;
 	image_header_t *os_header = &os_handle->header;
 
-	appl = (int (*)(char *))ntohl(os_header->ih_ep);
+	appl = (int (*)(char *))image_get_ep(os_header);
 	printf("Starting Kernel at 0x%08x\n", appl);
 
-	if (relocate_image(os_handle, (void *)ntohl(os_header->ih_load)))
+	if (relocate_image(os_handle, (void *)image_get_load(os_header)))
 		return -1;
 
 	icache_disable();
diff --git a/arch/m68k/lib/m68k-linuxboot.c b/arch/m68k/lib/m68k-linuxboot.c
index 417a8e0..e5e90a8 100644
--- a/arch/m68k/lib/m68k-linuxboot.c
+++ b/arch/m68k/lib/m68k-linuxboot.c
@@ -109,20 +109,20 @@ static int do_bootm_linux(struct image_data *data)
 	const char *commandline = getenv ("bootargs");
 	uint32_t loadaddr,loadsize;
 
-	if (os_header->ih_type == IH_TYPE_MULTI) {
+	if (image_check_type(os_header, IH_TYPE_MULTI)) {
 		printf("Multifile images not handled at the moment\n");
 		return -1;
 	}
 
 	printf("commandline: %s\n", commandline);
 
-	theKernel = (void (*)(int,int,uint))ntohl((os_header->ih_ep));
+	theKernel = (void (*)(int,int,uint))image_get_ep(os_header);
 
 	debug ("## Transferring control to Linux (at address %08lx) ...\n",
 	       (ulong) theKernel);
 
-	loadaddr = (uint32_t)ntohl(os_header->ih_load);
-	loadsize = (uint32_t)ntohl(os_header->ih_size);
+	loadaddr = (uint32_t)image_get_load(os_header);
+	loadsize = (uint32_t)image_get_size(os_header);
 	setup_boot_record( (char*)(loadaddr+loadsize),(char*)commandline);
 
 	if (relocate_image(data->os, (void *)loadaddr))
diff --git a/arch/ppc/lib/ppclinux.c b/arch/ppc/lib/ppclinux.c
index 35a9d31..5ee908d 100644
--- a/arch/ppc/lib/ppclinux.c
+++ b/arch/ppc/lib/ppclinux.c
@@ -45,7 +45,7 @@ static int do_bootm_linux(struct image_data *idata)
 	printf("entering %s: os_header: %p initrd_header: %p oftree: %s\n",
 			__FUNCTION__, os_header, initrd_header, idata->oftree);
 
-	if (os_header->ih_type == IH_TYPE_MULTI) {
+	if (image_check_type(os_header, IH_TYPE_MULTI)) {
 		unsigned long *data = (unsigned long *)(idata->os->data);
 		unsigned long len1 = 0, len2 = 0;
 
@@ -199,9 +199,9 @@ static int do_bootm_linux(struct image_data *idata)
 #endif /* CONFIG_MPC5xxx */
 	}
 
-	kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ntohl(os_header->ih_ep); /* FIXME */
+	kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))image_get_ep(os_header); /* FIXME */
 
-	if (relocate_image(idata->os, (void *)ntohl(os_header->ih_load)))
+	if (relocate_image(idata->os, (void *)image_get_load(os_header)))
 		return -1;
 
 #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
diff --git a/commands/bootm.c b/commands/bootm.c
index 98de2e9..98047cd 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -98,19 +98,19 @@ fixup_silent_linux ()
 int relocate_image(struct image_handle *handle, void *load_address)
 {
 	image_header_t *hdr = &handle->header;
-	unsigned long len  = ntohl(hdr->ih_size);
+	unsigned long len  = image_get_size(hdr);
 	unsigned long data = (unsigned long)(handle->data);
 
 #if defined CONFIG_CMD_BOOTM_ZLIB || defined CONFIG_CMD_BOOTM_BZLIB
 	uint	unc_len = CFG_BOOTM_LEN;
 #endif
 
-	switch (hdr->ih_comp) {
+	switch (image_get_comp(hdr)) {
 	case IH_COMP_NONE:
-		if(ntohl(hdr->ih_load) == data) {
+		if(image_get_load(hdr) == data) {
 			printf ("   XIP ... ");
 		} else {
-			memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
+			memmove ((void *) image_get_load(hdr), (uchar *)data, len);
 		}
 		break;
 #ifdef CONFIG_CMD_BOOTM_ZLIB
@@ -137,7 +137,8 @@ int relocate_image(struct image_handle *handle, void *load_address)
 		break;
 #endif
 	default:
-		printf ("Unimplemented compression type %d\n", hdr->ih_comp);
+		printf("Unimplemented compression type %d\n",
+		       image_get_comp(hdr));
 		return -1;
 	}
 
@@ -161,24 +162,24 @@ struct image_handle *map_image(const char *filename, int verify)
 	handle = xzalloc(sizeof(struct image_handle));
 	header = &handle->header;
 
-	if (read(fd, header, sizeof(image_header_t)) < 0) {
+	if (read(fd, header, image_get_header_size()) < 0) {
 		printf("could not read: %s\n", errno_str());
 		goto err_out;
 	}
 
-	if (ntohl(header->ih_magic) != IH_MAGIC) {
+	if (image_check_magic(header)) {
 		puts ("Bad Magic Number\n");
 		goto err_out;
 	}
 
-	checksum = ntohl(header->ih_hcrc);
+	checksum = image_get_hcrc(header);
 	header->ih_hcrc = 0;
 
-	if (crc32 (0, (uchar *)header, sizeof(image_header_t)) != checksum) {
+	if (crc32 (0, (uchar *)header, image_get_header_size()) != checksum) {
 		puts ("Bad Header Checksum\n");
 		goto err_out;
 	}
-	len  = ntohl(header->ih_size);
+	len  = image_get_size(header);
 
 	handle->data = memmap(fd, PROT_READ);
 	if (handle->data == (void *)-1) {
@@ -189,12 +190,13 @@ struct image_handle *map_image(const char *filename, int verify)
 			goto err_out;
 		}
 	} else {
-		handle->data = (void *)((unsigned long)handle->data + sizeof(image_header_t));
+		handle->data = (void *)((unsigned long)handle->data +
+						       image_get_header_size());
 	}
 
 	if (verify) {
 		puts ("   Verifying Checksum ... ");
-		if (crc32 (0, handle->data, len) != ntohl(header->ih_dcrc)) {
+		if (crc32 (0, handle->data, len) != image_get_dcrc(header)) {
 			printf ("Bad Data CRC\n");
 			goto err_out;
 		}
@@ -330,8 +332,9 @@ static int do_bootm(struct command *cmdtp, int argc, char *argv[])
 
 	os_header = &os_handle->header;
 
-	if (os_header->ih_arch != IH_ARCH)	{
-		printf ("Unsupported Architecture 0x%x\n", os_header->ih_arch);
+	if (image_check_arch(os_header, IH_ARCH)) {
+		printf("Unsupported Architecture 0x%x\n",
+		       image_get_arch(os_header));
 		goto err_out;
 	}
 
@@ -347,14 +350,15 @@ static int do_bootm(struct command *cmdtp, int argc, char *argv[])
 
 	/* loop through the registered handlers */
 	list_for_each_entry(handler, &handler_list, list) {
-		if (handler->image_type == os_header->ih_os) {
+		if (image_check_os(os_header, handler->image_type)) {
 			handler->bootm(&data);
 			printf("handler returned!\n");
 			goto err_out;
 		}
 	}
 
-	printf("no image handler found for image type %d\n", os_header->ih_os);
+	printf("no image handler found for image type %d\n",
+	       image_get_os(os_header));
 
 err_out:
 	if (os_handle)
@@ -403,17 +407,17 @@ static int image_info (ulong 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));
+	memmove (&header, (char *)addr, image_get_header_size());
 
-	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);
+	len  = image_get_header_size();
 
-	checksum = ntohl(hdr->ih_hcrc);
+	checksum = image_get_hcrc(hdr);
 	hdr->ih_hcrc = 0;
 
 	if (crc32 (0, (uchar *)data, len) != checksum) {
@@ -424,11 +428,11 @@ static int image_info (ulong addr)
 	/* 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);
+	data = addr + image_get_header_size();
+	len  = image_get_size(hdr);
 
 	puts ("   Verifying Checksum ... ");
-	if (crc32 (0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) {
+	if (crc32 (0, (uchar *)data, len) != image_get_dcrc(hdr)) {
 		puts ("   Bad Data CRC\n");
 		return 1;
 	}
@@ -451,11 +455,11 @@ void
 print_image_hdr (image_header_t *hdr)
 {
 #if defined(CONFIG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
-	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_CMD_DATE) || defined(CONFIG_TIMESTAMP)
 	to_tm (timestamp, &tm);
 	printf ("   Created:      %4d-%02d-%02d  %2d:%02d:%02d UTC\n",
@@ -464,26 +468,27 @@ print_image_hdr (image_header_t *hdr)
 #endif	/* CONFIG_CMD_DATE, CONFIG_TIMESTAMP */
 #ifdef CONFIG_CMD_BOOTM_SHOW_TYPE
 	printf ("   Image Type:   %s %s %s (%s)\n",
-			image_get_arch_name(hdr->ih_arch),
-			image_get_os_name(hdr->ih_os),
-			image_get_type_name(hdr->ih_type),
-			image_get_comp_name(hdr->ih_comp));
+			image_get_arch_name(image_get_arch(hdr)),
+			image_get_os_name(image_get_os(hdr)),
+			image_get_type_name(image_get_type(hdr)),
+			image_get_comp_name(image_get_comp(hdr)));
 #endif
 	printf ("   Data Size:    %d Bytes = %s\n"
 		"   Load Address: %08x\n"
 		"   Entry Point:  %08x\n",
-			ntohl(hdr->ih_size),
-			size_human_readable(ntohl(hdr->ih_size)),
-			ntohl(hdr->ih_load),
-			ntohl(hdr->ih_ep));
+			image_get_size(hdr),
+			size_human_readable(image_get_size(hdr)),
+			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));
+		uint32_t len;
+		uint32_t *len_ptr = (uint32_t *)((ulong)hdr + image_get_header_size());
 
 		puts ("   Contents:\n");
-		for (i=0; (len = ntohl(*len_ptr)); ++i, ++len_ptr) {
+		for (i=0; len_ptr[i]; ++i) {
+			len = ntohl(len_ptr[i]);
 			printf ("   Image %d: %8ld Bytes = %s", i, len,
 				size_human_readable (len));
 		}
diff --git a/include/image.h b/include/image.h
index 185ba64..543204b 100644
--- a/include/image.h
+++ b/include/image.h
@@ -32,6 +32,11 @@
 #define __IMAGE_H__
 
 #include <linux/types.h>
+#ifdef __BAREBOX__
+#include <asm/byteorder.h>
+#include <stdio.h>
+#include <string.h>
+#endif
 
 /*
  * Operating System Codes
@@ -79,6 +84,7 @@
 #define IH_ARCH_NIOS2		15	/* Nios-II	*/
 #define IH_ARCH_BLACKFIN	16	/* Blackfin	*/
 #define IH_ARCH_AVR32		17	/* AVR32	*/
+#define IH_ARCH_LINUX		18	/* Linux	*/
 
 #if defined(__PPC__)
 #define IH_ARCH IH_ARCH_PPC
@@ -100,6 +106,8 @@
 #define IH_ARCH IH_ARCH_BLACKFIN
 #elif defined(__avr32__)
 #define IH_ARCH IH_ARCH_AVR32
+#elif defined(CONFIG_LINUX)
+#define IH_ARCH IH_ARCH_AVR32
 #endif
 
 /*
@@ -214,6 +222,159 @@ static inline const char *image_get_comp_name(uint8_t comp)
 }
 #endif
 
+#define uimage_to_cpu(x)		be32_to_cpu(x)
+#define cpu_to_uimage(x)		cpu_to_be32(x)
+
+static inline uint32_t image_get_header_size(void)
+{
+	return sizeof(image_header_t);
+}
+
+#define image_get_hdr_u32(x)					\
+static inline uint32_t image_get_##x(const image_header_t *hdr)	\
+{								\
+	return uimage_to_cpu(hdr->ih_##x);			\
+}
+
+image_get_hdr_u32(magic);	/* image_get_magic */
+image_get_hdr_u32(hcrc);	/* image_get_hcrc */
+image_get_hdr_u32(time);	/* image_get_time */
+image_get_hdr_u32(size);	/* image_get_size */
+image_get_hdr_u32(load);	/* image_get_load */
+image_get_hdr_u32(ep);		/* image_get_ep */
+image_get_hdr_u32(dcrc);	/* image_get_dcrc */
+
+#define image_get_hdr_u8(x)					\
+static inline uint8_t image_get_##x(const image_header_t *hdr)	\
+{								\
+	return hdr->ih_##x;					\
+}
+image_get_hdr_u8(os);		/* image_get_os */
+image_get_hdr_u8(arch);		/* image_get_arch */
+image_get_hdr_u8(type);		/* image_get_type */
+image_get_hdr_u8(comp);		/* image_get_comp */
+
+static inline char *image_get_name(const image_header_t *hdr)
+{
+	return (char*)hdr->ih_name;
+}
+
+static inline uint32_t image_get_data_size(const image_header_t *hdr)
+{
+	return image_get_size(hdr);
+}
+
+/**
+ * image_get_data - get image payload start address
+ * @hdr: image header
+ *
+ * image_get_data() returns address of the image payload. For single
+ * component images it is image data start. For multi component
+ * images it points to the null terminated table of sub-images sizes.
+ *
+ * returns:
+ *     image payload data start address
+ */
+static inline ulong image_get_data(const image_header_t *hdr)
+{
+	return ((ulong)hdr + image_get_header_size());
+}
+
+static inline uint32_t image_get_image_size(const image_header_t *hdr)
+{
+	return (image_get_size(hdr) + image_get_header_size());
+}
+
+static inline ulong image_get_image_end(const image_header_t *hdr)
+{
+	return ((ulong)hdr + image_get_image_size(hdr));
+}
+
+#define image_set_hdr_u32(x)						\
+static inline void image_set_##x(image_header_t *hdr, uint32_t val)	\
+{									\
+	hdr->ih_##x = cpu_to_uimage(val);				\
+}
+
+image_set_hdr_u32(magic);	/* image_set_magic */
+image_set_hdr_u32(hcrc);	/* image_set_hcrc */
+image_set_hdr_u32(time);	/* image_set_time */
+image_set_hdr_u32(size);	/* image_set_size */
+image_set_hdr_u32(load);	/* image_set_load */
+image_set_hdr_u32(ep);		/* image_set_ep */
+image_set_hdr_u32(dcrc);	/* image_set_dcrc */
+
+#define image_set_hdr_u8(x)						\
+static inline void image_set_##x(image_header_t *hdr, uint8_t val)	\
+{									\
+	hdr->ih_##x = val;						\
+}
+
+image_set_hdr_u8(os);		/* image_set_os */
+image_set_hdr_u8(arch);		/* image_set_arch */
+image_set_hdr_u8(type);		/* image_set_type */
+image_set_hdr_u8(comp);		/* image_set_comp */
+
+static inline void image_set_name(image_header_t *hdr, const char *name)
+{
+	strncpy(image_get_name(hdr), name, IH_NMLEN);
+}
+
+static inline int image_check_magic(const image_header_t *hdr)
+{
+	return (image_get_magic(hdr) == IH_MAGIC);
+}
+static inline int image_check_type(const image_header_t *hdr, uint8_t type)
+{
+	return (image_get_type(hdr) == type);
+}
+static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
+{
+	return (image_get_arch(hdr) == arch);
+}
+static inline int image_check_os(const image_header_t *hdr, uint8_t os)
+{
+	return (image_get_os(hdr) == os);
+}
+
+#ifdef __BAREBOX__
+static inline int image_check_target_arch(const image_header_t *hdr)
+{
+#if defined(__ARM__)
+	if (!image_check_arch(hdr, IH_ARCH_ARM))
+#elif defined(__avr32__)
+	if (!image_check_arch(hdr, IH_ARCH_AVR32))
+#elif defined(__bfin__)
+	if (!image_check_arch(hdr, IH_ARCH_BLACKFIN))
+#elif defined(__I386__)
+	if (!image_check_arch(hdr, IH_ARCH_I386))
+#elif defined(__M68K__)
+	if (!image_check_arch(hdr, IH_ARCH_M68K))
+#elif defined(__microblaze__)
+	if (!image_check_arch(hdr, IH_ARCH_MICROBLAZE))
+#elif defined(__mips__)
+	if (!image_check_arch(hdr, IH_ARCH_MIPS))
+#elif defined(__nios__)
+	if (!image_check_arch(hdr, IH_ARCH_NIOS))
+#elif defined(__nios2__)
+	if (!image_check_arch(hdr, IH_ARCH_NIOS2))
+#elif defined(__PPC__)
+	if (!image_check_arch(hdr, IH_ARCH_PPC))
+#elif defined(__sh__)
+	if (!image_check_arch(hdr, IH_ARCH_SH))
+#elif defined(__sparc__)
+	if (!image_check_arch(hdr, IH_ARCH_SPARC))
+#elif defined(CONFIG_LINUX)
+	if (!image_check_arch(hdr, IH_ARCH_LINUX))
+#else
+# error Unknown CPU type
+#endif
+		return 0;
+
+	return 1;
+}
+#endif /* USE_HOSTCC */
+
 /* commamds/bootm.c */
 void	print_image_hdr (image_header_t *hdr);
 
diff --git a/scripts/mkimage.c b/scripts/mkimage.c
index 8abd3ac..fef82c6 100644
--- a/scripts/mkimage.c
+++ b/scripts/mkimage.c
@@ -224,7 +224,7 @@ NXTARG:		;
 		 */
 		memcpy (hdr, ptr, sizeof(image_header_t));
 
-		if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+		if (image_check_magic(hdr)) {
 			fprintf (stderr,
 				"%s: Bad Magic Number: \"%s\" is no valid image\n",
 				cmdname, imagefile);
@@ -232,10 +232,10 @@ NXTARG:		;
 		}
 
 		data = (char *)hdr;
-		len  = sizeof(image_header_t);
+		len  = image_get_header_size();
 
-		checksum = ntohl(hdr->ih_hcrc);
-		hdr->ih_hcrc = htonl(0);	/* clear for re-calculation */
+		checksum = image_get_hcrc(hdr);
+		image_set_hcrc(hdr, 0);	/* clear for re-calculation */
 
 		if (crc32 (0, (unsigned char *)data, len) != checksum) {
 			fprintf (stderr,
@@ -244,10 +244,10 @@ NXTARG:		;
 			exit (EXIT_FAILURE);
 		}
 
-		data = (char *)(ptr + sizeof(image_header_t));
-		len  = sbuf.st_size - sizeof(image_header_t) ;
+		data = (char *)(ptr + image_get_header_size());
+		len  = sbuf.st_size - image_get_header_size() ;
 
-		if (crc32 (0, (unsigned char *)data, len) != ntohl(hdr->ih_dcrc)) {
+		if (crc32 (0, (unsigned char *)data, len) != image_get_dcrc(hdr)) {
 			fprintf (stderr,
 				"%s: ERROR: \"%s\" has corrupted data!\n",
 				cmdname, imagefile);
@@ -268,15 +268,16 @@ 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);
 	}
 
-	if (opt_type == IH_TYPE_MULTI || opt_type == IH_TYPE_SCRIPT) {
+	if ((opt_type == IH_TYPE_MULTI) ||
+	    (opt_type == IH_TYPE_SCRIPT)) {
 		char *file = datafile;
 		uint32_t size;
 
@@ -358,27 +359,27 @@ NXTARG:		;
 	hdr = (image_header_t *)ptr;
 
 	checksum = crc32 (0,
-			  (unsigned char *)(ptr + sizeof(image_header_t)),
-			  sbuf.st_size - sizeof(image_header_t)
+			  (unsigned 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,(unsigned char *)hdr,sizeof(image_header_t));
+	checksum = crc32(0,(unsigned char *)hdr, image_get_header_size());
 
-	hdr->ih_hcrc = htonl(checksum);
+	image_set_hcrc(hdr, checksum);
 
 	print_header (hdr);
 
@@ -443,14 +444,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",
@@ -459,7 +460,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;
@@ -509,22 +510,23 @@ print_header (image_header_t *hdr)
 	time_t timestamp;
 	uint32_t size;
 
-	timestamp = (time_t)ntohl(hdr->ih_time);
-	size = ntohl(hdr->ih_size);
+	timestamp = (time_t)image_get_time(hdr);
+	size = image_get_size(hdr);
 
-	printf ("Image Name:   %.*s\n", IH_NMLEN, hdr->ih_name);
+	printf ("Image Name:   %.*s\n", IH_NMLEN, image_get_name(hdr));
 	printf ("Created:      %s", ctime(&timestamp));
 	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));
+	printf ("Load Address: 0x%08X\n", image_get_load(hdr));
+	printf ("Entry Point:  0x%08X\n", image_get_ep(hdr));
 
-	if (hdr->ih_type == IH_TYPE_MULTI || hdr->ih_type == IH_TYPE_SCRIPT) {
+	if (image_check_type(hdr, IH_TYPE_MULTI) ||
+	    image_check_type(hdr, IH_TYPE_SCRIPT)) {
 		int i, ptrs;
 		uint32_t pos;
 		uint32_t *len_ptr = (uint32_t *) (
-					(unsigned long)hdr + sizeof(image_header_t)
+					(unsigned long)hdr + image_get_header_size()
 				);
 
 		/* determine number of images first (to calculate image offsets) */
@@ -532,14 +534,14 @@ print_header (image_header_t *hdr)
 			;
 		ptrs = i;		/* null pointer terminates list */
 
-		pos = sizeof(image_header_t) + ptrs * sizeof(long);
+		pos = image_get_header_size() + ptrs * sizeof(long);
 		printf ("Contents:\n");
 		for (i=0; len_ptr[i]; ++i) {
 			size = ntohl(len_ptr[i]);
 
 			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) {
+			if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
 				/*
 				 * the user may need to know offsets
 				 * if planning to do something with
@@ -560,10 +562,11 @@ static void
 print_type (image_header_t *hdr)
 {
 	printf ("%s %s %s (%s)\n",
-		image_get_arch_name(hdr->ih_arch),
-		image_get_os_name(hdr->ih_os),
-		image_get_type_name(hdr->ih_type),
-		image_get_comp_name(hdr->ih_comp));
+		image_get_arch_name(image_get_arch(hdr)),
+		image_get_os_name(image_get_os(hdr)),
+		image_get_type_name(image_get_type(hdr)),
+		image_get_comp_name(image_get_comp(hdr))
+	);
 }
 
 static int get_arch(char *name)
-- 
1.7.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 5/5] image: factorise image printing contents
  2010-09-23 10:14 [PATCH 1/5] image: factorise string helper Jean-Christophe PLAGNIOL-VILLARD
                   ` (2 preceding siblings ...)
  2010-09-23 10:14 ` [PATCH 4/5] image: Replace direct header access with the API routines Jean-Christophe PLAGNIOL-VILLARD
@ 2010-09-23 10:14 ` Jean-Christophe PLAGNIOL-VILLARD
  3 siblings, 0 replies; 5+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-09-23 10:14 UTC (permalink / raw)
  To: barebox

before we duplicate it between command/bootm.c and scripts/mkimage.c

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 commands/bootm.c  |   46 +--------------
 common/Makefile   |    2 +-
 common/image.c    |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/image.h   |   10 +++-
 scripts/mkimage.c |   71 +---------------------
 5 files changed, 188 insertions(+), 116 deletions(-)

diff --git a/commands/bootm.c b/commands/bootm.c
index 98047cd..83d36d3 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -203,7 +203,7 @@ struct image_handle *map_image(const char *filename, int verify)
 		puts ("OK\n");
 	}
 
-	print_image_hdr(header);
+	image_print_contents(header);
 
 	close(fd);
 
@@ -451,50 +451,6 @@ BAREBOX_CMD(
 
 #endif	/* CONFIG_CMD_IMI */
 
-void
-print_image_hdr (image_header_t *hdr)
-{
-#if defined(CONFIG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
-	time_t timestamp = (time_t)image_get_time(hdr);
-	struct rtc_time tm;
-#endif
-
-	printf ("   Image Name:   %.*s\n", IH_NMLEN, image_get_name(hdr));
-#if defined(CONFIG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
-	to_tm (timestamp, &tm);
-	printf ("   Created:      %4d-%02d-%02d  %2d:%02d:%02d UTC\n",
-		tm.tm_year, tm.tm_mon, tm.tm_mday,
-		tm.tm_hour, tm.tm_min, tm.tm_sec);
-#endif	/* CONFIG_CMD_DATE, CONFIG_TIMESTAMP */
-#ifdef CONFIG_CMD_BOOTM_SHOW_TYPE
-	printf ("   Image Type:   %s %s %s (%s)\n",
-			image_get_arch_name(image_get_arch(hdr)),
-			image_get_os_name(image_get_os(hdr)),
-			image_get_type_name(image_get_type(hdr)),
-			image_get_comp_name(image_get_comp(hdr)));
-#endif
-	printf ("   Data Size:    %d Bytes = %s\n"
-		"   Load Address: %08x\n"
-		"   Entry Point:  %08x\n",
-			image_get_size(hdr),
-			size_human_readable(image_get_size(hdr)),
-			image_get_load(hdr),
-			image_get_ep(hdr));
-
-	if (image_check_type(hdr, IH_TYPE_MULTI)) {
-		int i;
-		uint32_t len;
-		uint32_t *len_ptr = (uint32_t *)((ulong)hdr + image_get_header_size());
-
-		puts ("   Contents:\n");
-		for (i=0; len_ptr[i]; ++i) {
-			len = ntohl(len_ptr[i]);
-			printf ("   Image %d: %8ld Bytes = %s", i, len,
-				size_human_readable (len));
-		}
-	}
-}
-
 #ifdef CONFIG_BZLIB
 void bz_internal_error(int errcode)
 {
diff --git a/common/Makefile b/common/Makefile
index 94b1387..e56dbc2 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_CONSOLE_FULL) += console.o
 obj-$(CONFIG_CONSOLE_SIMPLE) += console_simple.o
 obj-$(CONFIG_DIGEST) += digest.o
 obj-y += env.o
-obj-$(CONFIG_CMD_BOOTM_SHOW_TYPE) += image.o
+obj-$(CONFIG_CMD_BOOTM) += image.o
 obj-y += startup.o
 obj-y += misc.o
 obj-y += memsize.o
diff --git a/common/image.c b/common/image.c
index 75346f5..fd57443 100644
--- a/common/image.c
+++ b/common/image.c
@@ -22,9 +22,14 @@
  */
 
 #ifdef __BAREBOX__
+#include <common.h>
 #include <image.h>
+#include <rtc.h>
+#else
+#include <time.h>
 #endif
 
+#if defined(CONFIG_CMD_BOOTM_SHOW_TYPE) || !defined(__BAREBOX__)
 typedef struct table_entry {
 	int	id;		/* as defined in image.h	*/
 	char	*sname;		/* short (input) name		*/
@@ -132,3 +137,173 @@ const char *image_get_comp_name(uint8_t comp)
 {
 	return get_table_entry_name(comp_name, "Unknown Compression", comp);
 }
+#endif
+
+/**
+ * image_multi_count - get component (sub-image) count
+ * @hdr: pointer to the header of the multi component image
+ *
+ * image_multi_count() returns number of components in a multi
+ * component image.
+ *
+ * Note: no checking of the image type is done, caller must pass
+ * a valid multi component image.
+ *
+ * returns:
+ *     number of components
+ */
+ulong image_multi_count(const image_header_t *hdr)
+{
+	ulong i, count = 0;
+	uint32_t *size;
+
+	/* get start of the image payload, which in case of multi
+	 * component images that points to a table of component sizes */
+	size = (uint32_t *)image_get_data (hdr);
+
+	/* count non empty slots */
+	for (i = 0; size[i]; ++i)
+		count++;
+
+	return count;
+}
+
+/**
+ * image_multi_getimg - get component data address and size
+ * @hdr: pointer to the header of the multi component image
+ * @idx: index of the requested component
+ * @data: pointer to a ulong variable, will hold component data address
+ * @len: pointer to a ulong variable, will hold component size
+ *
+ * image_multi_getimg() returns size and data address for the requested
+ * component in a multi component image.
+ *
+ * Note: no checking of the image type is done, caller must pass
+ * a valid multi component image.
+ *
+ * returns:
+ *     data address and size of the component, if idx is valid
+ *     0 in data and len, if idx is out of range
+ */
+void image_multi_getimg(const image_header_t *hdr, ulong idx,
+			ulong *data, ulong *len)
+{
+	int i;
+	uint32_t *size;
+	ulong offset, count, img_data;
+
+	/* get number of component */
+	count = image_multi_count(hdr);
+
+	/* get start of the image payload, which in case of multi
+	 * component images that points to a table of component sizes */
+	size = (uint32_t *)image_get_data(hdr);
+
+	/* get address of the proper component data start, which means
+	 * skipping sizes table (add 1 for last, null entry) */
+	img_data = image_get_data(hdr) + (count + 1) * sizeof (uint32_t);
+
+	if (idx < count) {
+		*len = uimage_to_cpu(size[idx]);
+		offset = 0;
+
+		/* go over all indices preceding requested component idx */
+		for (i = 0; i < idx; i++) {
+			/* add up i-th component size, rounding up to 4 bytes */
+			offset += (uimage_to_cpu(size[i]) + 3) & ~3 ;
+		}
+
+		/* calculate idx-th component data address */
+		*data = img_data + offset;
+	} else {
+		*len = 0;
+		*data = 0;
+	}
+}
+
+static void image_print_type(const image_header_t *hdr)
+{
+	const char *os, *arch, *type, *comp;
+
+	os = image_get_os_name(image_get_os(hdr));
+	arch = image_get_arch_name(image_get_arch(hdr));
+	type = image_get_type_name(image_get_type(hdr));
+	comp = image_get_comp_name(image_get_comp(hdr));
+
+	printf ("%s %s %s (%s)\n", arch, os, type, comp);
+}
+
+#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || !defined(__BAREBOX__)
+static void image_print_time(time_t timestamp)
+{
+#if defined(__BAREBOX__)
+	struct rtc_time tm;
+
+	to_tm(timestamp, &tm);
+	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC\n",
+			tm.tm_year, tm.tm_mon, tm.tm_mday,
+			tm.tm_hour, tm.tm_min, tm.tm_sec);
+#else
+	printf("%s", ctime(&timestamp));
+#endif
+}
+#endif /* CONFIG_TIMESTAMP || CONFIG_CMD_DATE || !__BAREBOX__ */
+
+void image_print_size(uint32_t size)
+{
+#ifdef __BAREBOX__
+	printf("%d Bytes = %s\n", size, size_human_readable(size));
+#else
+	printf("%d Bytes = %.2f kB = %.2f MB\n",
+			size, (double)size / 1.024e3,
+			(double)size / 1.048576e6);
+#endif
+}
+
+void image_print_contents(const void *ptr)
+{
+	const image_header_t *hdr = (const image_header_t *)ptr;
+	const char *p;
+
+#ifdef __BAREBOX__
+	p = "   ";
+#else
+	p = "";
+#endif
+
+	printf("%sImage Name:   %.*s\n", p, IH_NMLEN, image_get_name(hdr));
+#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || !defined(__BAREBOX__)
+	printf("%sCreated:      ", p);
+	image_print_time((time_t)image_get_time(hdr));
+#endif
+	printf ("%sImage Type:   ", p);
+	image_print_type(hdr);
+	printf ("%sData Size:    ", p);
+	image_print_size(image_get_data_size(hdr));
+	printf ("%sLoad Address: %08x\n", p, image_get_load(hdr));
+	printf ("%sEntry Point:  %08x\n", p, image_get_ep(hdr));
+
+	if (image_check_type(hdr, IH_TYPE_MULTI) ||
+			image_check_type(hdr, IH_TYPE_SCRIPT)) {
+		int i;
+		ulong data, len;
+		ulong count = image_multi_count(hdr);
+
+		printf ("%sContents:\n", p);
+		for (i = 0; i < count; i++) {
+			image_multi_getimg(hdr, i, &data, &len);
+
+			printf("%s   Image %d: ", p, i);
+			image_print_size(len);
+
+			if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
+				/*
+				 * the user may need to know offsets
+				 * if planning to do something with
+				 * multiple files
+				 */
+				printf("%s    Offset = 0x%08lx\n", p, data);
+			}
+		}
+	}
+}
diff --git a/include/image.h b/include/image.h
index 543204b..c500ce1 100644
--- a/include/image.h
+++ b/include/image.h
@@ -373,7 +373,15 @@ static inline int image_check_target_arch(const image_header_t *hdr)
 
 	return 1;
 }
-#endif /* USE_HOSTCC */
+#endif
+
+ulong image_multi_count(const image_header_t *hdr);
+void image_multi_getimg(const image_header_t *hdr, ulong idx,
+			ulong *data, ulong *len);
+
+void image_print_size(uint32_t size);
+
+void image_print_contents(const void *ptr);
 
 /* commamds/bootm.c */
 void	print_image_hdr (image_header_t *hdr);
diff --git a/scripts/mkimage.c b/scripts/mkimage.c
index fef82c6..2698aa2 100644
--- a/scripts/mkimage.c
+++ b/scripts/mkimage.c
@@ -38,8 +38,6 @@ char *cmdname;
 
 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	int	get_table_entry (table_entry_t *, char *, char *);
 static	int	get_arch(char *);
 static	int	get_comp(char *);
@@ -255,7 +253,7 @@ NXTARG:		;
 		}
 
 		/* for multi-file images we need the data part, too */
-		print_header ((image_header_t *)ptr);
+		image_print_contents((image_header_t *)ptr);
 
 		(void) munmap((void *)ptr, sbuf.st_size);
 		(void) close (ifd);
@@ -381,7 +379,7 @@ NXTARG:		;
 
 	image_set_hcrc(hdr, checksum);
 
-	print_header (hdr);
+	image_print_contents(hdr);
 
 	(void) munmap((void *)ptr, sbuf.st_size);
 
@@ -504,71 +502,6 @@ usage ()
 	exit (EXIT_FAILURE);
 }
 
-static void
-print_header (image_header_t *hdr)
-{
-	time_t timestamp;
-	uint32_t size;
-
-	timestamp = (time_t)image_get_time(hdr);
-	size = image_get_size(hdr);
-
-	printf ("Image Name:   %.*s\n", IH_NMLEN, image_get_name(hdr));
-	printf ("Created:      %s", ctime(&timestamp));
-	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", image_get_load(hdr));
-	printf ("Entry Point:  0x%08X\n", image_get_ep(hdr));
-
-	if (image_check_type(hdr, IH_TYPE_MULTI) ||
-	    image_check_type(hdr, IH_TYPE_SCRIPT)) {
-		int i, ptrs;
-		uint32_t pos;
-		uint32_t *len_ptr = (uint32_t *) (
-					(unsigned long)hdr + image_get_header_size()
-				);
-
-		/* 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 */
-
-		pos = image_get_header_size() + ptrs * sizeof(long);
-		printf ("Contents:\n");
-		for (i=0; len_ptr[i]; ++i) {
-			size = ntohl(len_ptr[i]);
-
-			printf ("   Image %d: %8d Bytes = %4d kB = %d MB\n",
-				i, size, size>>10, size>>20);
-			if (image_check_type(hdr, 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;
-		}
-	}
-}
-
-
-static void
-print_type (image_header_t *hdr)
-{
-	printf ("%s %s %s (%s)\n",
-		image_get_arch_name(image_get_arch(hdr)),
-		image_get_os_name(image_get_os(hdr)),
-		image_get_type_name(image_get_type(hdr)),
-		image_get_comp_name(image_get_comp(hdr))
-	);
-}
-
 static int get_arch(char *name)
 {
 	return (get_table_entry(arch_name, "CPU", name));
-- 
1.7.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-09-23 10:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-23 10:14 [PATCH 1/5] image: factorise string helper Jean-Christophe PLAGNIOL-VILLARD
2010-09-23 10:14 ` [PATCH 2/5] image: rename IH_CPU to IH_ARCH to be more concistant Jean-Christophe PLAGNIOL-VILLARD
2010-09-23 10:14 ` [PATCH 3/5] host: introduce compiler.h to handle host include Jean-Christophe PLAGNIOL-VILLARD
2010-09-23 10:14 ` [PATCH 4/5] image: Replace direct header access with the API routines Jean-Christophe PLAGNIOL-VILLARD
2010-09-23 10:14 ` [PATCH 5/5] image: factorise image printing contents Jean-Christophe PLAGNIOL-VILLARD

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox