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 ac83ec7..813927a 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -124,6 +124,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; + } + + pr_info("zImage: concatenated oftree detected\n"); + + return 0; +} + static int do_bootz_linux(struct image_data *data) { int fd, ret, swap = 0; @@ -197,6 +242,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