From: "Clément Léger" <clement.leger@bootlin.com>
To: Jules Maselbas <jmaselbas@kalray.eu>
Cc: barebox@lists.infradead.org, Louis Morhet <lmorhet@kalray.eu>,
Luc Michel <lmichel@kalray.eu>,
Yann Sionneau <ysionneau@kalray.eu>,
Clement Leger <cleger@kalray.eu>
Subject: Re: [PATCH 04/13] common: elf: add elf_load_binary
Date: Fri, 14 Jan 2022 18:21:09 +0100 [thread overview]
Message-ID: <20220114182109.6dfe1836@fixe.home> (raw)
In-Reply-To: <20220114165208.9980-5-jmaselbas@kalray.eu>
Le Fri, 14 Jan 2022 17:52:03 +0100,
Jules Maselbas <jmaselbas@kalray.eu> a écrit :
> From: Clement Leger <cleger@kalray.eu>
>
> In order to load elf from a binary buffer, add elf_load_binary. This
> will be used by FIT support to allow loading an elf from FIT.
>
> Signed-off-by: Clement Leger <cleger@kalray.eu>
Hi Jules,
This is not my mail address anymore, could you update it with
clement.leger@bootlin.com ?
Thanks.
> Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu>
> ---
> common/elf.c | 83 +++++++++++++++++++++++++++++++++++++--------------
> include/elf.h | 1 +
> 2 files changed, 62 insertions(+), 22 deletions(-)
>
> diff --git a/common/elf.c b/common/elf.c
> index af22be37e6..f10fb77953 100644
> --- a/common/elf.c
> +++ b/common/elf.c
> @@ -101,15 +101,17 @@ static int elf_section_cmp(void *priv, struct list_head *a, struct list_head *b)
> static int load_elf_to_memory(struct elf_image *elf)
> {
> void *dst;
> - int ret, fd;
> + int ret, fd = -1;
> u64 p_filesz, p_memsz, p_offset;
> struct elf_section *r;
> struct list_head *list = &elf->list;
>
> - fd = open(elf->filename, O_RDONLY);
> - if (fd < 0) {
> - pr_err("could not open: %s\n", errno_str());
> - return -errno;
> + if (elf->filename) {
> + fd = open(elf->filename, O_RDONLY);
> + if (fd < 0) {
> + pr_err("could not open: %s\n", errno_str());
> + return -errno;
> + }
> }
>
> list_for_each_entry(r, list, list) {
> @@ -118,21 +120,26 @@ static int load_elf_to_memory(struct elf_image *elf)
> p_memsz = elf_phdr_p_memsz(elf, r->phdr);
> dst = (void *) (phys_addr_t) elf_phdr_p_paddr(elf, r->phdr);
>
> - ret = lseek(fd, p_offset, SEEK_SET);
> - if (ret == -1) {
> - pr_err("lseek at offset 0x%llx failed\n", p_offset);
> - close(fd);
> - return ret;
> - }
> -
> pr_debug("Loading phdr offset 0x%llx to 0x%p (%llu bytes)\n",
> p_offset, dst, p_filesz);
>
> - if (read_full(fd, dst, p_filesz) < 0) {
> - pr_err("could not read elf segment: %s\n",
> - errno_str());
> - close(fd);
> - return -errno;
> + if (fd >= 0) {
> + ret = lseek(fd, p_offset, SEEK_SET);
> + if (ret == -1) {
> + pr_err("lseek at offset 0x%llx failed\n",
> + p_offset);
> + close(fd);
> + return ret;
> + }
> +
> + if (read_full(fd, dst, p_filesz) < 0) {
> + pr_err("could not read elf segment: %s\n",
> + errno_str());
> + close(fd);
> + return -errno;
> + }
> + } else {
> + memcpy(dst, elf->hdr_buf + p_offset, p_filesz);
> }
>
> if (p_filesz < p_memsz)
> @@ -202,6 +209,37 @@ static int elf_check_image(struct elf_image *elf, void *buf)
> return 0;
> }
>
> +static void elf_init_struct(struct elf_image *elf)
> +{
> + INIT_LIST_HEAD(&elf->list);
> + elf->low_addr = (void *) (unsigned long) -1;
> + elf->high_addr = 0;
> + elf->filename = NULL;
> +}
> +
> +struct elf_image *elf_open_binary(void *buf)
> +{
> + int ret;
> + struct elf_image *elf;
> +
> + elf = calloc(1, sizeof(*elf));
> + if (!elf)
> + return ERR_PTR(-ENOMEM);
> +
> + elf_init_struct(elf);
> +
> + elf->hdr_buf = buf;
> + ret = elf_check_image(elf, buf);
> + if (ret) {
> + free(elf);
> + return ERR_PTR(-EINVAL);
> + }
> +
> + elf->entry = elf_hdr_e_entry(elf, elf->hdr_buf);
> +
> + return elf;
> +}
> +
> static struct elf_image *elf_check_init(const char *filename)
> {
> int ret, fd;
> @@ -213,9 +251,7 @@ static struct elf_image *elf_check_init(const char *filename)
> if (!elf)
> return ERR_PTR(-ENOMEM);
>
> - INIT_LIST_HEAD(&elf->list);
> - elf->low_addr = (void *) (unsigned long) -1;
> - elf->high_addr = 0;
> + elf_init_struct(elf);
>
> /* First pass is to read elf header only */
> fd = open(filename, O_RDONLY);
> @@ -299,7 +335,10 @@ void elf_close(struct elf_image *elf)
> {
> elf_release_regions(elf);
>
> - free(elf->hdr_buf);
> - free(elf->filename);
> + if (elf->filename) {
> + free(elf->hdr_buf);
> + free(elf->filename);
> + }
> +
> free(elf);
> }
> diff --git a/include/elf.h b/include/elf.h
> index 7970fd2c95..12673e93ed 100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -414,6 +414,7 @@ static inline size_t elf_get_mem_size(struct elf_image *elf)
> return elf->high_addr - elf->low_addr;
> }
>
> +struct elf_image *elf_open_binary(void *buf);
> struct elf_image *elf_open(const char *filename);
> void elf_close(struct elf_image *elf);
> int elf_load(struct elf_image *elf);
--
Clément Léger,
Embedded Linux and Kernel engineer at Bootlin
https://bootlin.com
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2022-01-14 17:23 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-14 16:51 [PATCH 00/13] kvx arch update Jules Maselbas
2022-01-14 16:52 ` [PATCH 01/13] kvx: dma: Remove arch dma_map/unmap_single Jules Maselbas
2022-01-14 16:52 ` [PATCH 02/13] kvx: Move LINUX_BOOT_PARAM_MAGIC in asm/common.h Jules Maselbas
2022-01-14 16:52 ` [PATCH 03/13] kvx: Accept LINUX_BOOT_PARAM_MAGIC as a valid magic value Jules Maselbas
2022-01-14 16:52 ` [PATCH 04/13] common: elf: add elf_load_binary Jules Maselbas
2022-01-14 17:21 ` Clément Léger [this message]
2022-01-14 17:24 ` Jules Maselbas
2022-01-14 16:52 ` [PATCH 05/13] kvx: enable FITIMAGE support Jules Maselbas
2022-01-14 16:52 ` [PATCH 06/13] clocksource: kvx: Register as postcore_platform_driver Jules Maselbas
2022-01-14 16:52 ` [PATCH 07/13] watchdog: kvx: do not disable watchdog on probe Jules Maselbas
2022-01-14 16:52 ` [PATCH 08/13] nvmem: add kvx otp non volatile regbank support Jules Maselbas
2022-01-17 8:24 ` Sascha Hauer
2022-01-17 11:17 ` Jules Maselbas
2022-01-14 16:52 ` [PATCH 09/13] kvx: add kvx_sfr_field_val Jules Maselbas
2022-01-14 16:54 ` [PATCH 10/13] drivers: add soc hierarchy properly Jules Maselbas
2022-01-14 16:54 ` [PATCH 11/13] soc: add kvx_socinfo driver Jules Maselbas
2022-01-14 16:54 ` [PATCH 12/13] kvx: Update defconfig Jules Maselbas
2022-01-14 16:54 ` [PATCH 13/13] kvx: dts: Update k200.dts Jules Maselbas
2022-01-14 17:31 ` Clément Léger
2022-01-14 17:06 ` [PATCH 10/13] drivers: add soc hierarchy properly Ahmad Fatoum
2022-01-14 17:11 ` Jules Maselbas
2022-01-14 17:20 ` Ahmad Fatoum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220114182109.6dfe1836@fixe.home \
--to=clement.leger@bootlin.com \
--cc=barebox@lists.infradead.org \
--cc=cleger@kalray.eu \
--cc=jmaselbas@kalray.eu \
--cc=lmichel@kalray.eu \
--cc=lmorhet@kalray.eu \
--cc=ysionneau@kalray.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.