From 129fd6b6cdfd067ed315f558409df03beb2a4533 Mon Sep 17 00:00:00 2001 From: Clement Leger Date: Mon, 17 Jan 2022 23:19:11 +0100 Subject: kvx: enable FITIMAGE support 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 Signed-off-by: Jules Maselbas Link: https://lore.barebox.org/20220117221917.26970-6-jmaselbas@kalray.eu Signed-off-by: Sascha Hauer --- arch/kvx/Kconfig | 1 + arch/kvx/lib/bootm.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'arch') 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; -- cgit v1.2.3