In order to correctly load an initrd or a device tree after an elf file, we need to know its boundaries. This commit adds support for that and allow the bootm implementations to use it for memory loading. Signed-off-by: Clement Leger <cleger@xxxxxxxxx> --- common/elf.c | 7 +++++++ include/elf.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/common/elf.c b/common/elf.c index 4733accb0..d64de401c 100644 --- a/common/elf.c +++ b/common/elf.c @@ -59,6 +59,11 @@ static int load_elf_phdr_segment(struct elf_image *elf, void *src, if (!p_filesz) return 0; + if (dst < elf->low_addr) + elf->low_addr = dst; + if (dst + p_memsz > elf->high_addr) + elf->high_addr = dst + p_memsz; + pr_debug("Loading phdr to 0x%p (%llu bytes)\n", dst, p_filesz); ret = elf_request_region(elf, (resource_size_t)dst, p_filesz); @@ -124,6 +129,8 @@ struct elf_image *elf_load_image(void *buf) INIT_LIST_HEAD(&elf->list); elf->buf = buf; + elf->low_addr = (void *) (unsigned long) -1; + elf->high_addr = 0; ret = elf_check_image(elf); if (ret) diff --git a/include/elf.h b/include/elf.h index 113728f08..403412f3f 100644 --- a/include/elf.h +++ b/include/elf.h @@ -403,9 +403,16 @@ struct elf_image { struct list_head list; u8 class; u64 entry; + void *low_addr; + void *high_addr; void *buf; }; +static inline size_t elf_get_mem_size(struct elf_image *elf) +{ + return elf->high_addr - elf->low_addr; +} + struct elf_image *elf_load_image(void *buf); void elf_release_image(struct elf_image *elf); -- 2.17.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox