diff options
author | Clement Leger <cleger@kalray.eu> | 2020-06-12 09:10:34 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-06-15 16:15:13 +0200 |
commit | aff0f38d5e702286cc2560c6b3f6a5fc24b7f557 (patch) | |
tree | 3eac4080d1b7fa281c4e1f0feb3f6038893e2188 | |
parent | 7a7cc824c7d748eb6b6821c2fcdb04074cede97b (diff) | |
download | barebox-aff0f38d5e702286cc2560c6b3f6a5fc24b7f557.tar.gz barebox-aff0f38d5e702286cc2560c6b3f6a5fc24b7f557.tar.xz |
common: elf: add elf_open, elf_close and elf_load
In order to integrate elf loading into bootm command, split elf opening
from elf loading.
Signed-off-by: Clement Leger <cleger@kalray.eu>
Tested-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/mips/lib/bootm.c | 8 | ||||
-rw-r--r-- | common/elf.c | 20 | ||||
-rw-r--r-- | include/elf.h | 5 |
3 files changed, 16 insertions, 17 deletions
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c index b07884ae02..8e16994b62 100644 --- a/arch/mips/lib/bootm.c +++ b/arch/mips/lib/bootm.c @@ -50,10 +50,14 @@ static int do_bootm_elf(struct image_data *data) void *fdt; int ret = 0; - elf = elf_load_image(data->os_file); + elf = elf_open(data->os_file); if (IS_ERR(elf)) return PTR_ERR(elf); + ret = elf_load(elf); + if (ret) + goto bootm_elf_done; + fdt = bootm_get_devicetree(data); if (IS_ERR(fdt)) { ret = PTR_ERR(fdt); @@ -76,7 +80,7 @@ static int do_bootm_elf(struct image_data *data) ret = -EINVAL; bootm_elf_done: - elf_release_image(elf); + elf_close(elf); free(fdt); return ret; diff --git a/common/elf.c b/common/elf.c index 1bcaafea74..af22be37e6 100644 --- a/common/elf.c +++ b/common/elf.c @@ -285,23 +285,17 @@ err_free_elf: return ERR_PTR(ret); } -struct elf_image *elf_load_image(const char *filename) +struct elf_image *elf_open(const char *filename) { - int ret; - struct elf_image *elf; - - elf = elf_check_init(filename); - if (IS_ERR(elf)) - return elf; - - ret = load_elf_image_segments(elf); - if (ret) - return ERR_PTR(ret); + return elf_check_init(filename); +} - return elf; +int elf_load(struct elf_image *elf) +{ + return load_elf_image_segments(elf); } -void elf_release_image(struct elf_image *elf) +void elf_close(struct elf_image *elf) { elf_release_regions(elf); diff --git a/include/elf.h b/include/elf.h index f1a80a20a5..7970fd2c95 100644 --- a/include/elf.h +++ b/include/elf.h @@ -414,8 +414,9 @@ 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(const char *filename); -void elf_release_image(struct elf_image *elf); +struct elf_image *elf_open(const char *filename); +void elf_close(struct elf_image *elf); +int elf_load(struct elf_image *elf); #define ELF_GET_FIELD(__s, __field, __type) \ static inline __type elf_##__s##_##__field(struct elf_image *elf, void *arg) { \ |