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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxxxxxx
> 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 |

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


[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux