The expected payload for the SPL in secure falcon mode is a fitImage that contains the kernel image and the DT. This removes the need to load an additional args file, which exposes an additional attack vector since it can not be verified.
Therefore this patch disables loading of the arg file when SPL_OS_BOOT_SECURE is set. Signed-off-by: Anshul Dalal <ansh...@ti.com> --- common/spl/Kconfig | 18 +++++++++++------- common/spl/spl_ext.c | 4 ++++ common/spl/spl_fat.c | 5 +++++ common/spl/spl_nand.c | 5 ++++- common/spl/spl_spi.c | 5 +++++ common/spl/spl_ubi.c | 4 ++++ include/system-constants.h | 2 +- 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/common/spl/Kconfig b/common/spl/Kconfig index 4f817fd31c5..34e60a224ef 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -796,6 +796,7 @@ config SPL_FS_LOAD_PAYLOAD_NAME config SPL_FS_LOAD_KERNEL_NAME string "File to load for the OS kernel from the filesystem" depends on (SPL_FS_EXT4 || SPL_FS_FAT || SPL_FS_SQUASHFS) && SPL_OS_BOOT + default "fitImage" if SPL_OS_BOOT_SECURE default "uImage" help Filename to read to load for the OS kernel when reading from the @@ -803,7 +804,8 @@ config SPL_FS_LOAD_KERNEL_NAME config SPL_FS_LOAD_ARGS_NAME string "File to load for the OS kernel argument parameters from the filesystem" - depends on (SPL_FS_EXT4 || SPL_FS_FAT || SPL_FS_SQUASHFS) && SPL_OS_BOOT + depends on (SPL_FS_EXT4 || SPL_FS_FAT || SPL_FS_SQUASHFS) && SPL_OS_BOOT \ + && !(SPL_OS_BOOT_SECURE) default "args" help Filename to read to load for the OS kernel argument parameters from @@ -1121,7 +1123,7 @@ config SPL_UBI_LOAD_KERNEL_ID config SPL_UBI_LOAD_ARGS_ID int "id of kernel args volume" - depends on SPL_OS_BOOT + depends on SPL_OS_BOOT && !SPL_OS_BOOT_SECURE help The UBI volume id from which to load the device tree @@ -1217,7 +1219,8 @@ config SPL_OS_BOOT_SECURE config SPL_PAYLOAD_ARGS_ADDR hex "Address in memory to load 'args' file for Falcon Mode to" - depends on SPL_OS_BOOT || SPL_LOAD_FIT_OPENSBI_OS_BOOT + depends on (SPL_OS_BOOT || SPL_LOAD_FIT_OPENSBI_OS_BOOT) \ + && !SPL_OS_BOOT_SECURE default 0x88000000 if ARCH_OMAP2PLUS default 0x99000000 if ARCH_SC5XX && SC59X_64 default 0xA0000000 if ARCH_SC5XX && TARGET_SC594_SOM_EZKIT @@ -1257,7 +1260,7 @@ config SYS_MMCSD_RAW_MODE_KERNEL_SECTOR config SYS_MMCSD_RAW_MODE_ARGS_SECTOR hex "Falcon mode: Sector to load 'args' from MMC" - depends on SPL_FALCON_BOOT_MMCSD + depends on SPL_FALCON_BOOT_MMCSD && !SPL_OS_BOOT_SECURE help When Falcon mode is used with an MMC or SD media, SPL needs to know where to look for the OS 'args', typically a device tree. The @@ -1267,7 +1270,8 @@ config SYS_MMCSD_RAW_MODE_ARGS_SECTOR config SYS_MMCSD_RAW_MODE_ARGS_SECTORS hex "Falcon mode: Number of sectors to load for 'args' from MMC" - depends on SPL_FALCON_BOOT_MMCSD && SYS_MMCSD_RAW_MODE_ARGS_SECTOR != 0x0 + depends on SPL_FALCON_BOOT_MMCSD && SYS_MMCSD_RAW_MODE_ARGS_SECTOR != 0x0 \ + && !SPL_OS_BOOT_SECURE config SPL_PAYLOAD string "SPL payload" @@ -1503,14 +1507,14 @@ config SYS_SPI_KERNEL_OFFS config SYS_SPI_ARGS_OFFS hex "Falcon mode: address of args payload in SPI flash" - depends on SPL_SPI_FLASH_SUPPORT && SPL_OS_BOOT + depends on SPL_SPI_FLASH_SUPPORT && SPL_OS_BOOT && !SPL_OS_BOOT_SECURE help Address within SPI-Flash from where the args payload (usually the dtb) is fetched in falcon boot. config SYS_SPI_ARGS_SIZE hex "Falcon mode: size of args payload in SPI flash" - depends on SPL_SPI_FLASH_SUPPORT && SPL_OS_BOOT + depends on SPL_SPI_FLASH_SUPPORT && SPL_OS_BOOT && !SPL_OS_BOOT_SECURE config SPL_THERMAL bool "Driver support for thermal devices" diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c index f556986bf5a..001060afe96 100644 --- a/common/spl/spl_ext.c +++ b/common/spl/spl_ext.c @@ -104,6 +104,7 @@ int spl_load_image_ext_os(struct spl_image_info *spl_image, puts("spl: falling back to default\n"); goto defaults; } +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR file = env_get("falcon_args_file"); if (file) { err = ext4fs_open(file, &filelen); @@ -122,6 +123,7 @@ int spl_load_image_ext_os(struct spl_image_info *spl_image, } else { puts("spl: falcon_args_file not set in environment, falling back to default\n"); } +#endif } else { puts("spl: falcon_image_file not set in environment, falling back to default\n"); } @@ -134,6 +136,7 @@ defaults: if (err) return err; +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen); if (err < 0) { puts("spl: ext4fs_open failed\n"); @@ -148,6 +151,7 @@ defaults: #endif return -1; } +#endif return 0; } diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c index 80e800b4755..8a724aa8acb 100644 --- a/common/spl/spl_fat.c +++ b/common/spl/spl_fat.c @@ -131,6 +131,7 @@ int spl_load_image_fat_os(struct spl_image_info *spl_image, goto defaults; } +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR file = env_get("falcon_args_file"); if (file) { err = file_fat_read( @@ -143,6 +144,8 @@ int spl_load_image_fat_os(struct spl_image_info *spl_image, return 0; } else puts("spl: falcon_args_file not set in environment, falling back to default\n"); +#endif + } else puts("spl: falcon_image_file not set in environment, falling back to default\n"); @@ -154,6 +157,7 @@ defaults: if (err) return err; +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME, (void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR, 0); if (err <= 0) { @@ -161,6 +165,7 @@ defaults: CONFIG_SPL_FS_LOAD_ARGS_NAME, err); return err; } +#endif return 0; } diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c index ff7087da1df..6c58a41ceef 100644 --- a/common/spl/spl_nand.c +++ b/common/spl/spl_nand.c @@ -79,7 +79,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image, static int spl_nand_load_image_os(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { - int *src, *dst, err; + int err; struct legacy_img_hdr *header = spl_get_load_buffer(0, sizeof(*header)); /* load linux */ @@ -102,6 +102,8 @@ static int spl_nand_load_image_os(struct spl_image_info *spl_image, if (err) return err; +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR + int *src, *dst; /* * load parameter image load to temp position since nand_spl_load_image * reads a whole block which is typically larger than @@ -117,6 +119,7 @@ static int spl_nand_load_image_os(struct spl_image_info *spl_image, src++, dst++) { writel(readl(src), dst); } +#endif return 0; } diff --git a/common/spl/spl_spi.c b/common/spl/spl_spi.c index cbc864809fe..5fe21f0bf0f 100644 --- a/common/spl/spl_spi.c +++ b/common/spl/spl_spi.c @@ -61,10 +61,15 @@ static int spl_spi_load_image_os(struct spl_image_info *spl_image, if (err) return err; +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR /* Read device tree. */ return spi_flash_read(flash, CONFIG_SYS_SPI_ARGS_OFFS, CONFIG_SYS_SPI_ARGS_SIZE, (void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR); +#else + return 0; +#endif + } #endif diff --git a/common/spl/spl_ubi.c b/common/spl/spl_ubi.c index 3c6f80de7d9..c43182c6415 100644 --- a/common/spl/spl_ubi.c +++ b/common/spl/spl_ubi.c @@ -22,10 +22,14 @@ int spl_ubi_load_image_os(struct spl_image_info *spl_image, volumes[0].vol_id = CONFIG_SPL_UBI_LOAD_KERNEL_ID; volumes[0].load_addr = (void *)CONFIG_SYS_LOAD_ADDR; +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR volumes[1].vol_id = CONFIG_SPL_UBI_LOAD_ARGS_ID; volumes[1].load_addr = (void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR; err = ubispl_load_volumes(info, volumes, 2); +#else + err = ubispl_load_volumes(info, volumes, 1); +#endif if (err) return err; diff --git a/include/system-constants.h b/include/system-constants.h index e09fc418a47..d5300428a39 100644 --- a/include/system-constants.h +++ b/include/system-constants.h @@ -37,7 +37,7 @@ IF_ENABLED_INT(CONFIG_SPL_SYS_MALLOC, CONFIG_SPL_SYS_MALLOC_SIZE) /* deal with an optional value */ -#ifdef CONFIG_SPL_OS_BOOT +#ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR #define SPL_PAYLOAD_ARGS_ADDR CONFIG_SPL_PAYLOAD_ARGS_ADDR #else #define SPL_PAYLOAD_ARGS_ADDR 0 -- 2.51.0