From: Sascha Hauer <s.hauer@pengutronix.de>
To: Barebox List <barebox@lists.infradead.org>
Subject: [PATCH 1/2] bootm: move ELF handling to bootm handlers
Date: Mon, 7 Apr 2025 15:07:28 +0200 [thread overview]
Message-ID: <20250407130729.2889508-1-s.hauer@pengutronix.de> (raw)
The generic bootm code is for picking the correct OS, device tree and
initrd files. Additionally it parses the container formats like FIT and
uImage. It has no business to handle particular image formats, so push
the ELF handling back to the image handlers themselves. The resulting
diffstat is negative, so having the ELF code inside bootm doesn't really
serve a purpose. Move it out there.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/Kconfig | 8 ++++++++
arch/arm/cpu/Makefile | 2 +-
arch/arm/cpu/bootm-elf.c | 28 ++++++++++++++++++++--------
arch/kvx/Kconfig | 1 -
arch/kvx/lib/bootm.c | 22 +++++++++++++---------
arch/mips/lib/bootm.c | 18 +++++++++++++-----
common/Kconfig | 8 --------
common/bootm.c | 29 -----------------------------
include/bootm.h | 3 ---
9 files changed, 55 insertions(+), 64 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 7d46dcfb63..ab7ff5369b 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -465,6 +465,14 @@ config ARM_MODULE_PLTS
Say y if your memory configuration puts the heap to far away from the
barebox image, causing relocation out of range errors
+config ARM_BOOTM_ELF
+ bool
+ depends on BOOTM
+ select ELF
+ prompt "elf loading support"
+ help
+ Add support to load elf file with bootm.
+
config ARM_ATF
bool
diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
index 1769249645..d59aae1ee5 100644
--- a/arch/arm/cpu/Makefile
+++ b/arch/arm/cpu/Makefile
@@ -31,7 +31,7 @@ obj-$(CONFIG_ARM_SEMIHOSTING) += semihosting-trap_$(S64_32).o
obj-$(CONFIG_CMD_ARM_CPUINFO) += cpuinfo.o
obj-$(CONFIG_MMUINFO) += mmuinfo.o mmuinfo_$(S64_32).o
obj-$(CONFIG_OFDEVICE) += dtb.o
-obj-$(CONFIG_BOOTM_ELF) += bootm-elf.o
+obj-$(CONFIG_ARM_BOOTM_ELF) += bootm-elf.o
ifeq ($(CONFIG_MMU),)
obj-$(CONFIG_CPU_32v7) += no-mmu.o
diff --git a/arch/arm/cpu/bootm-elf.c b/arch/arm/cpu/bootm-elf.c
index bcca3931f2..d3132b6f5a 100644
--- a/arch/arm/cpu/bootm-elf.c
+++ b/arch/arm/cpu/bootm-elf.c
@@ -12,26 +12,33 @@ static int do_bootm_elf(struct image_data *data)
{
void (*fn)(unsigned long x0, unsigned long x1, unsigned long x2,
unsigned long x3);
- struct elf_image *elf = data->elf;
+ struct elf_image *elf;
int ret;
+ elf = elf_open(data->os_file);
+ if (IS_ERR(elf))
+ return PTR_ERR(elf);
+
if (elf_hdr_e_machine(elf, elf->hdr_buf) != ELF_ARCH) {
pr_err("Unsupported machine: 0x%02x, but 0x%02x expected\n",
elf_hdr_e_machine(elf, elf->hdr_buf), ELF_ARCH);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err;
}
- ret = bootm_load_os(data, data->os_address);
+ ret = elf_load(elf);
if (ret)
- return ret;
+ goto err;
- if (data->dryrun)
- return ret;
+ if (data->dryrun) {
+ ret = 0;
+ goto err;
+ }
ret = of_overlay_load_firmware();
if (ret)
- return ret;
+ goto err;
shutdown_barebox();
@@ -40,7 +47,12 @@ static int do_bootm_elf(struct image_data *data)
fn(0, 0, 0, 0);
pr_err("ELF application terminated\n");
- return -EINVAL;
+ ret = -EINVAL;
+
+err:
+ elf_close(elf);
+
+ return ret;
}
static struct image_handler elf_handler = {
diff --git a/arch/kvx/Kconfig b/arch/kvx/Kconfig
index 9b733cd792..bb662e4fd8 100644
--- a/arch/kvx/Kconfig
+++ b/arch/kvx/Kconfig
@@ -4,7 +4,6 @@ config KVX
bool
select 64BIT
select BOOTM
- select BOOTM_ELF
select BOOTM_OFTREE
select BOOTM_INITRD
select COMMON_CLK
diff --git a/arch/kvx/lib/bootm.c b/arch/kvx/lib/bootm.c
index 42c15ff273..3cb2521842 100644
--- a/arch/kvx/lib/bootm.c
+++ b/arch/kvx/lib/bootm.c
@@ -60,6 +60,10 @@ static int do_boot_elf(struct image_data *data, struct elf_image *elf)
boot_func_entry entry;
unsigned long load_addr, initrd_address;
+ ret = elf_load(elf);
+ if (ret)
+ return ret;
+
/* load initrd after the elf */
load_addr = PAGE_ALIGN((unsigned long) elf->high_addr);
if (data->initrd_address != UIMAGE_INVALID_ADDRESS)
@@ -112,13 +116,8 @@ static int do_bootm_fit(struct image_data *data)
if (IS_ERR(elf))
return PTR_ERR(data->elf);
- ret = elf_load(elf);
- if (ret)
- goto close_elf;
-
ret = do_boot_elf(data, elf);
-close_elf:
elf_close(elf);
return ret;
@@ -126,13 +125,18 @@ static int do_bootm_fit(struct image_data *data)
static int do_bootm_elf(struct image_data *data)
{
+ struct elf_image *elf;
int ret;
- ret = bootm_load_os(data, data->os_address);
- if (ret)
- return ret;
+ elf = elf_open(data->os_file);
+ if (IS_ERR(elf))
+ return PTR_ERR(elf);
+
+ ret = do_boot_elf(data, elf);
+
+ elf_close(elf);
- return do_boot_elf(data, data->elf);
+ return ret;
}
static struct image_handler elf_handler = {
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index 86573dec7f..a623b1c83b 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -58,20 +58,26 @@ static int do_bootm_elf(struct image_data *data)
{
void (*entry)(int, void *);
void *fdt;
+ struct elf_image *elf;
int ret = 0;
- ret = bootm_load_os(data, data->os_address);
+ elf = elf_open(data->os_file);
+ if (IS_ERR(elf))
+ return PTR_ERR(elf);
+
+ ret = elf_load(elf);
if (ret)
- return ret;
+ goto err;
fdt = bootm_get_devicetree(data);
if (IS_ERR(fdt)) {
pr_err("Failed to load dtb\n");
- return PTR_ERR(fdt);
+ ret = PTR_ERR(fdt);
+ goto bootm_free_fdt;
}
pr_info("Starting application at 0x%08lx, dts 0x%p...\n",
- data->os_address, data->of_root_node);
+ elf->entry, data->of_root_node);
if (data->dryrun)
goto bootm_free_fdt;
@@ -82,7 +88,7 @@ static int do_bootm_elf(struct image_data *data)
shutdown_barebox();
- entry = (void *) (unsigned long) data->os_address;
+ entry = (void *) (unsigned long) elf->entry;
entry(-2, fdt);
@@ -91,6 +97,8 @@ static int do_bootm_elf(struct image_data *data)
bootm_free_fdt:
free(fdt);
+err:
+ elf_close(elf);
return ret;
}
diff --git a/common/Kconfig b/common/Kconfig
index ddc76b2033..93ab618898 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -668,14 +668,6 @@ config PE
config ELF
bool "ELF Support" if COMPILE_TEST
-config BOOTM_ELF
- bool
- depends on BOOTM
- select ELF
- prompt "elf loading support"
- help
- Add support to load elf file with bootm.
-
config BOOTM_FITIMAGE
bool
prompt "FIT image support"
diff --git a/common/bootm.c b/common/bootm.c
index a5065c3860..69816cdf5b 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -211,9 +211,6 @@ int bootm_load_os(struct image_data *data, unsigned long load_address)
return 0;
}
- if (IS_ENABLED(CONFIG_ELF) && data->elf)
- return elf_load(data->elf);
-
if (!data->os_file)
return -EINVAL;
@@ -562,8 +559,6 @@ int bootm_get_os_size(struct image_data *data)
struct stat s;
int ret;
- if (data->elf)
- return elf_get_mem_size(data->elf);
if (image_is_uimage(data))
return uimage_get_size(data->os, uimage_part_num(data->os_part));
if (data->os_fit)
@@ -676,25 +671,6 @@ static int bootm_open_fit(struct image_data *data)
return 0;
}
-static int bootm_open_elf(struct image_data *data)
-{
- struct elf_image *elf;
-
- if (!IS_ENABLED(CONFIG_ELF))
- return -ENOSYS;
-
- elf = elf_open(data->os_file);
- if (IS_ERR(elf))
- return PTR_ERR(elf);
-
- pr_info("Entry Point: %08llx\n", elf->entry);
-
- data->os_address = elf->entry;
- data->elf = elf;
-
- return 0;
-}
-
static void bootm_print_info(struct image_data *data)
{
if (data->os_res)
@@ -800,9 +776,6 @@ int bootm_boot(struct bootm_data *bootm_data)
case filetype_uimage:
ret = bootm_open_os_uimage(data);
break;
- case filetype_elf:
- ret = bootm_open_elf(data);
- break;
default:
ret = 0;
break;
@@ -965,8 +938,6 @@ int bootm_boot(struct bootm_data *bootm_data)
uimage_close(data->initrd);
uimage_close(data->os);
}
- if (IS_ENABLED(CONFIG_ELF) && data->elf)
- elf_close(data->elf);
if (IS_ENABLED(CONFIG_FITIMAGE) && data->os_fit)
fit_close(data->os_fit);
if (data->of_root_node)
diff --git a/include/bootm.h b/include/bootm.h
index b86d06b0f5..bc6c69e813 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -53,9 +53,6 @@ struct image_data {
/* if os is an uImage this will be provided */
struct uimage_handle *os;
- /* if os is an elf file this will be provided */
- struct elf_image *elf;
-
/* if os is a FIT image this will be provided */
struct fit_handle *os_fit;
--
2.39.5
next reply other threads:[~2025-04-07 13:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-07 13:07 Sascha Hauer [this message]
2025-04-07 13:07 ` [PATCH 2/2] bootm: create generic FIT image handler Sascha Hauer
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=20250407130729.2889508-1-s.hauer@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox