diff --git a/Makefile b/Makefile index b9584ca..ff7c5b7 100644 --- a/Makefile +++ b/Makefile @@ -571,6 +571,14 @@ endif endif +# The SPCI-based SPM implementation and the MM-based SPM implementation cannot +# be enabled at the same time. +ifeq ($(ENABLE_SPM),1) + ifeq ($(SPM_MM),1) + $(error Use only one of the ENABLE_SPM and SPM_MM flags) + endif +endif + ################################################################################ # Process platform overrideable behaviour ################################################################################ diff --git a/bl31/bl31.ld.S b/bl31/bl31.ld.S index 708ee32..a4be3b2 100644 --- a/bl31/bl31.ld.S +++ b/bl31/bl31.ld.S @@ -142,7 +142,7 @@ ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__, "cpu_ops not defined for this platform.") -#if ENABLE_SPM +#if ENABLE_SPM || SPM_MM #ifndef SPM_SHIM_EXCEPTIONS_VMA #define SPM_SHIM_EXCEPTIONS_VMA RAM #endif diff --git a/bl31/bl31.mk b/bl31/bl31.mk index c9ba926..7ff054a 100644 --- a/bl31/bl31.mk +++ b/bl31/bl31.mk @@ -5,21 +5,21 @@ # ################################################################################ -# Include SPM Makefile +# Include Makefile for either of the supported SPM implementations ################################################################################ ifeq (${ENABLE_SPM},1) - ifeq (${SPM_MM},1) - ifeq (${EL3_EXCEPTION_HANDLING},0) - $(error EL3_EXCEPTION_HANDLING must be 1 for SPM support) - endif - $(info Including makefile of SPM based on MM) - include services/std_svc/spm_mm/spm.mk - else - $(info Including SPM makefile) - include services/std_svc/spm/spm.mk - endif + $(info Including SPM (SPCI) makefile) + include services/std_svc/spm/spm.mk endif +ifeq (${SPM_MM},1) + ifeq (${EL3_EXCEPTION_HANDLING},0) + $(error EL3_EXCEPTION_HANDLING must be 1 for SPM support) + else + $(info Including SPM Management Mode (MM) makefile) + include services/std_svc/spm_mm/spm.mk + endif +endif include lib/psci/psci_lib.mk diff --git a/docs/getting_started/build-options.rst b/docs/getting_started/build-options.rst index 731b876..87ce94e 100644 --- a/docs/getting_started/build-options.rst +++ b/docs/getting_started/build-options.rst @@ -235,8 +235,9 @@ The default is 1 but is automatically disabled when the target architecture is AArch32. -- ``ENABLE_SPM`` : Boolean option to enable the Secure Partition Manager (SPM). - Refer to :ref:`Secure Partition Manager` for more details about +- ``ENABLE_SPM`` : Boolean option to enable the SPCI-based Secure Partition + Manager (SPM) implementation. + Refer to the :ref:`Secure Partition Manager` guide for more details about this feature. Default is 0. - ``ENABLE_SVE_FOR_NS``: Boolean option to enable Scalable Vector Extension @@ -507,6 +508,9 @@ firmware images have been loaded in memory, and the MMU and caches are turned off. Refer to the "Debugging options" section for more details. +- ``SPM_MM`` : Boolean option to enable the Management Mode (MM)-based Secure + Partition Manager (SPM) implementation. The default value is ``0``. + - ``SP_MIN_WITH_SECURE_FIQ``: Boolean flag to indicate the SP_MIN handles secure interrupts (caught through the FIQ line). Platforms can enable this directive if they need to handle such interruption. When enabled, diff --git a/include/plat/arm/common/arm_def.h b/include/plat/arm/common/arm_def.h index 941190f..8095bed 100644 --- a/include/plat/arm/common/arm_def.h +++ b/include/plat/arm/common/arm_def.h @@ -500,9 +500,9 @@ * SPD and no SPM, as they are the only ones that can be used as BL32. */ #if defined(__aarch64__) && !JUNO_AARCH32_EL3_RUNTIME -# if defined(SPD_none) && !ENABLE_SPM +# if defined(SPD_none) && !ENABLE_SPM && !SPM_MM # undef BL32_BASE -# endif /* defined(SPD_none) && !ENABLE_SPM */ +# endif /* defined(SPD_none) && !ENABLE_SPM && !SPM_MM*/ #endif /* defined(__aarch64__) && !JUNO_AARCH32_EL3_RUNTIME */ /******************************************************************************* diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index c00a041..02feec7 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -38,7 +38,7 @@ * - Region 1 with secure access only; * - the remaining DRAM regions access from the given Non-Secure masters. ******************************************************************************/ -#if ENABLE_SPM && SPM_MM +#if SPM_MM #define ARM_TZC_REGIONS_DEF \ {ARM_AP_TZC_DRAM1_BASE, ARM_EL3_TZC_DRAM1_END, \ TZC_REGION_S_RDWR, 0}, \ diff --git a/make_helpers/defaults.mk b/make_helpers/defaults.mk index 348b3e5..ac5d959 100644 --- a/make_helpers/defaults.mk +++ b/make_helpers/defaults.mk @@ -178,11 +178,11 @@ # SPD choice SPD := none -# For including the Secure Partition Manager +# Enable the SPCI-based Secure Partition Manager implementation ENABLE_SPM := 0 -# Use the SPM based on MM -SPM_MM := 1 +# Enable the Management Mode (MM)-based Secure Partition Manager implementation +SPM_MM := 0 # Flag to introduce an infinite loop in BL1 just before it exits into the next # image. This is meant to help debugging the post-BL2 phase. diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c index a948796..fca4d01 100644 --- a/plat/arm/board/fvp/fvp_common.c +++ b/plat/arm/board/fvp/fvp_common.c @@ -96,10 +96,10 @@ ARM_MAP_BL1_RW, #endif #endif /* TRUSTED_BOARD_BOOT */ -#if ENABLE_SPM && SPM_MM +#if SPM_MM ARM_SP_IMAGE_MMAP, #endif -#if ENABLE_SPM && !SPM_MM +#if ENABLE_SPM PLAT_MAP_SP_PACKAGE_MEM_RW, #endif #if ARM_BL31_IN_DRAM @@ -127,16 +127,16 @@ MAP_DEVICE0, MAP_DEVICE1, ARM_V2M_MAP_MEM_PROTECT, -#if ENABLE_SPM && SPM_MM +#if SPM_MM ARM_SPM_BUF_EL3_MMAP, #endif -#if ENABLE_SPM && !SPM_MM +#if ENABLE_SPM PLAT_MAP_SP_PACKAGE_MEM_RO, #endif {0} }; -#if ENABLE_SPM && defined(IMAGE_BL31) && SPM_MM +#if defined(IMAGE_BL31) && SPM_MM const mmap_region_t plat_arm_secure_partition_mmap[] = { V2M_MAP_IOFPGA_EL0, /* for the UART */ MAP_REGION_FLAT(DEVICE0_BASE, \ @@ -190,7 +190,7 @@ } #endif -#if ENABLE_SPM && defined(IMAGE_BL31) && SPM_MM +#if defined(IMAGE_BL31) && SPM_MM /* * Boot information passed to a secure partition during initialisation. Linear * indices in MP information will be filled at runtime. diff --git a/plat/arm/board/fvp/include/platform_def.h b/plat/arm/board/fvp/include/platform_def.h index 98dd0a9..1a251b8 100644 --- a/plat/arm/board/fvp/include/platform_def.h +++ b/plat/arm/board/fvp/include/platform_def.h @@ -61,7 +61,7 @@ * plat_arm_mmap array defined for each BL stage. */ #if defined(IMAGE_BL31) -# if ENABLE_SPM +# if ENABLE_SPM || SPM_MM # define PLAT_ARM_MMAP_ENTRIES 9 # define MAX_XLAT_TABLES 9 # define PLAT_SP_IMAGE_MMAP_REGIONS 30 @@ -116,7 +116,7 @@ * calculated using the current BL31 PROGBITS debug size plus the sizes of * BL2 and BL1-RW */ -#if ENABLE_SPM && !SPM_MM +#if ENABLE_SPM #define PLAT_ARM_MAX_BL31_SIZE UL(0x60000) #else #define PLAT_ARM_MAX_BL31_SIZE UL(0x3B000) diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk index 3a9972b..446969c 100644 --- a/plat/arm/board/fvp/platform.mk +++ b/plat/arm/board/fvp/platform.mk @@ -282,9 +282,7 @@ BL31_CFLAGS += -DPLAT_XLAT_TABLES_DYNAMIC=1 endif ifeq (${ENABLE_SPM},1) - ifeq (${SPM_MM},0) BL31_CFLAGS += -DPLAT_XLAT_TABLES_DYNAMIC=1 - endif endif ifeq (${SPD},trusty) BL31_CFLAGS += -DPLAT_XLAT_TABLES_DYNAMIC=1 diff --git a/plat/arm/common/aarch64/arm_ehf.c b/plat/arm/common/aarch64/arm_ehf.c index 4ae992c..5144afc 100644 --- a/plat/arm/common/aarch64/arm_ehf.c +++ b/plat/arm/common/aarch64/arm_ehf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -24,7 +24,7 @@ /* Normal priority SDEI */ EHF_PRI_DESC(ARM_PRI_BITS, PLAT_SDEI_NORMAL_PRI), #endif -#if ENABLE_SPM +#if ENABLE_SPM || SPM_MM EHF_PRI_DESC(ARM_PRI_BITS, PLAT_SP_PRI), #endif }; diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index cda39b7..a60e349 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -249,14 +249,12 @@ endif # SPM uses libfdt in Arm platforms -ifeq (${SPM_MM},0) ifeq (${ENABLE_SPM},1) BL31_SOURCES += common/fdt_wrappers.c \ plat/common/plat_spm_rd.c \ plat/common/plat_spm_sp.c \ ${LIBFDT_SRCS} endif -endif ifneq (${TRUSTED_BOARD_BOOT},0) diff --git a/plat/arm/css/sgi/include/sgi_base_platform_def.h b/plat/arm/css/sgi/include/sgi_base_platform_def.h index a9cc852..a42c759 100644 --- a/plat/arm/css/sgi/include/sgi_base_platform_def.h +++ b/plat/arm/css/sgi/include/sgi_base_platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -28,7 +28,7 @@ * plat_arm_mmap array defined for each BL stage. */ #if defined(IMAGE_BL31) -# if ENABLE_SPM +# if ENABLE_SPM || SPM_MM # define PLAT_ARM_MMAP_ENTRIES 9 # define MAX_XLAT_TABLES 7 # define PLAT_SP_IMAGE_MMAP_REGIONS 7 @@ -101,7 +101,7 @@ #elif defined(IMAGE_BL2U) # define PLATFORM_STACK_SIZE 0x400 #elif defined(IMAGE_BL31) -# if ENABLE_SPM +# if ENABLE_SPM || SPM_MM # define PLATFORM_STACK_SIZE 0x500 # else # define PLATFORM_STACK_SIZE 0x400 diff --git a/plat/arm/css/sgi/sgi_plat.c b/plat/arm/css/sgi/sgi_plat.c index 3e207ec..ef13cdc 100644 --- a/plat/arm/css/sgi/sgi_plat.c +++ b/plat/arm/css/sgi/sgi_plat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -46,7 +46,7 @@ #if ARM_BL31_IN_DRAM ARM_MAP_BL31_SEC_DRAM, #endif -#if ENABLE_SPM +#if SPM_MM ARM_SP_IMAGE_MMAP, #endif #if TRUSTED_BOARD_BOOT && !BL2_AT_EL3 @@ -61,13 +61,13 @@ V2M_MAP_IOFPGA, CSS_SGI_MAP_DEVICE, SOC_CSS_MAP_DEVICE, -#if ENABLE_SPM +#if SPM_MM ARM_SPM_BUF_EL3_MMAP, #endif {0} }; -#if ENABLE_SPM && defined(IMAGE_BL31) +#if SPM_MM && defined(IMAGE_BL31) const mmap_region_t plat_arm_secure_partition_mmap[] = { PLAT_ARM_SECURE_MAP_DEVICE, ARM_SP_IMAGE_MMAP, @@ -77,12 +77,12 @@ ARM_SPM_BUF_EL0_MMAP, {0} }; -#endif /* ENABLE_SPM && defined(IMAGE_BL31) */ +#endif /* SPM_MM && defined(IMAGE_BL31) */ #endif ARM_CASSERT_MMAP -#if ENABLE_SPM && defined(IMAGE_BL31) +#if SPM_MM && defined(IMAGE_BL31) /* * Boot information passed to a secure partition during initialisation. Linear * indices in MP information will be filled at runtime. @@ -130,7 +130,7 @@ { return &plat_arm_secure_partition_boot_info; } -#endif /* ENABLE_SPM && defined(IMAGE_BL31) */ +#endif /* SPM_MM && defined(IMAGE_BL31) */ #if TRUSTED_BOARD_BOOT int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) diff --git a/plat/nvidia/tegra/scat/bl31.scat b/plat/nvidia/tegra/scat/bl31.scat index 2f5fd9e..ff7719a 100644 --- a/plat/nvidia/tegra/scat/bl31.scat +++ b/plat/nvidia/tegra/scat/bl31.scat @@ -95,7 +95,7 @@ /* cpu_ops must always be defined */ ScatterAssert(ImageLength(__CPU_OPS__) > 0) -#if ENABLE_SPM +#if ENABLE_SPM || SPM_MM LR_SPM +0 { /* diff --git a/plat/socionext/synquacer/platform.mk b/plat/socionext/synquacer/platform.mk index fe1448f..ab1f69e 100644 --- a/plat/socionext/synquacer/platform.mk +++ b/plat/socionext/synquacer/platform.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. +# Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # @@ -57,7 +57,7 @@ drivers/arm/css/mhu/css_mhu_doorbell.c endif -ifeq (${ENABLE_SPM},1) +ifeq (${SPM_MM},1) $(eval $(call add_define,PLAT_EXTRA_LD_SCRIPT)) BL31_SOURCES += $(PLAT_PATH)/sq_spm.c diff --git a/plat/socionext/synquacer/sq_bl31_setup.c b/plat/socionext/synquacer/sq_bl31_setup.c index c78fe91..b864021 100644 --- a/plat/socionext/synquacer/sq_bl31_setup.c +++ b/plat/socionext/synquacer/sq_bl31_setup.c @@ -159,7 +159,7 @@ void bl31_plat_arch_setup(void) { static const mmap_region_t secure_partition_mmap[] = { -#if ENABLE_SPM && SPM_MM +#if SPM_MM MAP_REGION_FLAT(PLAT_SPM_BUF_BASE, PLAT_SPM_BUF_SIZE, MT_RW_DATA | MT_SECURE), @@ -173,7 +173,7 @@ sq_mmap_setup(BL31_BASE, BL31_SIZE, secure_partition_mmap); enable_mmu_el3(XLAT_TABLE_NC); -#if ENABLE_SPM && SPM_MM +#if SPM_MM memcpy((void *)SPM_SHIM_EXCEPTIONS_START, (void *)SPM_SHIM_EXCEPTIONS_LMA, (uintptr_t)SPM_SHIM_EXCEPTIONS_END - diff --git a/services/std_svc/std_svc_setup.c b/services/std_svc/std_svc_setup.c index 1d80fa3..1219b34 100644 --- a/services/std_svc/std_svc_setup.c +++ b/services/std_svc/std_svc_setup.c @@ -45,7 +45,7 @@ ret = 1; } -#if ENABLE_SPM +#if ENABLE_SPM || SPM_MM if (spm_setup() != 0) { ret = 1; } @@ -103,7 +103,7 @@ SMC_RET1(handle, ret); } -#if ENABLE_SPM && SPM_MM +#if SPM_MM /* * Dispatch SPM calls to SPM SMC handler and return its return * value