[PATCH v2] arm: fix zImage support when a oftree is concatenated
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Wed Apr 11 02:38:18 EDT 2012
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;
+ }
+
+ 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
More information about the barebox
mailing list