summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClement Leger <cleger@kalray.eu>2020-06-12 09:10:34 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-06-15 16:15:13 +0200
commitaff0f38d5e702286cc2560c6b3f6a5fc24b7f557 (patch)
tree3eac4080d1b7fa281c4e1f0feb3f6038893e2188
parent7a7cc824c7d748eb6b6821c2fcdb04074cede97b (diff)
downloadbarebox-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.c8
-rw-r--r--common/elf.c20
-rw-r--r--include/elf.h5
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) { \