From 5744e8746d3b56479581dfe6a009e67ba4fda96c Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Tue, 14 Nov 2017 14:10:10 +0000 Subject: [PATCH] ARM platforms: Fixup AArch32 builds This patch fixes a couple of issues for AArch32 builds on ARM reference platforms : 1. The arm_def.h previously defined the same BL32_BASE value for AArch64 and AArch32 build. Since BL31 is not present in AArch32 mode, this meant that the BL31 memory is empty when built for AArch32. Hence this patch allocates BL32 to the memory region occupied by BL31 for AArch32 builds. As a side-effect of this change, the ARM_TSP_RAM_LOCATION macro cannot be used to control the load address of BL32 in AArch32 mode which was never the intention of the macro anyway. 2. A static assert is added to sp_min linker script to check that the progbits are within the bounds expected when overlaid with other images. 3. Fix specifying `SPD` when building Juno for AArch32 mode. Due to the quirks involved when building Juno for AArch32 mode, the build option SPD needed to specifed. This patch corrects this and also updates the documentation in the user-guide. 4. Exclude BL31 from the build and FIP when building Juno for AArch32 mode. As a result the previous assumption that BL31 must be always present is removed and the certificates for BL31 is only generated if `NEED_BL31` is defined. Change-Id: I1c39bbc0abd2be8fbe9f2dea2e9cb4e3e3e436a8 Signed-off-by: Soby Mathew --- Makefile | 19 +-- bl32/sp_min/sp_min.ld.S | 4 + docs/user-guide.rst | 2 +- include/plat/arm/board/common/board_arm_def.h | 8 ++ include/plat/arm/common/arm_def.h | 109 ++++++++++-------- make_helpers/tbbr/tbbr_tools.mk | 2 + plat/arm/board/juno/include/platform_def.h | 9 ++ plat/arm/board/juno/platform.mk | 13 +++ 8 files changed, 112 insertions(+), 54 deletions(-) diff --git a/Makefile b/Makefile index fe18bc0ea..fe757984c 100644 --- a/Makefile +++ b/Makefile @@ -383,6 +383,17 @@ ifdef SCP_BL2 NEED_SCP_BL2 := yes endif +# For AArch32, BL31 is not currently supported. +ifneq (${ARCH},aarch32) + ifdef BL31_SOURCES + # When booting an EL3 payload, there is no need to compile the BL31 image nor + # put it in the FIP. + ifndef EL3_PAYLOAD_BASE + NEED_BL31 := yes + endif + endif +endif + # Process TBB related flags ifneq (${GENERATE_COT},0) # Common cert_create options @@ -434,17 +445,11 @@ NEED_BL2U := yes include bl2u/bl2u.mk endif -# For AArch32, BL31 is not currently supported. -ifneq (${ARCH},aarch32) +ifeq (${NEED_BL31},yes) ifdef BL31_SOURCES -# When booting an EL3 payload, there is no need to compile the BL31 image nor -# put it in the FIP. -ifndef EL3_PAYLOAD_BASE -NEED_BL31 := yes include bl31/bl31.mk endif endif -endif ################################################################################ # Build options checks diff --git a/bl32/sp_min/sp_min.ld.S b/bl32/sp_min/sp_min.ld.S index fc44d5248..932597312 100644 --- a/bl32/sp_min/sp_min.ld.S +++ b/bl32/sp_min/sp_min.ld.S @@ -110,6 +110,10 @@ SECTIONS __DATA_END__ = .; } >RAM +#ifdef BL32_PROGBITS_LIMIT + ASSERT(. <= BL32_PROGBITS_LIMIT, "BL32 progbits has exceeded its limit.") +#endif + stacks (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) diff --git a/docs/user-guide.rst b/docs/user-guide.rst index 79d660d02..138ed8b3d 100644 --- a/docs/user-guide.rst +++ b/docs/user-guide.rst @@ -1212,7 +1212,7 @@ corrupted binaries. make ARCH=aarch64 PLAT=juno LOAD_IMAGE_V2=1 JUNO_AARCH32_EL3_RUNTIME=1 \ BL33=/SOFTWARE/bl33-uboot.bin \ - SCP_BL2=/SOFTWARE/scp_bl2.bin SPD=tspd \ + SCP_BL2=/SOFTWARE/scp_bl2.bin \ BL32=/bl32.bin all fip The resulting BL1 and FIP images may be found in: diff --git a/include/plat/arm/board/common/board_arm_def.h b/include/plat/arm/board/common/board_arm_def.h index 97a1af4bf..68f4a0ec0 100644 --- a/include/plat/arm/board/common/board_arm_def.h +++ b/include/plat/arm/board/common/board_arm_def.h @@ -96,6 +96,14 @@ #define PLAT_ARM_MAX_BL31_SIZE 0x1D000 #endif +#ifdef AARCH32 +/* + * PLAT_ARM_MAX_BL32_SIZE is calculated for SP_MIN as the AArch32 Secure + * Payload. + */ +# define PLAT_ARM_MAX_BL32_SIZE 0x1D000 +#endif + #endif /* ARM_BOARD_OPTIMISE_MEM */ #define MAX_IO_DEVICES 3 diff --git a/include/plat/arm/common/arm_def.h b/include/plat/arm/common/arm_def.h index b8955afcc..788752599 100644 --- a/include/plat/arm/common/arm_def.h +++ b/include/plat/arm/common/arm_def.h @@ -326,14 +326,21 @@ /******************************************************************************* * BL2 specific defines. ******************************************************************************/ -#if ARM_BL31_IN_DRAM || (defined(AARCH32) && !defined(JUNO_AARCH32_EL3_RUNTIME)) +#if ARM_BL31_IN_DRAM /* - * For AArch32 BL31 is not applicable. * For AArch64 BL31 is loaded in the DRAM. * Put BL2 just below BL1. */ #define BL2_BASE (BL1_RW_BASE - PLAT_ARM_MAX_BL2_SIZE) #define BL2_LIMIT BL1_RW_BASE + +#elif defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME +/* + * Put BL2 just below BL32. + */ +#define BL2_BASE (BL32_BASE - PLAT_ARM_MAX_BL2_SIZE) +#define BL2_LIMIT BL32_BASE + #else /* * Put BL2 just below BL31. @@ -370,76 +377,86 @@ #define BL31_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE) #endif +#if defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME /******************************************************************************* - * BL32 specific defines. + * BL32 specific defines for EL3 runtime in AArch32 mode + ******************************************************************************/ +# if RESET_TO_SP_MIN && !JUNO_AARCH32_EL3_RUNTIME +/* SP_MIN is the only BL image in SRAM. Allocate the whole of SRAM to BL32 */ +# define BL32_BASE ARM_BL_RAM_BASE +# define BL32_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE) +# else +/* Put BL32 at the top of the Trusted SRAM.*/ +# define BL32_BASE (ARM_BL_RAM_BASE + \ + ARM_BL_RAM_SIZE - \ + PLAT_ARM_MAX_BL32_SIZE) +# define BL32_PROGBITS_LIMIT BL1_RW_BASE +# define BL32_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE) +# endif /* RESET_TO_SP_MIN && !JUNO_AARCH32_EL3_RUNTIME */ + +#else +/******************************************************************************* + * BL32 specific defines for EL3 runtime in AArch64 mode ******************************************************************************/ /* * On ARM standard platforms, the TSP can execute from Trusted SRAM, * Trusted DRAM (if available) or the DRAM region secured by the TrustZone * controller. */ -#if ENABLE_SPM -# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000)) -# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - ULL(0x200000)) -# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000)) -# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ +# if ENABLE_SPM +# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000)) +# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - ULL(0x200000)) +# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000)) +# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ ARM_AP_TZC_DRAM1_SIZE) -#elif ARM_BL31_IN_DRAM -# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + \ +# elif ARM_BL31_IN_DRAM +# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + \ PLAT_ARM_MAX_BL31_SIZE) -# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - \ +# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - \ PLAT_ARM_MAX_BL31_SIZE) -# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + \ +# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + \ PLAT_ARM_MAX_BL31_SIZE) -# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ +# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ ARM_AP_TZC_DRAM1_SIZE) -#elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID -# define TSP_SEC_MEM_BASE ARM_BL_RAM_BASE -# define TSP_SEC_MEM_SIZE ARM_BL_RAM_SIZE -# define TSP_PROGBITS_LIMIT BL2_BASE -# define BL32_BASE ARM_BL_RAM_BASE -# define BL32_LIMIT BL31_BASE -#elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_DRAM_ID -# define TSP_SEC_MEM_BASE PLAT_ARM_TRUSTED_DRAM_BASE -# define TSP_SEC_MEM_SIZE PLAT_ARM_TRUSTED_DRAM_SIZE -# define BL32_BASE PLAT_ARM_TRUSTED_DRAM_BASE -# define BL32_LIMIT (PLAT_ARM_TRUSTED_DRAM_BASE \ +# elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID +# define TSP_SEC_MEM_BASE ARM_BL_RAM_BASE +# define TSP_SEC_MEM_SIZE ARM_BL_RAM_SIZE +# define TSP_PROGBITS_LIMIT BL2_BASE +# define BL32_BASE ARM_BL_RAM_BASE +# define BL32_LIMIT BL31_BASE +# elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_DRAM_ID +# define TSP_SEC_MEM_BASE PLAT_ARM_TRUSTED_DRAM_BASE +# define TSP_SEC_MEM_SIZE PLAT_ARM_TRUSTED_DRAM_SIZE +# define BL32_BASE PLAT_ARM_TRUSTED_DRAM_BASE +# define BL32_LIMIT (PLAT_ARM_TRUSTED_DRAM_BASE \ + (1 << 21)) -#elif ARM_TSP_RAM_LOCATION_ID == ARM_DRAM_ID -# define TSP_SEC_MEM_BASE ARM_AP_TZC_DRAM1_BASE -# define TSP_SEC_MEM_SIZE ARM_AP_TZC_DRAM1_SIZE -# define BL32_BASE ARM_AP_TZC_DRAM1_BASE -# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ +# elif ARM_TSP_RAM_LOCATION_ID == ARM_DRAM_ID +# define TSP_SEC_MEM_BASE ARM_AP_TZC_DRAM1_BASE +# define TSP_SEC_MEM_SIZE ARM_AP_TZC_DRAM1_SIZE +# define BL32_BASE ARM_AP_TZC_DRAM1_BASE +# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \ ARM_AP_TZC_DRAM1_SIZE) -#else -# error "Unsupported ARM_TSP_RAM_LOCATION_ID value" -#endif +# else +# error "Unsupported ARM_TSP_RAM_LOCATION_ID value" +# endif +#endif /* AARCH32 || JUNO_AARCH32_EL3_RUNTIME */ /* * BL32 is mandatory in AArch32. In AArch64, undefine BL32_BASE if there is no * SPD and no SPM, as they are the only ones that can be used as BL32. */ -#ifndef AARCH32 +#if !(defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME) # if defined(SPD_none) && !ENABLE_SPM # undef BL32_BASE -# endif -#endif +# endif /* defined(SPD_none) && !ENABLE_SPM */ +#endif /* !(defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME) */ /******************************************************************************* * FWU Images: NS_BL1U, BL2U & NS_BL2U defines. ******************************************************************************/ #define BL2U_BASE BL2_BASE -#if ARM_BL31_IN_DRAM || (defined(AARCH32) && !defined(JUNO_AARCH32_EL3_RUNTIME)) -/* - * For AArch32 BL31 is not applicable. - * For AArch64 BL31 is loaded in the DRAM. - * BL2U extends up to BL1. - */ -#define BL2U_LIMIT BL1_RW_BASE -#else -/* BL2U extends up to BL31. */ -#define BL2U_LIMIT BL31_BASE -#endif +#define BL2U_LIMIT BL2_LIMIT + #define NS_BL2U_BASE ARM_NS_DRAM1_BASE #define NS_BL1U_BASE (PLAT_ARM_NVM_BASE + 0x03EB8000) diff --git a/make_helpers/tbbr/tbbr_tools.mk b/make_helpers/tbbr/tbbr_tools.mk index b13afe488..6e6e27396 100644 --- a/make_helpers/tbbr/tbbr_tools.mk +++ b/make_helpers/tbbr/tbbr_tools.mk @@ -77,6 +77,7 @@ ifneq (${SCP_BL2},) endif ifeq (${ARCH},aarch64) +ifeq (${NEED_BL31},yes) # Add the BL31 CoT (key cert + img cert + image) $(if ${BL31},$(eval $(call CERT_ADD_CMD_OPT,${BL31},--soc-fw,true)),\ $(eval $(call CERT_ADD_CMD_OPT,$(call IMG_BIN,31),--soc-fw,true))) @@ -86,6 +87,7 @@ $(eval $(call CERT_ADD_CMD_OPT,${BUILD_PLAT}/soc_fw_key.crt,--soc-fw-key-cert)) $(eval $(call FIP_ADD_PAYLOAD,${BUILD_PLAT}/soc_fw_content.crt,--soc-fw-cert)) $(eval $(call FIP_ADD_PAYLOAD,${BUILD_PLAT}/soc_fw_key.crt,--soc-fw-key-cert)) endif +endif # Add the BL32 CoT (key cert + img cert + image) ifeq (${NEED_BL32},yes) diff --git a/plat/arm/board/juno/include/platform_def.h b/plat/arm/board/juno/include/platform_def.h index ccc7771e5..e475ece5a 100644 --- a/plat/arm/board/juno/include/platform_def.h +++ b/plat/arm/board/juno/include/platform_def.h @@ -128,6 +128,15 @@ */ #define PLAT_ARM_MAX_BL31_SIZE 0x1E000 +#if JUNO_AARCH32_EL3_RUNTIME +/* + * PLAT_ARM_MAX_BL32_SIZE is calculated for SP_MIN as the AArch32 Secure + * Payload. We also need to take care of SCP_BL2 size as well, as the SCP_BL2 + * is loaded into the space BL32 -> BL1_RW_BASE + */ +# define PLAT_ARM_MAX_BL32_SIZE 0x1E000 +#endif + /* * Since free SRAM space is scant, enable the ASSERTION message size * optimization by fixing the PLAT_LOG_LEVEL_ASSERT to LOG_LEVEL_INFO (40). diff --git a/plat/arm/board/juno/platform.mk b/plat/arm/board/juno/platform.mk index 5cd125bff..bfb7847fe 100644 --- a/plat/arm/board/juno/platform.mk +++ b/plat/arm/board/juno/platform.mk @@ -31,6 +31,19 @@ JUNO_AARCH32_EL3_RUNTIME := 0 $(eval $(call assert_boolean,JUNO_AARCH32_EL3_RUNTIME)) $(eval $(call add_define,JUNO_AARCH32_EL3_RUNTIME)) +ifeq (${JUNO_AARCH32_EL3_RUNTIME}, 1) +# Include BL32 in FIP +NEED_BL32 := yes +# BL31 is not required +override BL31_SOURCES = + +# The BL32 needs to be built separately invoking the AARCH32 compiler and +# be specifed via `BL32` build option. + ifneq (${ARCH}, aarch32) + override BL32_SOURCES = + endif +endif + ifeq (${ARCH},aarch64) BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \