[U-Boot] [PATCH] image: Implement IH_TYPE_KERNEL_REL

Stephen Warren swarren at nvidia.com
Fri Oct 7 00:36:24 CEST 2011


uImage files contain absolute "load" and "entry" addresses. Such a concept
is incompatible with using the same kernel image on multiple SoCs, each with
a potentially different SDRAM base. To support that, create a new image type
IH_TYPE_KERNEL_REL, which is handled identically to IH_TYPE_KERNEL, except
that the "load" and "entry" properties are an offset from the base of SDRAM,
rather than an absolute address.

"An offset from the base of SDRAM" is specified as:
a) CONFIG_SYS_SDRAM_BASE, if set.
b) Otherwise, for ARM, the start address of the first bank of SDRAM known
   to U-Boot.
c) Otherwise, 0.

The exact algorithm is implemented in getenv_bootm_low().

Signed-off-by: Stephen Warren <swarren at nvidia.com>
---
 arch/sh/lib/bootm.c   |    2 +-
 common/cmd_bootm.c    |   16 +++--
 common/image.c        |  178 ++++++++++++++++++++++++++++++++++++++++++-------
 common/lynxkdi.c      |    6 +-
 common/update.c       |    2 +-
 include/image.h       |   30 ++++++--
 tools/default_image.c |    7 +-
 7 files changed, 194 insertions(+), 47 deletions(-)

diff --git a/arch/sh/lib/bootm.c b/arch/sh/lib/bootm.c
index 57273fa..71a42b1 100644
--- a/arch/sh/lib/bootm.c
+++ b/arch/sh/lib/bootm.c
@@ -72,7 +72,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
 	void (*kernel) (void) = (void (*)(void))images->ep;
 	/* empty_zero_page */
 	unsigned char *param
-		= (unsigned char *)image_get_load(images->legacy_hdr_os);
+		= (unsigned char *)image_get_load_raw(images->legacy_hdr_os);
 	/* Linux kernel command line */
 	char *cmdline = (char *)param + COMMAND_LINE;
 	/* PAGE_SIZE */
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 8909ee7..1b93954 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -237,7 +237,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 		images.os.os = image_get_os (os_hdr);
 
 		images.os.end = image_get_image_end (os_hdr);
-		images.os.load = image_get_load (os_hdr);
+		images.os.load = image_get_load_abs (os_hdr);
 		break;
 #if defined(CONFIG_FIT)
 	case IMAGE_FORMAT_FIT:
@@ -264,7 +264,8 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 
 		images.os.end = fit_get_end (images.fit_hdr_os);
 
-		if (fit_image_get_load (images.fit_hdr_os, images.fit_noffset_os,
+		if (fit_image_get_load_abs (images.fit_hdr_os,
+					images.fit_noffset_os,
 					&images.os.load)) {
 			puts ("Can't get image load address!\n");
 			show_boot_progress (-112);
@@ -279,10 +280,10 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 
 	/* find kernel entry point */
 	if (images.legacy_hdr_valid) {
-		images.ep = image_get_ep (&images.legacy_hdr_os_copy);
+		images.ep = image_get_ep_abs (&images.legacy_hdr_os_copy);
 #if defined(CONFIG_FIT)
 	} else if (images.fit_uname_os) {
-		ret = fit_image_get_entry (images.fit_hdr_os,
+		ret = fit_image_get_entry_abs (images.fit_hdr_os,
 				images.fit_noffset_os, &images.ep);
 		if (ret) {
 			puts ("Can't get entry point property!\n");
@@ -295,7 +296,8 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 	}
 
 	if (((images.os.type == IH_TYPE_KERNEL) ||
-	     (images.os.type == IH_TYPE_MULTI)) &&
+	     (images.os.type == IH_TYPE_MULTI) ||
+	     (images.os.type == IH_TYPE_KERNEL_REL)) &&
 	    (images.os.os == IH_OS_LINUX)) {
 		/* find ramdisk */
 		ret = boot_get_ramdisk (argc, argv, &images, IH_INITRD_ARCH,
@@ -813,7 +815,8 @@ static int fit_check_kernel (const void *fit, int os_noffset, int verify)
 	}
 
 	show_boot_progress (106);
-	if (!fit_image_check_type (fit, os_noffset, IH_TYPE_KERNEL)) {
+	if (!fit_image_check_type (fit, os_noffset, IH_TYPE_KERNEL) &&
+	    !fit_image_check_type (fit, os_noffset, IH_TYPE_KERNEL_REL) ) {
 		puts ("Not a kernel image\n");
 		show_boot_progress (-106);
 		return 0;
@@ -890,6 +893,7 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char * const
 		/* get os_data and os_len */
 		switch (image_get_type (hdr)) {
 		case IH_TYPE_KERNEL:
+		case IH_TYPE_KERNEL_REL:
 			*os_data = image_get_data (hdr);
 			*os_len = image_get_data_size (hdr);
 			break;
diff --git a/common/image.c b/common/image.c
index d38ce4a..808c97d 100644
--- a/common/image.c
+++ b/common/image.c
@@ -136,6 +136,7 @@ static const table_entry_t uimage_type[] = {
 	{	IH_TYPE_INVALID,    NULL,	  "Invalid Image",	},
 	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
 	{	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	},
+	{	IH_TYPE_KERNEL_REL, "kernel_rel", "Relative Kernel Image",},
 	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
 	{	IH_TYPE_MULTI,	    "multi",	  "Multi-File Image",	},
 	{	IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP SPL With GP CH",},
@@ -160,6 +161,7 @@ static const table_entry_t uimage_comp[] = {
 
 uint32_t crc32 (uint32_t, const unsigned char *, uint);
 uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
+static ulong image_addr_raw_to_abs(uint8_t type, ulong raw);
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
 static void genimg_print_time (time_t timestamp);
 #endif
@@ -191,6 +193,18 @@ int image_check_dcrc (const image_header_t *hdr)
 	return (dcrc == image_get_dcrc (hdr));
 }
 
+uint32_t image_get_load_abs (const image_header_t *hdr)
+{
+	return image_addr_raw_to_abs(image_get_type(hdr),
+					image_get_load_raw(hdr));
+}
+
+uint32_t image_get_ep_abs (const image_header_t *hdr)
+{
+	return image_addr_raw_to_abs(image_get_type(hdr),
+					image_get_ep_raw(hdr));
+}
+
 /**
  * image_multi_count - get component (sub-image) count
  * @hdr: pointer to the header of the multi component image
@@ -301,6 +315,7 @@ void image_print_contents (const void *ptr)
 {
 	const image_header_t *hdr = (const image_header_t *)ptr;
 	const char *p;
+	uint32_t raw, abs;
 
 #ifdef USE_HOSTCC
 	p = "";
@@ -317,8 +332,20 @@ void image_print_contents (const void *ptr)
 	image_print_type (hdr);
 	printf ("%sData Size:    ", p);
 	genimg_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));
+
+	raw = image_get_load_raw (hdr);
+	abs = image_get_load_abs (hdr);
+	if (abs == raw)
+		printf ("%sLoad Address: %08x\n", p, abs);
+	else
+		printf ("%sLoad Address: %08x (relative %08x)\n", p, abs, raw);
+
+	raw = image_get_ep_raw (hdr);
+	abs = image_get_ep_abs (hdr);
+	if (abs == raw)
+		printf ("%sEntry Point:  %08x\n", p, abs);
+	else
+		printf ("%sEntry Point:  %08x (relative %08x)\n", p, abs, raw);
 
 	if (image_check_type (hdr, IH_TYPE_MULTI) ||
 			image_check_type (hdr, IH_TYPE_SCRIPT)) {
@@ -495,6 +522,18 @@ void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 }
 #endif /* !USE_HOSTCC */
 
+ulong image_addr_raw_to_abs(uint8_t type, ulong raw)
+{
+	ulong abs = raw;
+
+#ifndef USE_HOSTCC
+	if (type == IH_TYPE_KERNEL_REL)
+		abs += getenv_bootm_low();
+#endif
+
+	return abs;
+}
+
 void genimg_print_size (uint32_t size)
 {
 #ifndef USE_HOSTCC
@@ -891,7 +930,7 @@ int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
 
 			rd_data = image_get_data (rd_hdr);
 			rd_len = image_get_data_size (rd_hdr);
-			rd_load = image_get_load (rd_hdr);
+			rd_load = image_get_load_raw (rd_hdr);
 			break;
 #if defined(CONFIG_FIT)
 		case IMAGE_FORMAT_FIT:
@@ -953,7 +992,7 @@ int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
 			rd_data = (ulong)data;
 			rd_len = size;
 
-			if (fit_image_get_load (fit_hdr, rd_noffset, &rd_load)) {
+			if (fit_image_get_load_raw (fit_hdr, rd_noffset, &rd_load)) {
 				puts ("Can't get ramdisk subimage load address!\n");
 				show_boot_progress (-129);
 				return 1;
@@ -1445,7 +1484,7 @@ int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *imag
 			image_start = (ulong)fdt_hdr;
 			image_end = image_get_image_end (fdt_hdr);
 
-			load_start = image_get_load (fdt_hdr);
+			load_start = image_get_load_raw (fdt_hdr);
 			load_end = load_start + image_get_data_size (fdt_hdr);
 
 			if ((load_start < image_end) && (load_end > image_start)) {
@@ -1540,7 +1579,7 @@ int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *imag
 				image_start = (ulong)fit_hdr;
 				image_end = fit_get_end (fit_hdr);
 
-				if (fit_image_get_load (fit_hdr, fdt_noffset,
+				if (fit_image_get_load_raw (fit_hdr, fdt_noffset,
 							&load_start) == 0) {
 					load_end = load_start + size;
 
@@ -1922,7 +1961,7 @@ void fit_image_print (const void *fit, int image_noffset, const char *p)
 	char *desc;
 	uint8_t type, arch, os, comp;
 	size_t size;
-	ulong load, entry;
+	ulong raw, abs;
 	const void *data;
 	int noffset;
 	int ndepth;
@@ -1961,33 +2000,44 @@ void fit_image_print (const void *fit, int image_noffset, const char *p)
 	/* Remaining, type dependent properties */
 	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
 	    (type == IH_TYPE_RAMDISK) || (type == IH_TYPE_FIRMWARE) ||
-	    (type == IH_TYPE_FLATDT)) {
+	    (type == IH_TYPE_FLATDT) || (type == IH_TYPE_KERNEL_REL)) {
 		fit_image_get_arch (fit, image_noffset, &arch);
 		printf ("%s  Architecture: %s\n", p, genimg_get_arch_name (arch));
 	}
 
-	if (type == IH_TYPE_KERNEL) {
+	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_KERNEL_REL)) {
 		fit_image_get_os (fit, image_noffset, &os);
 		printf ("%s  OS:           %s\n", p, genimg_get_os_name (os));
 	}
 
 	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
-		(type == IH_TYPE_FIRMWARE)) {
-		ret = fit_image_get_load (fit, image_noffset, &load);
+		(type == IH_TYPE_FIRMWARE) || (type == IH_TYPE_KERNEL_REL)) {
+		ret = fit_image_get_load_raw (fit, image_noffset, &raw);
+		ret |= fit_image_get_load_abs (fit, image_noffset, &abs);
 		printf ("%s  Load Address: ", p);
 		if (ret)
 			printf ("unavailable\n");
-		else
-			printf ("0x%08lx\n", load);
+		else {
+			if (abs == raw)
+				printf ("0x%08lx\n", abs);
+			else
+				printf ("0x%08lx (relative 0x%08lx)\n", abs, raw);
+		}
 	}
 
-	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE)) {
-		fit_image_get_entry (fit, image_noffset, &entry);
+	if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
+	    (type == IH_TYPE_KERNEL_REL)) {
+		ret = fit_image_get_entry_raw (fit, image_noffset, &raw);
+		ret |= fit_image_get_entry_abs (fit, image_noffset, &abs);
 		printf ("%s  Entry Point:  ", p);
 		if (ret)
 			printf ("unavailable\n");
-		else
-			printf ("0x%08lx\n", entry);
+		else {
+			if (abs == raw)
+				printf ("0x%08lx\n", abs);
+			else
+				printf ("0x%08lx (relative 0x%08lx)\n", abs, raw);
+		}
 	}
 
 	/* Process all hash subnodes of the component image node */
@@ -2275,19 +2325,23 @@ int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp)
 }
 
 /**
- * fit_image_get_load - get load address property for a given component image node
+ * fit_image_get_load_raw - get raw load address property for a given component image node
  * @fit: pointer to the FIT format image header
  * @noffset: component image node offset
  * @load: pointer to the uint32_t, will hold load address
  *
- * fit_image_get_load() finds load address property in a given component image node.
- * If the property is found, its value is returned to the caller.
+ * fit_image_get_load_raw() finds load address property in a given component
+ * image node.  If the property is found, its value is returned to the caller.
+ *
+ * Note that this function returns the raw value encoded into the image file;
+ * the actual value U-Boot will use may be different for "relative" image
+ * formats.
  *
  * returns:
  *     0, on success
  *     -1, on failure
  */
-int fit_image_get_load (const void *fit, int noffset, ulong *load)
+int fit_image_get_load_raw (const void *fit, int noffset, ulong *load)
 {
 	int len;
 	const uint32_t *data;
@@ -2303,19 +2357,58 @@ int fit_image_get_load (const void *fit, int noffset, ulong *load)
 }
 
 /**
- * fit_image_get_entry - get entry point address property for a given component image node
+ * fit_image_get_load_abs - get absolute load address property for a given component image node
+ * @fit: pointer to the FIT format image header
+ * @noffset: component image node offset
+ * @load: pointer to the uint32_t, will hold load address
+ *
+ * fit_image_get_load_abs() finds load address property in a given component
+ *  image node. If the property is found, its value is returned to the caller.
+ *
+ * Note that this function returns the absolute value that U-Boot should
+ * use when actually loading images, or relocating them to the load address.
+ *
+ * returns:
+ *     0, on success
+ *     -1, on failure
+ */
+int fit_image_get_load_abs (const void *fit, int noffset, ulong *load)
+{
+	int ret;
+	ulong raw;
+	uint8_t type;
+
+	ret = fit_image_get_load_raw(fit, noffset, &raw);
+	if (ret)
+		return ret;
+
+	ret = fit_image_get_type (fit, noffset, &type);
+	if (ret)
+		return ret;
+
+	*load = image_addr_raw_to_abs(type, raw);
+	return 0;
+}
+
+/**
+ * fit_image_get_entry_raw - get raw entry point address property for a given component image node
  * @fit: pointer to the FIT format image header
  * @noffset: component image node offset
  * @entry: pointer to the uint32_t, will hold entry point address
  *
- * fit_image_get_entry() finds entry point address property in a given component image node.
- * If the property is found, its value is returned to the caller.
+ * fit_image_get_entry_raw() finds entry point address property in a given
+ * component image node.  If the property is found, its value is returned to
+ * the caller.
+ *
+ * Note that this function returns the raw value encoded into the image file;
+ * the actual value U-Boot will use may be different for "relative" image
+ * formats.
  *
  * returns:
  *     0, on success
  *     -1, on failure
  */
-int fit_image_get_entry (const void *fit, int noffset, ulong *entry)
+int fit_image_get_entry_raw (const void *fit, int noffset, ulong *entry)
 {
 	int len;
 	const uint32_t *data;
@@ -2331,6 +2424,41 @@ int fit_image_get_entry (const void *fit, int noffset, ulong *entry)
 }
 
 /**
+ * fit_image_get_entry_abs - get absolute entry point address property for a given component image node
+ * @fit: pointer to the FIT format image header
+ * @noffset: component image node offset
+ * @entry: pointer to the uint32_t, will hold entry point address
+ *
+ * fit_image_get_entry_abs() finds entry point address property in a given
+ * component image node.  If the property is found, its value is returned to
+ * the caller.
+ *
+ * Note that this function returns the absolute value that U-Boot should
+ * use when actually executing images.
+ *
+ * returns:
+ *     0, on success
+ *     -1, on failure
+ */
+int fit_image_get_entry_abs (const void *fit, int noffset, ulong *ep)
+{
+	int ret;
+	ulong raw;
+	uint8_t type;
+
+	ret = fit_image_get_entry_raw(fit, noffset, &raw);
+	if (ret)
+		return ret;
+
+	ret = fit_image_get_type (fit, noffset, &type);
+	if (ret)
+		return ret;
+
+	*ep = image_addr_raw_to_abs(type, raw);
+	return 0;
+}
+
+/**
  * fit_image_get_data - get data property and its size for a given component image node
  * @fit: pointer to the FIT format image header
  * @noffset: component image node offset
diff --git a/common/lynxkdi.c b/common/lynxkdi.c
index b23135b..3fd4807 100644
--- a/common/lynxkdi.c
+++ b/common/lynxkdi.c
@@ -25,10 +25,10 @@ DECLARE_GLOBAL_DATA_PTR;
 #if defined(CONFIG_MPC8260) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
 void lynxkdi_boot (image_header_t *hdr)
 {
-	void (*lynxkdi)(void) = (void(*)(void))image_get_ep (hdr);
+	void (*lynxkdi)(void) = (void(*)(void))image_get_ep_raw (hdr);
 	lynxos_bootparms_t *parms = (lynxos_bootparms_t *)0x0020;
 	bd_t *kbd;
-	u32 *psz = (u32 *)(image_get_load (hdr) + 0x0204);
+	u32 *psz = (u32 *)(image_get_load_raw (hdr) + 0x0204);
 
 	memset (parms, 0, sizeof(*parms));
 	kbd = gd->bd;
@@ -42,7 +42,7 @@ void lynxkdi_boot (image_header_t *hdr)
 	 */
 	if (le32_to_cpu (*psz) == image_get_data_size (hdr)) {	/* FIXME: NOT SURE HERE ! */
 		char *args;
-		char *cmdline = (char *)(image_get_load (hdr) + 0x020c);
+		char *cmdline = (char *)(image_get_load_raw (hdr) + 0x020c);
 		int len;
 
 		printf ("Booting Bluecat KDI ...\n");
diff --git a/common/update.c b/common/update.c
index a19f136..b35ef91 100644
--- a/common/update.c
+++ b/common/update.c
@@ -230,7 +230,7 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
 	if (fit_image_get_data(fit, noffset, &data, (size_t *)size))
 		return 1;
 
-	if (fit_image_get_load(fit, noffset, (ulong *)fladdr))
+	if (fit_image_get_load_raw(fit, noffset, (ulong *)fladdr))
 		return 1;
 
 	*addr = (ulong)data;
diff --git a/include/image.h b/include/image.h
index 352e4a0..678a5dd 100644
--- a/include/image.h
+++ b/include/image.h
@@ -144,6 +144,14 @@
  *	U-Boot's command interpreter; this feature is especially
  *	useful when you configure U-Boot to use a real shell (hush)
  *	as command interpreter (=> Shell Scripts).
+ *
+ * Types named IH_TYPE_xxx_REL have load and entry point addresses specified
+ * relative to "the base of SDRAM", where that is specified as:
+ * a) CONFIG_SYS_SDRAM_BASE, if set.
+ * b) Otherwise, for ARM, the start address of the first bank of SDRAM known
+ *     to U-Boot.
+ * c) Otherwise, 0.
+ * The exact algorithm is implemented in getenv_bootm_low().
  */
 
 #define IH_TYPE_INVALID		0	/* Invalid Image		*/
@@ -159,6 +167,7 @@
 #define IH_TYPE_IMXIMAGE	10	/* Freescale IMXBoot Image	*/
 #define IH_TYPE_UBLIMAGE	11	/* Davinci UBL Image		*/
 #define IH_TYPE_OMAPIMAGE	12	/* TI OMAP Config Header Image	*/
+#define IH_TYPE_KERNEL_REL	13	/* OS Kernel Image		*/
 
 /*
  * Compression Types
@@ -181,8 +190,8 @@ typedef struct image_header {
 	uint32_t	ih_hcrc;	/* Image Header CRC Checksum	*/
 	uint32_t	ih_time;	/* Image Creation Timestamp	*/
 	uint32_t	ih_size;	/* Image Data Size		*/
-	uint32_t	ih_load;	/* Data	 Load  Address		*/
-	uint32_t	ih_ep;		/* Entry Point Address		*/
+	uint32_t	ih_load_raw;	/* Data	 Load  Address		*/
+	uint32_t	ih_ep_raw;	/* Entry Point Address		*/
 	uint32_t	ih_dcrc;	/* Image Data CRC Checksum	*/
 	uint8_t		ih_os;		/* Operating System		*/
 	uint8_t		ih_arch;	/* CPU architecture		*/
@@ -371,10 +380,13 @@ image_get_hdr_l (magic)		/* image_get_magic */
 image_get_hdr_l (hcrc)		/* image_get_hcrc */
 image_get_hdr_l (time)		/* image_get_time */
 image_get_hdr_l (size)		/* image_get_size */
-image_get_hdr_l (load)		/* image_get_load */
-image_get_hdr_l (ep)		/* image_get_ep */
+image_get_hdr_l (load_raw)	/* image_get_load_raw */
+image_get_hdr_l (ep_raw)	/* image_get_ep_raw */
 image_get_hdr_l (dcrc)		/* image_get_dcrc */
 
+uint32_t image_get_load_abs (const image_header_t *hdr);
+uint32_t image_get_ep_abs (const image_header_t *hdr);
+
 #define image_get_hdr_b(f) \
 	static inline uint8_t image_get_##f(const image_header_t *hdr) \
 	{ \
@@ -429,8 +441,8 @@ image_set_hdr_l (magic)		/* image_set_magic */
 image_set_hdr_l (hcrc)		/* image_set_hcrc */
 image_set_hdr_l (time)		/* image_set_time */
 image_set_hdr_l (size)		/* image_set_size */
-image_set_hdr_l (load)		/* image_set_load */
-image_set_hdr_l (ep)		/* image_set_ep */
+image_set_hdr_l (load_raw)	/* image_set_load_raw */
+image_set_hdr_l (ep_raw)	/* image_set_ep_raw */
 image_set_hdr_l (dcrc)		/* image_set_dcrc */
 
 #define image_set_hdr_b(f) \
@@ -603,8 +615,10 @@ int fit_image_get_os (const void *fit, int noffset, uint8_t *os);
 int fit_image_get_arch (const void *fit, int noffset, uint8_t *arch);
 int fit_image_get_type (const void *fit, int noffset, uint8_t *type);
 int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp);
-int fit_image_get_load (const void *fit, int noffset, ulong *load);
-int fit_image_get_entry (const void *fit, int noffset, ulong *entry);
+int fit_image_get_load_raw (const void *fit, int noffset, ulong *load);
+int fit_image_get_load_abs (const void *fit, int noffset, ulong *load);
+int fit_image_get_entry_raw (const void *fit, int noffset, ulong *entry);
+int fit_image_get_entry_abs (const void *fit, int noffset, ulong *ep);
 int fit_image_get_data (const void *fit, int noffset,
 				const void **data, size_t *size);
 
diff --git a/tools/default_image.c b/tools/default_image.c
index f5bad47..fe420ba 100644
--- a/tools/default_image.c
+++ b/tools/default_image.c
@@ -35,7 +35,8 @@ static image_header_t header;
 
 static int image_check_image_types (uint8_t type)
 {
-	if ((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT))
+	if ((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT) ||
+	    (type == IH_TYPE_KERNEL_REL))
 		return EXIT_SUCCESS;
 	else
 		return EXIT_FAILURE;
@@ -113,8 +114,8 @@ static void image_set_header (void *ptr, struct stat *sbuf, int ifd,
 	image_set_magic (hdr, IH_MAGIC);
 	image_set_time (hdr, sbuf->st_mtime);
 	image_set_size (hdr, sbuf->st_size - sizeof(image_header_t));
-	image_set_load (hdr, params->addr);
-	image_set_ep (hdr, params->ep);
+	image_set_load_raw (hdr, params->addr);
+	image_set_ep_raw (hdr, params->ep);
 	image_set_dcrc (hdr, checksum);
 	image_set_os (hdr, params->os);
 	image_set_arch (hdr, params->arch);
-- 
1.7.0.4



More information about the U-Boot mailing list