[PATCH v2 05/11] kvx: enable FITIMAGE support
Jules Maselbas
jmaselbas at kalray.eu
Mon Jan 17 14:19:11 PST 2022
From: Clement Leger <clement.leger at bootlin.com>
Enable FITIMAGE support in kvx defconfig and add code to handle fit boot
from bootm command. This is rather a simple addition and it allow to boot
a fit image containing an ELF file as the kernel.
Signed-off-by: Clement Leger <clement.leger at bootlin.com>
Signed-off-by: Jules Maselbas <jmaselbas at kalray.eu>
---
arch/kvx/Kconfig | 1 +
arch/kvx/lib/bootm.c | 32 +++++++++++++++++++++++++++++++-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/arch/kvx/Kconfig b/arch/kvx/Kconfig
index 0934440880..100a945761 100644
--- a/arch/kvx/Kconfig
+++ b/arch/kvx/Kconfig
@@ -10,6 +10,7 @@ config KVX
select COMMON_CLK_OF_PROVIDER
select ELF
select FLEXIBLE_BOOTARGS
+ select FITIMAGE
select GENERIC_FIND_NEXT_BIT
select HAS_ARCH_SJLJ
select HAS_CACHE
diff --git a/arch/kvx/lib/bootm.c b/arch/kvx/lib/bootm.c
index 3e9772c458..4c77f676ec 100644
--- a/arch/kvx/lib/bootm.c
+++ b/arch/kvx/lib/bootm.c
@@ -94,7 +94,7 @@ static int do_boot_elf(struct image_data *data, struct elf_image *elf)
goto err_free_fdt;
}
- entry = (boot_func_entry) data->os_address;
+ entry = (boot_func_entry) elf->entry;
ret = do_boot_entry(data, entry, fdt);
@@ -104,6 +104,27 @@ err_free_fdt:
return ret;
}
+static int do_bootm_fit(struct image_data *data)
+{
+ int ret;
+ struct elf_image *elf;
+
+ elf = elf_open_binary((void *) data->fit_kernel);
+ 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;
+}
+
static int do_bootm_elf(struct image_data *data)
{
int ret;
@@ -121,6 +142,12 @@ static struct image_handler elf_handler = {
.filetype = filetype_elf,
};
+static struct image_handler fit_handler = {
+ .name = "FIT",
+ .bootm = do_bootm_fit,
+ .filetype = filetype_oftree,
+};
+
static struct binfmt_hook binfmt_elf_hook = {
.type = filetype_elf,
.exec = "bootm",
@@ -130,6 +157,9 @@ static int kvx_register_image_handler(void)
{
register_image_handler(&elf_handler);
+ if (IS_ENABLED(CONFIG_FITIMAGE))
+ register_image_handler(&fit_handler);
+
binfmt_register(&binfmt_elf_hook);
return 0;
--
2.17.1
More information about the barebox
mailing list