[RFC PATCH v3 5/8] cmd: bootm: add a stage pre-load
Simon Glass
sjg at chromium.org
Thu Nov 25 01:12:56 CET 2021
Hi Philippe,
On Wed, 17 Nov 2021 at 10:52, Philippe Reynes
<philippe.reynes at 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 at 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 at 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
More information about the U-Boot
mailing list