diff mbox series

[v4] cmd: bootm: add ELF file support

Message ID 20240411085738.31779-1-Maxim.Moskalets@kaspersky.com
State Needs Review / ACK
Delegated to: Tom Rini
Headers show
Series [v4] cmd: bootm: add ELF file support | expand

Commit Message

Maxim M. Moskalets April 11, 2024, 8:57 a.m. UTC
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  | 23 +++++++++++++++++++++++
 boot/image-fit.c |  3 ++-
 boot/image.c     |  3 +++
 include/image.h  |  1 +
 4 files changed, 29 insertions(+), 1 deletion(-)

Comments

Heinrich Schuchardt April 11, 2024, 10:57 a.m. UTC | #1
On 11.04.24 10:57, 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  | 23 +++++++++++++++++++++++
>   boot/image-fit.c |  3 ++-
>   boot/image.c     |  3 +++
>   include/image.h  |  1 +
>   4 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/boot/bootm_os.c b/boot/bootm_os.c
> index ccde72d22c..f6b46cf57f 100644
> --- a/boot/bootm_os.c
> +++ b/boot/bootm_os.c
> @@ -395,6 +395,26 @@ 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;
> +
> +	snprintf(str, ARRAY_SIZE(str), "0x%lx", images->ep); /* write entry-point into string */
> +	local_args[0] = bmi->argv[0];
> +	local_args[1] = str;	/* and provide it via the arguments */
> +
> +	do_bootelf(NULL, 0, 2, local_args);

Booting should be possible without having a command line interface.
See commit 7c4647b8fb44 (Merge patch series "Complete decoupling of
bootm logic from commands")

The functionality to boot an ELF binary should be carved out into
library function. The interface should not use argv[], argc.

Best regards

Heinrich

> +
> +	return 1;
> +}
> +#endif
> +
>   #ifdef CONFIG_INTEGRITY
>   static int do_bootm_integrity(int flag, struct bootm_info *bmi)
>   {
> @@ -536,6 +556,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,
>   };
diff mbox series

Patch

diff --git a/boot/bootm_os.c b/boot/bootm_os.c
index ccde72d22c..f6b46cf57f 100644
--- a/boot/bootm_os.c
+++ b/boot/bootm_os.c
@@ -395,6 +395,26 @@  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;
+
+	snprintf(str, ARRAY_SIZE(str), "0x%lx", images->ep); /* write entry-point into string */
+	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 +556,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,
 };