From patchwork Thu Oct 6 22:36:24 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Warren X-Patchwork-Id: 118181 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 41079B70B7 for ; Fri, 7 Oct 2011 09:36:47 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id CF71F28E4C; Fri, 7 Oct 2011 00:36:45 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QYKwoXneZ0sA; Fri, 7 Oct 2011 00:36:45 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 99D9528F23; Fri, 7 Oct 2011 00:36:41 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id EA18D294BA for ; Fri, 7 Oct 2011 00:36:37 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CZ5a+KWW9+zu for ; Fri, 7 Oct 2011 00:36:35 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from avon.wwwdotorg.org (avon.wwwdotorg.org [70.85.31.133]) by theia.denx.de (Postfix) with ESMTPS id 6A1A029486 for ; Fri, 7 Oct 2011 00:36:34 +0200 (CEST) Received: from severn.wwwdotorg.org (unknown [192.168.65.5]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by avon.wwwdotorg.org (Postfix) with ESMTPS id 10DC76317; Thu, 6 Oct 2011 16:36:50 -0600 (MDT) Received: from localhost.localdomain (searspoint.nvidia.com [216.228.112.21]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by severn.wwwdotorg.org (Postfix) with ESMTPSA id D7EB0E4105; Thu, 6 Oct 2011 16:36:29 -0600 (MDT) From: Stephen Warren To: Wolfgang Denk Date: Thu, 6 Oct 2011 16:36:24 -0600 Message-Id: <1317940584-19528-1-git-send-email-swarren@nvidia.com> X-Mailer: git-send-email 1.7.0.4 X-Virus-Scanned: clamav-milter 0.96.5 at avon.wwwdotorg.org X-Virus-Status: Clean Cc: U-Boot Mailing List Subject: [U-Boot] [PATCH] image: Implement IH_TYPE_KERNEL_REL X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de 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 --- 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);