Twincpu: Add preprocessor option and configuration TFM_MULTI_CORE_TOPOLOGY

Twincpu is a system that runs SPE and NSPE on two separate
CPU cores. It assumes secure and non-secure code to be built
independently with different CPU configurations.

Use preprocessor option TFM_MULTI_CORE_TOPOLOGY to skip unnecessary
operations in multi-core scenario.
Add configuration TFM_MULTI_CORE_TOPOLOGY to skip unnecessary
files, definitions or sections during building.

Change-Id: Ib94908c17d9ce80a33f0f1a33d9bd086bd16c751
Signed-off-by: David Hu <david.hu@arm.com>
diff --git a/CommonConfig.cmake b/CommonConfig.cmake
index 47b53f3..f08a355 100644
--- a/CommonConfig.cmake
+++ b/CommonConfig.cmake
@@ -56,6 +56,17 @@
 	include(${PLATFORM_CMAKE_FILE})
 endif()
 
+if (DEFINED TFM_MULTI_CORE_TOPOLOGY AND TFM_MULTI_CORE_TOPOLOGY)
+	# CMSE is unnecessary in multi-core scenarios.
+	# TODO: Need further discussion about if CMSE is required when an Armv8-M
+	# core acts as secure core in multi-core scenario.
+	set (CMSE_FLAGS "")
+	set (ARM_FEATURE_CMSE 0)
+else()
+	set (CMSE_FLAGS "-mcmse")
+	set (ARM_FEATURE_CMSE 3)
+endif()
+
 if(${COMPILER} STREQUAL "ARMCLANG")
 	#Use any ARMCLANG version found on PATH. Note: Only versions supported by the
 	#build system will work. A file cmake/Common/CompilerArmClangXY.cmake
@@ -63,7 +74,7 @@
 	include("Common/FindArmClang")
 	include("Common/${ARMCLANG_MODULE}")
 
-	set (COMMON_COMPILE_FLAGS -fshort-enums -fshort-wchar -funsigned-char -mfpu=none -mcmse -ffunction-sections -fdata-sections)
+	set (COMMON_COMPILE_FLAGS -fshort-enums -fshort-wchar -funsigned-char -mfpu=none ${CMSE_FLAGS} -ffunction-sections -fdata-sections)
 	##Shared compiler settings.
 	function(config_setting_shared_compiler_flags tgt)
 		embedded_set_target_compile_flags(TARGET ${tgt} LANGUAGE C FLAGS -xc -std=c99 ${COMMON_COMPILE_FLAGS} -Wall -Werror)
@@ -80,7 +91,7 @@
 	include("Common/FindGNUARM")
 	include("Common/${GNUARM_MODULE}")
 
-	set (COMMON_COMPILE_FLAGS -fshort-enums -fshort-wchar -funsigned-char -msoft-float -mcmse -ffunction-sections -fdata-sections --specs=nano.specs)
+	set (COMMON_COMPILE_FLAGS -fshort-enums -fshort-wchar -funsigned-char -msoft-float ${CMSE_FLAGS} -ffunction-sections -fdata-sections --specs=nano.specs)
 	##Shared compiler and linker settings.
 	function(config_setting_shared_compiler_flags tgt)
 		embedded_set_target_compile_flags(TARGET ${tgt} LANGUAGE C FLAGS -xc -std=c99 ${COMMON_COMPILE_FLAGS} -Wall -Werror -Wno-format -Wno-return-type -Wno-unused-but-set-variable)
@@ -269,7 +280,7 @@
 endif()
 
 ##Set Mbed TLS compiler flags and variables for audit log and crypto
-set(MBEDTLS_C_FLAGS_SERVICES "-D__ARM_FEATURE_CMSE=3 -D__thumb2__ ${COMMON_COMPILE_FLAGS_STR} -I${CMAKE_CURRENT_LIST_DIR}/platform/ext/common")
+set(MBEDTLS_C_FLAGS_SERVICES "-D__ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} -D__thumb2__ ${COMMON_COMPILE_FLAGS_STR} -I${CMAKE_CURRENT_LIST_DIR}/platform/ext/common")
 
 #Default TF-M secure storage flags.
 #These flags values can be overwritten by setting them in platform/ext/<TARGET_NAME>.cmake
@@ -311,7 +322,7 @@
 endif()
 
 ##Set mbedTLS compiler flags for BL2 bootloader
-set(MBEDTLS_C_FLAGS_BL2 "-D__ARM_FEATURE_CMSE=3 -D__thumb2__ ${COMMON_COMPILE_FLAGS_STR} -DMBEDTLS_CONFIG_FILE=\\\\\\\"config-boot.h\\\\\\\" -I${CMAKE_CURRENT_LIST_DIR}/bl2/ext/mcuboot/include")
+set(MBEDTLS_C_FLAGS_BL2 "-D__ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} -D__thumb2__ ${COMMON_COMPILE_FLAGS_STR} -DMBEDTLS_CONFIG_FILE=\\\\\\\"config-boot.h\\\\\\\" -I${CMAKE_CURRENT_LIST_DIR}/bl2/ext/mcuboot/include")
 if (MCUBOOT_SIGNATURE_TYPE STREQUAL "RSA-3072")
 	string(APPEND MBEDTLS_C_FLAGS_BL2 " -DMCUBOOT_SIGN_RSA_LEN=3072")
 endif()
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 76872e5..5aba66d 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -147,7 +147,7 @@
 config_setting_shared_compiler_flags(${PROJECT_OBJ_LIB})
 
 #Set macro definitions
-set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=1 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=3)
+set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=1 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE})
 target_compile_definitions(${PROJECT_OBJ_LIB} PRIVATE ${TARGET_COMPILE_DEFINITIONS})
 
 #Set include directories.
diff --git a/platform/ext/common/armclang/tfm_common_s.sct b/platform/ext/common/armclang/tfm_common_s.sct
index d1be424..4896800 100644
--- a/platform/ext/common/armclang/tfm_common_s.sct
+++ b/platform/ext/common/armclang/tfm_common_s.sct
@@ -373,6 +373,7 @@
     ScatterAssert(ImageLimit(SRAM_WATERMARK) <= S_DATA_START + S_DATA_SIZE)
 }
 
+#if !TFM_MULTI_CORE_TOPOLOGY
 LR_VENEER CMSE_VENEER_REGION_START {
     /*
      * Place the CMSE Veneers (containing the SG instruction) in a separate
@@ -383,6 +384,7 @@
         *(Veneer$$CMSE)
     }
 }
+#endif
 
 LR_NS_PARTITION NS_PARTITION_START {
     /* Reserved place for NS application.
diff --git a/platform/ext/common/armclang/tfm_common_s.sct.template b/platform/ext/common/armclang/tfm_common_s.sct.template
index 2273dc2..f56fc03 100644
--- a/platform/ext/common/armclang/tfm_common_s.sct.template
+++ b/platform/ext/common/armclang/tfm_common_s.sct.template
@@ -268,6 +268,7 @@
     ScatterAssert(ImageLimit(SRAM_WATERMARK) <= S_DATA_START + S_DATA_SIZE)
 }
 
+#if !TFM_MULTI_CORE_TOPOLOGY
 LR_VENEER CMSE_VENEER_REGION_START {
     /*
      * Place the CMSE Veneers (containing the SG instruction) in a separate
@@ -278,6 +279,7 @@
         *(Veneer$$CMSE)
     }
 }
+#endif
 
 LR_NS_PARTITION NS_PARTITION_START {
     /* Reserved place for NS application.
diff --git a/platform/ext/common/gcc/tfm_common_s.ld b/platform/ext/common/gcc/tfm_common_s.ld
index 3f2e50d..cd587ec 100644
--- a/platform/ext/common/gcc/tfm_common_s.ld
+++ b/platform/ext/common/gcc/tfm_common_s.ld
@@ -28,7 +28,9 @@
 {
   FLASH   (rx)  : ORIGIN = S_CODE_START, LENGTH = S_CODE_SIZE
   RAM     (rwx) : ORIGIN = S_DATA_START, LENGTH = S_DATA_SIZE
+#if !TFM_MULTI_CORE_TOPOLOGY
   VENEERS (rx)  : ORIGIN = CMSE_VENEER_REGION_START, LENGTH = CMSE_VENEER_REGION_SIZE
+#endif
 }
 
 __heap_size__  = S_HEAP_SIZE;
@@ -1002,6 +1004,7 @@
     Image$$ER_TFM_DATA$$Base = ADDR(.TFM_DATA);
     Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA) + SIZEOF(.TFM_BSS);
 
+#if !TFM_MULTI_CORE_TOPOLOGY
     /*
      * Place the CMSE Veneers (containing the SG instruction) after the code, in a
      * separate 32 bytes aligned region so that the SAU can programmed to just set
@@ -1014,6 +1017,7 @@
     } > VENEERS AT> VENEERS
     Load$$LR$$LR_VENEER$$Base = ADDR(.gnu.sgstubs);
     Load$$LR$$LR_VENEER$$Limit = ADDR(.gnu.sgstubs) + SIZEOF(.gnu.sgstubs);
+#endif
 
     Load$$LR$$LR_NS_PARTITION$$Base = NS_PARTITION_START;
 
diff --git a/platform/ext/common/gcc/tfm_common_s.ld.template b/platform/ext/common/gcc/tfm_common_s.ld.template
index 36d2f62..6a99791 100644
--- a/platform/ext/common/gcc/tfm_common_s.ld.template
+++ b/platform/ext/common/gcc/tfm_common_s.ld.template
@@ -28,7 +28,9 @@
 {
   FLASH   (rx)  : ORIGIN = S_CODE_START, LENGTH = S_CODE_SIZE
   RAM     (rwx) : ORIGIN = S_DATA_START, LENGTH = S_DATA_SIZE
+#if !TFM_MULTI_CORE_TOPOLOGY
   VENEERS (rx)  : ORIGIN = CMSE_VENEER_REGION_START, LENGTH = CMSE_VENEER_REGION_SIZE
+#endif
 }
 
 __heap_size__  = S_HEAP_SIZE;
@@ -550,6 +552,7 @@
     Image$$ER_TFM_DATA$$Base = ADDR(.TFM_DATA);
     Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA) + SIZEOF(.TFM_BSS);
 
+#if !TFM_MULTI_CORE_TOPOLOGY
     /*
      * Place the CMSE Veneers (containing the SG instruction) after the code, in a
      * separate 32 bytes aligned region so that the SAU can programmed to just set
@@ -562,6 +565,7 @@
     } > VENEERS AT> VENEERS
     Load$$LR$$LR_VENEER$$Base = ADDR(.gnu.sgstubs);
     Load$$LR$$LR_VENEER$$Limit = ADDR(.gnu.sgstubs) + SIZEOF(.gnu.sgstubs);
+#endif
 
     Load$$LR$$LR_NS_PARTITION$$Base = NS_PARTITION_START;
 
diff --git a/secure_fw/CMakeLists.txt b/secure_fw/CMakeLists.txt
index 309670b..850f831 100644
--- a/secure_fw/CMakeLists.txt
+++ b/secure_fw/CMakeLists.txt
@@ -40,7 +40,9 @@
 endif()
 
 include(${SECURE_FW_DIR}/spm/CMakeLists.inc)
-include(${SECURE_FW_DIR}/ns_callable/CMakeLists.inc)
+if (NOT DEFINED TFM_MULTI_CORE_TOPOLOGY OR NOT TFM_MULTI_CORE_TOPOLOGY)
+	include(${SECURE_FW_DIR}/ns_callable/CMakeLists.inc)
+endif ()
 #Involve all IPC related sources in ipc's CMakeLists.inc, and switch core between IPC and Library.
 if(TFM_PSA_API)
 	include(${SECURE_FW_DIR}/core/ipc/CMakeLists.inc)
@@ -162,7 +164,7 @@
 	endif()
 
 	#Set macro definitions for the project.
-	set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=0 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=3 TFM_LVL=${TFM_LVL} ${DEBUG_AUTHENTICATION})
+	set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=0 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} TFM_LVL=${TFM_LVL} ${DEBUG_AUTHENTICATION})
 	embedded_set_target_compile_defines(TARGET ${PROJECT_OBJ_LIB} LANGUAGE C DEFINES ${TARGET_COMPILE_DEFINITIONS} APPEND)
 
 	if (REGRESSION OR CORE_TEST)
@@ -234,6 +236,9 @@
 		message(FATAL_ERROR "Incomplete build configuration: TFM_PSA_API is undefined. ")
 	elseif (TFM_PSA_API)
 		embedded_set_target_link_defines(TARGET ${EXE_NAME} DEFINES "TFM_PSA_API")
+		if (DEFINED TFM_MULTI_CORE_TOPOLOGY AND TFM_MULTI_CORE_TOPOLOGY)
+			embedded_set_target_link_defines(TARGET ${EXE_NAME} DEFINES "TFM_MULTI_CORE_TOPOLOGY")
+		endif()
 	endif()
 
 	if(CORE_TEST)
diff --git a/secure_fw/services/audit_logging/CMakeLists.txt b/secure_fw/services/audit_logging/CMakeLists.txt
index 695ba41..0318181 100644
--- a/secure_fw/services/audit_logging/CMakeLists.txt
+++ b/secure_fw/services/audit_logging/CMakeLists.txt
@@ -31,7 +31,7 @@
 
 #Specify what we build (for the audit logging service, build as a static library)
 add_library(tfm_audit STATIC ${ALL_SRC_ASM} ${ALL_SRC_C})
-embedded_set_target_compile_defines(TARGET tfm_audit LANGUAGE C DEFINES __ARM_FEATURE_CMSE=3 __thumb2__ TFM_LVL=${TFM_LVL})
+embedded_set_target_compile_defines(TARGET tfm_audit LANGUAGE C DEFINES __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} __thumb2__ TFM_LVL=${TFM_LVL})
 
 #Set common compiler and linker flags
 config_setting_shared_compiler_flags(tfm_audit)
diff --git a/secure_fw/services/crypto/CMakeLists.txt b/secure_fw/services/crypto/CMakeLists.txt
index fd1f2c5..1b48819 100644
--- a/secure_fw/services/crypto/CMakeLists.txt
+++ b/secure_fw/services/crypto/CMakeLists.txt
@@ -38,7 +38,7 @@
 include(CMakeLists.inc)
 
 #Create a list of the C defines
-list(APPEND TFM_CRYPTO_C_DEFINES_LIST __ARM_FEATURE_CMSE=3 __thumb2__ TFM_LVL=${TFM_LVL})
+list(APPEND TFM_CRYPTO_C_DEFINES_LIST __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} __thumb2__ TFM_LVL=${TFM_LVL})
 
 if (CRYPTO_ENGINE_MBEDTLS)
   list(APPEND TFM_CRYPTO_C_DEFINES_LIST TFM_CRYPTO_ENGINE_MBEDTLS MBEDTLS_CONFIG_FILE="platform/ext/common/tfm_mbedcrypto_config.h")
diff --git a/secure_fw/services/initial_attestation/CMakeLists.txt b/secure_fw/services/initial_attestation/CMakeLists.txt
index 4717db4..7b775db 100644
--- a/secure_fw/services/initial_attestation/CMakeLists.txt
+++ b/secure_fw/services/initial_attestation/CMakeLists.txt
@@ -40,7 +40,7 @@
 
 #Specify what we build (for the initial attestation service, build as a static library)
 add_library(tfm_attest STATIC ${ALL_SRC_ASM} ${ALL_SRC_C} $<TARGET_OBJECTS:tfm_qcbor> $<TARGET_OBJECTS:tfm_t_cose_sign>)
-embedded_set_target_compile_defines(TARGET tfm_attest LANGUAGE C DEFINES __ARM_FEATURE_CMSE=3 __thumb2__ TFM_LVL=${TFM_LVL})
+embedded_set_target_compile_defines(TARGET tfm_attest LANGUAGE C DEFINES __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} __thumb2__ TFM_LVL=${TFM_LVL})
 
 #Set common compiler flags
 config_setting_shared_compiler_flags(tfm_attest)
diff --git a/secure_fw/services/platform/CMakeLists.txt b/secure_fw/services/platform/CMakeLists.txt
index bc12c4d..4ec565f 100644
--- a/secure_fw/services/platform/CMakeLists.txt
+++ b/secure_fw/services/platform/CMakeLists.txt
@@ -31,7 +31,7 @@
 
 #Specify what we build (for the platform service, build as a static library)
 add_library(tfm_platform STATIC ${ALL_SRC_ASM} ${ALL_SRC_C})
-embedded_set_target_compile_defines(TARGET tfm_platform LANGUAGE C DEFINES __ARM_FEATURE_CMSE=3 __thumb2__ TFM_LVL=${TFM_LVL})
+embedded_set_target_compile_defines(TARGET tfm_platform LANGUAGE C DEFINES __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} __thumb2__ TFM_LVL=${TFM_LVL})
 
 #Set common compiler and linker flags
 config_setting_shared_compiler_flags(tfm_platform)
diff --git a/secure_fw/services/secure_storage/CMakeLists.txt b/secure_fw/services/secure_storage/CMakeLists.txt
index 44e916c..5983898 100644
--- a/secure_fw/services/secure_storage/CMakeLists.txt
+++ b/secure_fw/services/secure_storage/CMakeLists.txt
@@ -36,6 +36,6 @@
 config_setting_shared_compiler_flags(tfm_storage)
 config_setting_shared_linker_flags(tfm_storage)
 
-embedded_set_target_compile_defines(TARGET tfm_storage LANGUAGE C DEFINES __ARM_FEATURE_CMSE=3 __thumb2__ TFM_LVL=${TFM_LVL})
+embedded_set_target_compile_defines(TARGET tfm_storage LANGUAGE C DEFINES __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} __thumb2__ TFM_LVL=${TFM_LVL})
 
 embedded_project_end(tfm_storage)
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index b5ce86f..8919e63 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -109,7 +109,7 @@
 config_setting_shared_compiler_flags(tfm_secure_tests)
 config_setting_shared_linker_flags(tfm_secure_tests)
 
-embedded_set_target_compile_defines(TARGET tfm_secure_tests LANGUAGE C DEFINES __thumb2__ __ARM_FEATURE_CMSE=3 TFM_LVL=${TFM_LVL} APPEND)
+embedded_set_target_compile_defines(TARGET tfm_secure_tests LANGUAGE C DEFINES __thumb2__ __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} TFM_LVL=${TFM_LVL} APPEND)
 
 
 #Build the non-secure library
@@ -121,7 +121,7 @@
 config_setting_shared_linker_flags(tfm_non_secure_tests)
 
 #Set macro definitions
-set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=1 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=3 TFM_LVL=${TFM_LVL})
+set(TARGET_COMPILE_DEFINITIONS __thumb2__ __DOMAIN_NS=1 DOMAIN_NS=__DOMAIN_NS __ARM_FEATURE_CMSE=${ARM_FEATURE_CMSE} TFM_LVL=${TFM_LVL})
 embedded_set_target_compile_defines(TARGET tfm_non_secure_tests LANGUAGE C DEFINES ${TARGET_COMPILE_DEFINITIONS} APPEND)
 
 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)