[PATCH v2] arm: fix zImage support when a oftree is concatenated

Sascha Hauer s.hauer at pengutronix.de
Wed Apr 11 04:12:14 EDT 2012


On Wed, Apr 11, 2012 at 08:38:18AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> When a oftree is concatenated,the zImage is bigger than the size specified in
> the zImage header. Detect it and copy it too.
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  arch/arm/lib/bootm.c |   49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 49 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index defc89b..dc379d8 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -123,6 +123,51 @@ struct zimage_header {
>  
>  #define ZIMAGE_MAGIC 0x016F2818
>  
> +static int do_bootz_linux_fdt(int fd, struct image_data *data)
> +{
> +	struct fdt_header __header, *header;
> +	struct resource *r = data->os_res;
> +	struct resource *of_res = data->os_res;
> +	void *oftree;
> +	int ret;
> +
> +	u32 end;
> +
> +	header = &__header;
> +	ret = read(fd, header, sizeof(*header));
> +	if (ret < sizeof(*header))
> +		return ret;
> +
> +	if (file_detect_type(header) != filetype_oftree)
> +		return -ENXIO;
> +
> +	end = be32_to_cpu(header->totalsize);
> +
> +	of_res = request_sdram_region("oftree", r->start + r->size, end);
> +	if (!of_res) {
> +		perror("zImage: oftree request_sdram_region");
> +		return -ENOMEM;
> +	}
> +
> +	oftree = (void*)of_res->start;
> +
> +	memcpy(oftree, header, sizeof(*header));
> +
> +	end -= sizeof(*header);
> +
> +	ret = read_full(fd, oftree + sizeof(*header), end);
> +	if (ret < 0)
> +		return ret;
> +	if (ret < end) {
> +		printf("premature end of image\n");
> +		return -EIO;
> +	}

I am missing a call to of_fix_tree() here. Without it the command line
will not be passed to the kernel. Maybe this is not really the intended
usecase for appending an oftree to the zImage. Being able to append the
oftree to the zImage seems more for bootloaders which do not have native
support for devicetrees.

We could be more clever here and read the oftree to a seperately
allocated area and set data->oftree then.

Sascha

> +
> +	pr_info("zImage: concatenated oftree detected\n");
> +
> +	return 0;
> +}
> +
>  static int do_bootz_linux(struct image_data *data)
>  {
>  	int fd, ret, swap = 0;
> @@ -196,6 +241,10 @@ static int do_bootz_linux(struct image_data *data)
>  			*(u32 *)ptr = swab32(*(u32 *)ptr);
>  	}
>  
> +	ret = do_bootz_linux_fdt(fd, data);
> +	if (ret && ret != -ENXIO)
> +		return ret;
> +
>  	return __do_bootm_linux(data, swap);
>  
>  err_out:
> -- 
> 1.7.9.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list