Message ID | 20240410212153.6854-1-Maxim.Moskalets@kaspersky.com |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
Series | cmd: bootm: add ELF file support | expand |
Hi Maxim, On 4/10/24 23:21, Maxim Moskalets wrote: > From: Maxim Moskalets <maximmosk4@gmail.com> > > Some operating systems (e.g. seL4) and embedded applications are ELF > images. It is convenient to use FIT-images to implement trusted boot. > Added "elf" image type for booting using bootm command. > > Signed-off-by: Maxim Moskalets <maximmosk4@gmail.com> > --- > boot/bootm_os.c | 24 ++++++++++++++++++++++++ > boot/image-fit.c | 3 ++- > boot/image.c | 3 +++ > include/image.h | 1 + > 4 files changed, 30 insertions(+), 1 deletion(-) > > diff --git a/boot/bootm_os.c b/boot/bootm_os.c > index ccde72d22c..1c92b8149c 100644 > --- a/boot/bootm_os.c > +++ b/boot/bootm_os.c > @@ -395,6 +395,27 @@ static int do_bootm_qnxelf(int flag, struct bootm_info *bmi) > } > #endif > > +#if defined(CONFIG_CMD_ELF) > +static int do_bootm_elf(int flag, struct bootm_info *bmi) > +{ > + struct bootm_headers *images = bmi->images; > + char *local_args[2] = {NULL}; > + char str[19] = ""; /* "0x" + 16 digits + "\0" */ > + > + if (flag != BOOTM_STATE_OS_GO) > + return 0; > + > + sprintf(str, "0x%lx", images->ep); /* write entry-point into string */ > + str[18] = '\0'; This does seem like snprintf would be useful here? """ snprintf(str, 19, "0x%lx", images-ep); """ safest and also merges the two instructions in one. Also, have another question, do we want to 0-left-pad the value so that it's always a 16 hex-digit number? e.g. 0x%016lx Cheers, Quentin
diff --git a/boot/bootm_os.c b/boot/bootm_os.c index ccde72d22c..1c92b8149c 100644 --- a/boot/bootm_os.c +++ b/boot/bootm_os.c @@ -395,6 +395,27 @@ static int do_bootm_qnxelf(int flag, struct bootm_info *bmi) } #endif +#if defined(CONFIG_CMD_ELF) +static int do_bootm_elf(int flag, struct bootm_info *bmi) +{ + struct bootm_headers *images = bmi->images; + char *local_args[2] = {NULL}; + char str[19] = ""; /* "0x" + 16 digits + "\0" */ + + if (flag != BOOTM_STATE_OS_GO) + return 0; + + sprintf(str, "0x%lx", images->ep); /* write entry-point into string */ + str[18] = '\0'; + local_args[0] = bmi->argv[0]; + local_args[1] = str; /* and provide it via the arguments */ + + do_bootelf(NULL, 0, 2, local_args); + + return 1; +} +#endif + #ifdef CONFIG_INTEGRITY static int do_bootm_integrity(int flag, struct bootm_info *bmi) { @@ -536,6 +557,9 @@ static boot_os_fn *boot_os[] = { #ifdef CONFIG_BOOTM_EFI [IH_OS_EFI] = do_bootm_efi, #endif +#if defined(CONFIG_CMD_ELF) + [IH_OS_ELF] = do_bootm_elf, +#endif }; /* Allow for arch specific config before we boot */ diff --git a/boot/image-fit.c b/boot/image-fit.c index 89e377563c..0419bef6d2 100644 --- a/boot/image-fit.c +++ b/boot/image-fit.c @@ -2180,7 +2180,8 @@ int fit_image_load(struct bootm_headers *images, ulong addr, fit_image_check_os(fit, noffset, IH_OS_TEE) || fit_image_check_os(fit, noffset, IH_OS_OPENRTOS) || fit_image_check_os(fit, noffset, IH_OS_EFI) || - fit_image_check_os(fit, noffset, IH_OS_VXWORKS); + fit_image_check_os(fit, noffset, IH_OS_VXWORKS) || + fit_image_check_os(fit, noffset, IH_OS_ELF); /* * If either of the checks fail, we should report an error, but diff --git a/boot/image.c b/boot/image.c index 073931cd7a..5b88d6808c 100644 --- a/boot/image.c +++ b/boot/image.c @@ -134,6 +134,9 @@ static const table_entry_t uimage_os[] = { #endif { IH_OS_OPENSBI, "opensbi", "RISC-V OpenSBI", }, { IH_OS_EFI, "efi", "EFI Firmware" }, +#ifdef CONFIG_CMD_ELF + { IH_OS_ELF, "elf", "ELF Image" }, +#endif { -1, "", "", }, }; diff --git a/include/image.h b/include/image.h index 21de70f0c9..9a40bca22c 100644 --- a/include/image.h +++ b/include/image.h @@ -100,6 +100,7 @@ enum { IH_OS_TEE, /* Trusted Execution Environment */ IH_OS_OPENSBI, /* RISC-V OpenSBI */ IH_OS_EFI, /* EFI Firmware (e.g. GRUB2) */ + IH_OS_ELF, /* ELF Image (e.g. seL4) */ IH_OS_COUNT, };