diff mbox series

[RFC,v3,5/8] cmd: bootm: add a stage pre-load

Message ID 20211117175215.24262-6-philippe.reynes@softathome.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series image: add a stage pre-load | expand

Commit Message

Philippe REYNES Nov. 17, 2021, 5:52 p.m. UTC
This commit adds a stage pre-load to the command
bootm. Right now, this stage may be used to read
a header and check the signature of the full
image.

Signed-off-by: Philippe Reynes <philippe.reynes@softathome.com>
---
 boot/bootm.c    | 33 +++++++++++++++++++++++++++++++++
 cmd/Kconfig     | 10 ++++++++++
 cmd/bootm.c     |  2 +-
 include/image.h |  1 +
 4 files changed, 45 insertions(+), 1 deletion(-)

Comments

Simon Glass Nov. 25, 2021, 12:12 a.m. UTC | #1
Hi Philippe,

On Wed, 17 Nov 2021 at 10:52, Philippe Reynes
<philippe.reynes@softathome.com> wrote:
>
> This commit adds a stage pre-load to the command

Add a stage...

> bootm. Right now, this stage may be used to read
> a header and check the signature of the full
> image.
>
> Signed-off-by: Philippe Reynes <philippe.reynes@softathome.com>
> ---
>  boot/bootm.c    | 33 +++++++++++++++++++++++++++++++++
>  cmd/Kconfig     | 10 ++++++++++
>  cmd/bootm.c     |  2 +-
>  include/image.h |  1 +
>  4 files changed, 45 insertions(+), 1 deletion(-)
>

Reviewed-by: Simon Glass <sjg@chromium.org>

> diff --git a/boot/bootm.c b/boot/bootm.c
> index 4482f84b40..4803c577cc 100644
> --- a/boot/bootm.c
> +++ b/boot/bootm.c
> @@ -87,6 +87,33 @@ static int bootm_start(struct cmd_tbl *cmdtp, int flag, int argc,
>         return 0;
>  }
>
> +static ulong bootm_data_addr(int argc, char *const argv[])
> +{
> +       ulong addr;
> +
> +       if (argc > 0)
> +               addr = simple_strtoul(argv[0], NULL, 16);
> +       else
> +               addr = image_load_addr;
> +
> +       return addr;
> +}
> +
> +static int bootm_pre_load(struct cmd_tbl *cmdtp, int flag, int argc,
> +                         char *const argv[])
> +{
> +       ulong data_addr = bootm_data_addr(argc, argv);
> +       int ret = 0;
> +
> +       if (CONFIG_IS_ENABLED(CMD_BOOTM_PRE_LOAD))
> +               ret = image_pre_load(data_addr);
> +
> +       if (ret)
> +               ret = CMD_RET_FAILURE;
> +
> +       return ret;
> +}
> +
>  static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
>                          char *const argv[])
>  {
> @@ -677,6 +704,9 @@ int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
>         if (states & BOOTM_STATE_START)
>                 ret = bootm_start(cmdtp, flag, argc, argv);
>
> +       if (!ret && (states & BOOTM_STATE_PRE_LOAD))
> +               ret = bootm_pre_load(cmdtp, flag, argc, argv);
> +
>         if (!ret && (states & BOOTM_STATE_FINDOS))
>                 ret = bootm_find_os(cmdtp, flag, argc, argv);
>
> @@ -866,6 +896,9 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
>                                               &fit_uname_config,
>                                               &fit_uname_kernel);
>
> +       if (CONFIG_IS_ENABLED(CMD_BOOTM_PRE_LOAD))
> +               img_addr += image_load_offset;
> +
>         bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
>
>         /* check image type, for FIT images get FIT kernel node */
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 5b30b13e43..cad2cda0bf 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -194,6 +194,16 @@ config CMD_BOOTM
>         help
>           Boot an application image from the memory.
>
> +config CMD_BOOTM_PRE_LOAD
> +       bool "enable pre-load on bootm"
> +       depends on CMD_BOOTM
> +       depends on IMAGE_PRE_LOAD
> +       default n
> +       help
> +         Enable support of stage pre-load for the bootm command.
> +        This stage allow to check of modifty the image provided
> +        to the bootm command.

modify

> +
>  config BOOTM_EFI
>         bool "Support booting UEFI FIT images"
>         depends on CMD_BOOTEFI && CMD_BOOTM && FIT
> diff --git a/cmd/bootm.c b/cmd/bootm.c
> index 92468d09a1..acfb8eedde 100644
> --- a/cmd/bootm.c
> +++ b/cmd/bootm.c
> @@ -126,7 +126,7 @@ int do_bootm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>         }
>
>         return do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START |
> -               BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER |
> +               BOOTM_STATE_FINDOS | BOOTM_STATE_PRE_LOAD | BOOTM_STATE_FINDOTHER |
>                 BOOTM_STATE_LOADOS |
>  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
>                 BOOTM_STATE_RAMDISK |
> diff --git a/include/image.h b/include/image.h
> index 5f83e4c747..42fb01ab07 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -351,6 +351,7 @@ typedef struct bootm_headers {
>  #define        BOOTM_STATE_OS_PREP     (0x00000100)
>  #define        BOOTM_STATE_OS_FAKE_GO  (0x00000200)    /* 'Almost' run the OS */
>  #define        BOOTM_STATE_OS_GO       (0x00000400)
> +#define        BOOTM_STATE_PRE_LOAD    (0x00000800)

Drop ()

>         int             state;
>
>  #if defined(CONFIG_LMB) && !defined(USE_HOSTCC)
> --
> 2.17.1
>

Regards,
Simon
diff mbox series

Patch

diff --git a/boot/bootm.c b/boot/bootm.c
index 4482f84b40..4803c577cc 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -87,6 +87,33 @@  static int bootm_start(struct cmd_tbl *cmdtp, int flag, int argc,
 	return 0;
 }
 
+static ulong bootm_data_addr(int argc, char *const argv[])
+{
+	ulong addr;
+
+	if (argc > 0)
+		addr = simple_strtoul(argv[0], NULL, 16);
+	else
+		addr = image_load_addr;
+
+	return addr;
+}
+
+static int bootm_pre_load(struct cmd_tbl *cmdtp, int flag, int argc,
+			  char *const argv[])
+{
+	ulong data_addr = bootm_data_addr(argc, argv);
+	int ret = 0;
+
+	if (CONFIG_IS_ENABLED(CMD_BOOTM_PRE_LOAD))
+		ret = image_pre_load(data_addr);
+
+	if (ret)
+		ret = CMD_RET_FAILURE;
+
+	return ret;
+}
+
 static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
 			 char *const argv[])
 {
@@ -677,6 +704,9 @@  int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
 	if (states & BOOTM_STATE_START)
 		ret = bootm_start(cmdtp, flag, argc, argv);
 
+	if (!ret && (states & BOOTM_STATE_PRE_LOAD))
+		ret = bootm_pre_load(cmdtp, flag, argc, argv);
+
 	if (!ret && (states & BOOTM_STATE_FINDOS))
 		ret = bootm_find_os(cmdtp, flag, argc, argv);
 
@@ -866,6 +896,9 @@  static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
 					      &fit_uname_config,
 					      &fit_uname_kernel);
 
+	if (CONFIG_IS_ENABLED(CMD_BOOTM_PRE_LOAD))
+		img_addr += image_load_offset;
+
 	bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
 
 	/* check image type, for FIT images get FIT kernel node */
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 5b30b13e43..cad2cda0bf 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -194,6 +194,16 @@  config CMD_BOOTM
 	help
 	  Boot an application image from the memory.
 
+config CMD_BOOTM_PRE_LOAD
+       bool "enable pre-load on bootm"
+       depends on CMD_BOOTM
+       depends on IMAGE_PRE_LOAD
+       default n
+       help
+         Enable support of stage pre-load for the bootm command.
+	 This stage allow to check of modifty the image provided
+	 to the bootm command.
+
 config BOOTM_EFI
 	bool "Support booting UEFI FIT images"
 	depends on CMD_BOOTEFI && CMD_BOOTM && FIT
diff --git a/cmd/bootm.c b/cmd/bootm.c
index 92468d09a1..acfb8eedde 100644
--- a/cmd/bootm.c
+++ b/cmd/bootm.c
@@ -126,7 +126,7 @@  int do_bootm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 	}
 
 	return do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START |
-		BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER |
+		BOOTM_STATE_FINDOS | BOOTM_STATE_PRE_LOAD | BOOTM_STATE_FINDOTHER |
 		BOOTM_STATE_LOADOS |
 #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
 		BOOTM_STATE_RAMDISK |
diff --git a/include/image.h b/include/image.h
index 5f83e4c747..42fb01ab07 100644
--- a/include/image.h
+++ b/include/image.h
@@ -351,6 +351,7 @@  typedef struct bootm_headers {
 #define	BOOTM_STATE_OS_PREP	(0x00000100)
 #define	BOOTM_STATE_OS_FAKE_GO	(0x00000200)	/* 'Almost' run the OS */
 #define	BOOTM_STATE_OS_GO	(0x00000400)
+#define	BOOTM_STATE_PRE_LOAD	(0x00000800)
 	int		state;
 
 #if defined(CONFIG_LMB) && !defined(USE_HOSTCC)