[U-Boot] [PATCH] image: Allow images to indicate they're loadable at any address
Simon Glass
sjg at chromium.org
Wed Oct 26 02:00:52 CEST 2011
Hi Stephen,
On Mon, Oct 24, 2011 at 6:59 AM, Stephen Warren <swarren at nvidia.com> wrote:
> The legacy uImage format includes an absolute load and entry-
> point address. When presented with a uImage in memory that
> isn't loaded at the address in the image's load address,
> U-Boot will relocate the image to its address in the header.
>
> Some payloads can actually be loaded and used at any arbitrary
> address. An example is an ARM Linux kernel zImage file. This
> is useful when sharing a single zImage across multiple boards
> with different memory layouts, or U-Boot builds with different
> ${load_addr} since sharing a single absolute load address may
> not be possible.
>
> With this config option enabled, an image header may contain a
> load address of -1/0xffffffff. This indicates the image can
> operate at any load address, and U-Boot will avoid automtically
> copying it anywhere. In this case, the entry-point field is
> specified relative to the start of the image payload.
>
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
How do I test this one, please?
Regards,
Simon
> ---
> Wolfgang,
>
> This is an much simpler and less invasive alternative to my previous
> IH_TYPE_KERNEL_REL patch. If it's OK, you can ignore that patch.
>
> u-boot.bin sizes for Tegra Seaboard without/with this config option on:
>
> text data bss dec hex filename
> 165858 3565 217016 386439 5e587 ./u-boot
>
> with:
>
> text data bss dec hex filename
> 165950 3565 217012 386527 5e5df ./u-boot
>
> README | 23 +++++++++++++++++++++++
> common/cmd_bootm.c | 4 ++++
> common/image.c | 27 +++++++++++++++++++++++++++
> include/image.h | 4 ++++
> 4 files changed, 58 insertions(+), 0 deletions(-)
>
> diff --git a/README b/README
> index eb9ade9..480cfe3 100644
> --- a/README
> +++ b/README
> @@ -3177,6 +3177,29 @@ Low Level (hardware related) configuration options:
> be used if available. These functions may be faster under some
> conditions but may increase the binary size.
>
> +Image-related options:
> +---------------------------------------------------
> +
> +- CONFIG_SYS_RELOCATABLE_IMAGES
> +
> + The legacy uImage format includes an absolute load and entry-
> + point address. When presented with a uImage in memory that
> + isn't loaded at the address in the image's load address,
> + U-Boot will relocate the image to its address in the header.
> +
> + Some payloads can actually be loaded and used at any arbitrary
> + address. An example is an ARM Linux kernel zImage file. This
> + is useful when sharing a single zImage across multiple boards
> + with different memory layouts, or U-Boot builds with different
> + ${load_addr} since sharing a single absolute load address may
> + not be possible.
> +
> + With this config option enabled, an image header may contain a
> + load address of -1/0xffffffff. This indicates the image can
> + operate at any load address, and U-Boot will avoid automtically
> + copying it anywhere. In this case, the entry-point field is
> + specified relative to the start of the image payload.
> +
> Building the Software:
> ======================
>
> diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
> index bb9b698..de08bbc 100644
> --- a/common/cmd_bootm.c
> +++ b/common/cmd_bootm.c
> @@ -730,6 +730,10 @@ static image_header_t *image_get_kernel (ulong img_addr, int verify)
> return NULL;
> }
>
> +#ifdef CONFIG_SYS_RELOCATABLE_IMAGES
> + image_fixup_load_entry(hdr);
> +#endif
> +
> show_boot_progress (3);
> image_print_contents (hdr);
>
> diff --git a/common/image.c b/common/image.c
> index 32ad4da..a746c6f 100644
> --- a/common/image.c
> +++ b/common/image.c
> @@ -342,6 +342,25 @@ void image_print_contents (const void *ptr)
> }
> }
>
> +#ifdef CONFIG_SYS_RELOCATABLE_IMAGES
> +void image_fixup_load_entry(image_header_t *hdr)
> +{
> + ulong load;
> + ulong hsize;
> + ulong ep;
> +
> + load = image_get_load(hdr);
> + if (load != -1)
> + return;
> +
> + load = (ulong)hdr;
> + hsize = image_get_header_size();
> + ep = load + hsize + image_get_ep(hdr);
> +
> + image_set_load(hdr, load);
> + image_set_ep(hdr, ep);
> +}
> +#endif
>
> #ifndef USE_HOSTCC
> /**
> @@ -379,6 +398,10 @@ static const image_header_t *image_get_ramdisk (ulong rd_addr, uint8_t arch,
> return NULL;
> }
>
> +#ifdef CONFIG_SYS_RELOCATABLE_IMAGES
> + image_fixup_load_entry((image_header_t *)rd_hdr);
> +#endif
> +
> show_boot_progress (10);
> image_print_contents (rd_hdr);
>
> @@ -1116,6 +1139,10 @@ static const image_header_t *image_get_fdt (ulong fdt_addr)
> }
> puts ("OK\n");
>
> +#ifdef CONFIG_SYS_RELOCATABLE_IMAGES
> + image_fixup_load_entry((image_header_t *)fdt_hdr);
> +#endif
> +
> if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) {
> fdt_error ("uImage is not a fdt");
> return NULL;
> diff --git a/include/image.h b/include/image.h
> index b7caaa6..c680f1f 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -332,6 +332,10 @@ int genimg_get_format (void *img_addr);
> int genimg_has_config (bootm_headers_t *images);
> ulong genimg_get_image (ulong img_addr);
>
> +#ifdef CONFIG_SYS_RELOCATABLE_IMAGES
> +void image_fixup_load_entry(image_header_t *hdr);
> +#endif
> +
> int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
> uint8_t arch, ulong *rd_start, ulong *rd_end);
>
> --
> 1.7.4.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
More information about the U-Boot
mailing list