SPM: Restructure SPM folder
- Change model_ipc to cmsis_psa, and move arch into it.
- Change model_func to cmsis_func, and move arch related operations to
arch.c file.
- Remove tfm_spm_services.c, and move related function into cmsis_psa
and cmsis_func.
- Move tfm_arch.h and tfm_arch_v8m.h into spm/include, so this header
could be shared by cmsis_psa and cmsis_func.
Change-Id: I120395a6f613cb151c144c344a9394efdfb2b67d
Signed-off-by: Summer Qin <summer.qin@arm.com>
diff --git a/secure_fw/CMakeLists.txt b/secure_fw/CMakeLists.txt
index 8f7780f..7e0eee8 100644
--- a/secure_fw/CMakeLists.txt
+++ b/secure_fw/CMakeLists.txt
@@ -98,13 +98,11 @@
#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}/spm/model_ipc/CMakeLists.inc)
+ include(${SECURE_FW_DIR}/spm/cmsis_psa/CMakeLists.inc)
else()
- include(${SECURE_FW_DIR}/spm/model_func/CMakeLists.inc)
+ include(${SECURE_FW_DIR}/spm/cmsis_func/CMakeLists.inc)
endif()
-include(${SECURE_FW_DIR}/spm/arch/CMakeLists.inc)
-
set(BUILD_CMSIS_CORE On)
set(BUILD_RETARGET On)
set(BUILD_NATIVE_DRIVERS On)
diff --git a/secure_fw/spm/model_func/CMakeLists.inc b/secure_fw/spm/cmsis_func/CMakeLists.inc
similarity index 84%
rename from secure_fw/spm/model_func/CMakeLists.inc
rename to secure_fw/spm/cmsis_func/CMakeLists.inc
index 9720fc1..b9235f0 100644
--- a/secure_fw/spm/model_func/CMakeLists.inc
+++ b/secure_fw/spm/cmsis_func/CMakeLists.inc
@@ -30,20 +30,19 @@
#Get the current directory where this file is located.
set(SFW_FUNC_SPM_DIR ${CMAKE_CURRENT_LIST_DIR})
set(SFW_SPM_DIR "${SFW_FUNC_SPM_DIR}/..")
-set(SFW_SPM_ARCH_DIR "${SFW_SPM_DIR}/arch")
-set(SFW_SPM_INIT_DIR "${SFW_SPM_DIR}/init")
+set(SFW_SPM_INIT_DIR "${SFW_SPM_DIR}/common/init")
+set(SFW_SPM_RUNTIME_DIR "${SFW_SPM_DIR}/common/runtime")
set (SFW_FUNC_SPM_SRC
"${SFW_SPM_INIT_DIR}/tfm_boot_data.c"
"${SFW_SPM_INIT_DIR}/tfm_core.c"
"${SFW_FUNC_SPM_DIR}/tfm_core_svcalls_func.c"
"${SFW_FUNC_SPM_DIR}/tfm_secure_api.c"
- "${SFW_FUNC_SPM_DIR}/../runtime/tfm_spm_services.c"
"${SFW_FUNC_SPM_DIR}/spm_func.c"
"${SFW_FUNC_SPM_DIR}/tfm_nspm_func.c"
- "${SFW_FUNC_SPM_DIR}/../runtime/utilities.c"
- "${SFW_FUNC_SPM_DIR}/../runtime/tfm_core_mem_check.c"
- "${SFW_FUNC_SPM_DIR}/../runtime/tfm_core_utils.c"
+ "${SFW_SPM_RUNTIME_DIR}/utilities.c"
+ "${SFW_SPM_RUNTIME_DIR}/tfm_core_mem_check.c"
+ "${SFW_SPM_RUNTIME_DIR}/tfm_core_utils.c"
"${SFW_FUNC_SPM_DIR}/tfm_veneers.c"
"${SFW_FUNC_SPM_DIR}/arch.c"
)
@@ -57,5 +56,4 @@
embedded_include_directories(PATH ${TFM_ROOT_DIR}/interface/include ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/include ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/spm/include ABSOLUTE)
-embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/spm/arch ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/bl2/include ABSOLUTE)
diff --git a/secure_fw/spm/cmsis_func/arch.c b/secure_fw/spm/cmsis_func/arch.c
new file mode 100644
index 0000000..d142e84
--- /dev/null
+++ b/secure_fw/spm/cmsis_func/arch.c
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "tfm_secure_api.h"
+#include "tfm_internal.h"
+#include "tfm/tfm_spm_services.h"
+
+nsfptr_t ns_entry;
+
+void jump_to_ns_code(void)
+{
+ /* Calls the non-secure Reset_Handler to jump to the non-secure binary */
+ ns_entry();
+}
+
+__attribute__((naked))
+int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id)
+{
+ __ASM volatile(
+ "SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_GET_CALLER_CLIENT_ID));
+}
+
+__attribute__((naked))
+int32_t tfm_spm_request(void)
+{
+ __ASM volatile(
+ "SVC %0\n"
+ "BX lr\n"
+ : : "I" (TFM_SVC_SPM_REQUEST));
+}
+
+__attribute__((naked))
+int32_t tfm_spm_request_reset_vote(void)
+{
+ __ASM volatile(
+ "MOVS R0, %0\n"
+ "B tfm_spm_request\n"
+ : : "I" (TFM_SPM_REQUEST_RESET_VOTE));
+}
+
+__attribute__((naked))
+void tfm_enable_irq(psa_signal_t irq_signal)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_ENABLE_IRQ));
+}
+
+__attribute__((naked))
+void tfm_disable_irq(psa_signal_t irq_signal)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_DISABLE_IRQ));
+}
+
+__attribute__((naked))
+static psa_signal_t psa_wait_internal(psa_signal_t signal_mask,
+ uint32_t timeout)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_PSA_WAIT));
+}
+
+psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout)
+{
+ /* FIXME: By using the 'WFI' instruction this function blocks until an
+ * interrupt happens. It is necessary to do this here as tfm_core_psa_wait
+ * runs with the priority of the SVC, so it cannot be interrupted, so
+ * waiting in it for the required interrupt to happen is not an option.
+ */
+ psa_signal_t actual_signal_mask;
+
+ while (1) {
+ actual_signal_mask = psa_wait_internal(signal_mask, timeout);
+ if ((actual_signal_mask & signal_mask) != 0) {
+ return actual_signal_mask;
+ }
+ __WFI();
+ }
+}
+
+__attribute__((naked))
+void psa_eoi(psa_signal_t irq_signal)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_PSA_EOI));
+}
+
+#if defined(__ARM_ARCH_8_1M_MAIN__) || defined(__ARM_ARCH_8M_MAIN__)
+__attribute__((section("SFN"), naked))
+int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr)
+{
+ __ASM volatile(
+ "PUSH {r4-r12, lr} \n"
+ "SVC %[SVC_REQ] \n"
+ "MOV r4, #0 \n"
+ "MOV r5, r4 \n"
+ "MOV r6, r4 \n"
+ "MOV r7, r4 \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r4 \n"
+ "MOV r10, r4 \n"
+ "MOV r11, r4 \n"
+ "BLX lr \n"
+ "SVC %[SVC_RET] \n"
+ "POP {r4-r12, pc} \n"
+ : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST),
+ [SVC_RET] "I" (TFM_SVC_SFN_RETURN)
+ );
+}
+
+__attribute__((section("SFN"), naked))
+void priv_irq_handler_main(uint32_t partition_id, uint32_t unpriv_handler,
+ uint32_t irq_signal, uint32_t irq_line)
+{
+ __ASM(
+ /* Save the callee saved registers*/
+ "PUSH {r4-r12, lr} \n"
+ /* Request SVC to configure environment for the unpriv IRQ handler */
+ "SVC %[SVC_REQ] \n"
+ /* clear the callee saved registers to prevent information leak */
+ "MOV r4, #0 \n"
+ "MOV r5, r4 \n"
+ "MOV r6, r4 \n"
+ "MOV r7, r4 \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r4 \n"
+ "MOV r10, r4 \n"
+ "MOV r11, r4 \n"
+ /* Branch to the unprivileged handler */
+ "BLX lr \n"
+ /* Request SVC to reconfigure the environment of the interrupted
+ * partition
+ */
+ "SVC %[SVC_RET] \n"
+ /* restore callee saved registers and return */
+ "POP {r4-r12, pc} \n"
+ : : [SVC_REQ] "I" (TFM_SVC_DEPRIV_REQ)
+ , [SVC_RET] "I" (TFM_SVC_DEPRIV_RET)
+ );
+}
+#elif defined(__ARM_ARCH_8M_BASE__)
+__attribute__((section("SFN"), naked))
+int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr)
+{
+ __ASM volatile(
+ "PUSH {lr} \n"
+ "PUSH {r4-r7} \n"
+ "MOV r4, r8 \n"
+ "MOV r5, r9 \n"
+ "MOV r6, r10 \n"
+ "MOV r7, r11 \n"
+ "PUSH {r4-r7} \n"
+ "MOV r4, r12 \n"
+ "PUSH {r4} \n"
+ "SVC %[SVC_REQ] \n"
+ "MOVS r4, #0 \n"
+ "MOV r5, r4 \n"
+ "MOV r6, r4 \n"
+ "MOV r7, r4 \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r4 \n"
+ "MOV r10, r4 \n"
+ "MOV r11, r4 \n"
+ "BLX lr \n"
+ "SVC %[SVC_RET] \n"
+ "POP {r4} \n"
+ "MOV r12, r4 \n"
+ "POP {r4-r7} \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r5 \n"
+ "MOV r10, r6 \n"
+ "MOV r11, r7 \n"
+ "POP {r4-r7} \n"
+ "POP {pc} \n"
+ : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST),
+ [SVC_RET] "I" (TFM_SVC_SFN_RETURN)
+ );
+}
+
+__attribute__((section("SFN"), naked))
+void priv_irq_handler_main(uint32_t partition_id, uint32_t unpriv_handler,
+ uint32_t irq_signal, uint32_t irq_line)
+{
+ __ASM(
+ /* Save the callee saved registers*/
+ "PUSH {r4-r7, lr} \n"
+ "MOV r4, r8 \n"
+ "MOV r5, r9 \n"
+ "MOV r6, r10 \n"
+ "MOV r7, r11 \n"
+ "PUSH {r4-r7} \n"
+ "MOV r4, r12 \n"
+ "PUSH {r4} \n"
+ /* Request SVC to configure environment for the unpriv IRQ handler */
+ "SVC %[SVC_REQ] \n"
+ /* clear the callee saved registers to prevent information leak */
+ "MOVS r4, #0 \n"
+ "MOV r5, r4 \n"
+ "MOV r6, r4 \n"
+ "MOV r7, r4 \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r4 \n"
+ "MOV r10, r4 \n"
+ "MOV r11, r4 \n"
+ /* Branch to the unprivileged handler */
+ "BLX lr \n"
+ /* Request SVC to reconfigure the environment of the interrupted
+ * partition
+ */
+ "SVC %[SVC_RET] \n"
+ /* restore callee saved registers and return */
+ "POP {r4} \n"
+ "MOV r12, r4 \n"
+ "POP {r4-r7} \n"
+ "MOV r8, r4 \n"
+ "MOV r9, r5 \n"
+ "MOV r10, r6 \n"
+ "MOV r11, r7 \n"
+ "POP {r4-r7, pc} \n"
+ : : [SVC_REQ] "I" (TFM_SVC_DEPRIV_REQ)
+ , [SVC_RET] "I" (TFM_SVC_DEPRIV_RET)
+ );
+}
+#endif
+
+#if defined(__ARM_ARCH_8_1M_MAIN__) || \
+ defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8M_BASE__)
+void tfm_arch_prioritize_secure_exception(void)
+{
+ uint32_t VECTKEY;
+ SCB_Type *scb = SCB;
+ uint32_t AIRCR;
+
+ /* Set PRIS flag in AIRCR */
+ AIRCR = scb->AIRCR;
+ VECTKEY = (~AIRCR & SCB_AIRCR_VECTKEYSTAT_Msk);
+ scb->AIRCR = SCB_AIRCR_PRIS_Msk |
+ VECTKEY |
+ (AIRCR & ~SCB_AIRCR_VECTKEY_Msk);
+}
+#elif defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_7M__) || \
+ defined(__ARM_ARCH_7EM__)
+void tfm_arch_prioritize_secure_exception(void)
+{
+}
+#endif
+
+#if defined(__ARM_ARCH_8_1M_MAIN__) || defined(__ARM_ARCH_8M_MAIN__)
+__attribute__((naked)) void SVC_Handler(void)
+{
+ __ASM volatile(
+ "MRS r2, MSP \n"
+ /* Check store SP in thread mode to r0 */
+ "TST lr, #4 \n"
+ "ITE EQ \n"
+ "MOVEQ r0, r2 \n"
+ "MRSNE r0, PSP \n"
+ "MOV r1, lr \n"
+ "BL tfm_core_svc_handler \n"
+ "BX r0 \n"
+ );
+}
+#elif defined(__ARM_ARCH_8M_BASE__)
+__attribute__((naked)) void SVC_Handler(void)
+{
+ __ASM volatile(
+ "MRS r2, MSP \n"
+ "MOVS r1, #4 \n"
+ "MOV r3, lr \n"
+ "MOV r0, r2 \n"
+ "TST r1, r3 \n"
+ "BEQ handler \n"
+ /* If SVC was made from thread mode, overwrite r0 with PSP */
+ "MRS r0, PSP \n"
+ "handler: \n"
+ "MOV r1, lr \n"
+ "BL tfm_core_svc_handler \n"
+ "BX r0 \n"
+ );
+}
+#elif defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_7M__) || \
+ defined(__ARM_ARCH_7EM__)
+__attribute__((naked)) void SVC_Handler(void)
+{
+ __ASM volatile(
+ "MOVS r0, #4 \n" /* Check store SP in thread mode to r0 */
+ "MOV r1, lr \n"
+ "TST r0, r1 \n"
+ "BEQ handler \n"
+ "MRS r0, PSP \n" /* Coming from thread mode */
+ "B sp_stored \n"
+ "handler: \n"
+ "BX lr \n" /* Coming from handler mode */
+ "sp_stored: \n"
+ "MOV r1, lr \n"
+ "BL tfm_core_svc_handler \n"
+ "BX r0 \n"
+ );
+}
+#endif
diff --git a/secure_fw/spm/model_func/spm_func.c b/secure_fw/spm/cmsis_func/spm_func.c
similarity index 100%
rename from secure_fw/spm/model_func/spm_func.c
rename to secure_fw/spm/cmsis_func/spm_func.c
diff --git a/secure_fw/spm/model_func/tfm_core_svcalls_func.c b/secure_fw/spm/cmsis_func/tfm_core_svcalls_func.c
similarity index 100%
rename from secure_fw/spm/model_func/tfm_core_svcalls_func.c
rename to secure_fw/spm/cmsis_func/tfm_core_svcalls_func.c
diff --git a/secure_fw/spm/model_func/tfm_nspm_func.c b/secure_fw/spm/cmsis_func/tfm_nspm_func.c
similarity index 100%
rename from secure_fw/spm/model_func/tfm_nspm_func.c
rename to secure_fw/spm/cmsis_func/tfm_nspm_func.c
diff --git a/secure_fw/spm/model_func/tfm_secure_api.c b/secure_fw/spm/cmsis_func/tfm_secure_api.c
similarity index 100%
rename from secure_fw/spm/model_func/tfm_secure_api.c
rename to secure_fw/spm/cmsis_func/tfm_secure_api.c
diff --git a/secure_fw/spm/model_func/tfm_secure_irq_handlers.inc b/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc
similarity index 100%
rename from secure_fw/spm/model_func/tfm_secure_irq_handlers.inc
rename to secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc
diff --git a/secure_fw/spm/model_func/tfm_secure_irq_handlers.inc.template b/secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template
similarity index 100%
rename from secure_fw/spm/model_func/tfm_secure_irq_handlers.inc.template
rename to secure_fw/spm/cmsis_func/tfm_secure_irq_handlers.inc.template
diff --git a/secure_fw/spm/model_func/tfm_spm_db_func.inc b/secure_fw/spm/cmsis_func/tfm_spm_db_func.inc
similarity index 100%
rename from secure_fw/spm/model_func/tfm_spm_db_func.inc
rename to secure_fw/spm/cmsis_func/tfm_spm_db_func.inc
diff --git a/secure_fw/spm/model_func/tfm_spm_db_func.inc.template b/secure_fw/spm/cmsis_func/tfm_spm_db_func.inc.template
similarity index 100%
rename from secure_fw/spm/model_func/tfm_spm_db_func.inc.template
rename to secure_fw/spm/cmsis_func/tfm_spm_db_func.inc.template
diff --git a/secure_fw/spm/model_func/tfm_veneers.c b/secure_fw/spm/cmsis_func/tfm_veneers.c
similarity index 100%
rename from secure_fw/spm/model_func/tfm_veneers.c
rename to secure_fw/spm/cmsis_func/tfm_veneers.c
diff --git a/secure_fw/spm/model_func/tfm_veneers.c.template b/secure_fw/spm/cmsis_func/tfm_veneers.c.template
similarity index 100%
rename from secure_fw/spm/model_func/tfm_veneers.c.template
rename to secure_fw/spm/cmsis_func/tfm_veneers.c.template
diff --git a/secure_fw/spm/model_ipc/CMakeLists.inc b/secure_fw/spm/cmsis_psa/CMakeLists.inc
similarity index 86%
rename from secure_fw/spm/model_ipc/CMakeLists.inc
rename to secure_fw/spm/cmsis_psa/CMakeLists.inc
index a0736b8..3182fd4 100644
--- a/secure_fw/spm/model_ipc/CMakeLists.inc
+++ b/secure_fw/spm/cmsis_psa/CMakeLists.inc
@@ -30,8 +30,9 @@
#Get the current directory where this file is located.
set(SFW_IPC_SPM_DIR ${CMAKE_CURRENT_LIST_DIR})
set(SFW_SPM_DIR "${SFW_IPC_SPM_DIR}/..")
-set(SFW_SPM_ARCH_DIR "${SFW_SPM_DIR}/arch")
-set(SFW_SPM_INIT_DIR "${SFW_SPM_DIR}/init")
+set(SFW_SPM_ARCH_DIR "${SFW_IPC_SPM_DIR}/arch")
+set(SFW_SPM_INIT_DIR "${SFW_SPM_DIR}/common/init")
+set(SFW_SPM_RUNTIME_DIR "${SFW_SPM_DIR}/common/runtime")
set (SFW_IPC_SPM_SRC
"${SFW_SPM_INIT_DIR}/tfm_boot_data.c"
@@ -40,9 +41,8 @@
"${SFW_IPC_SPM_DIR}/spm_psa_client_call.c"
"${SFW_IPC_SPM_DIR}/tfm_core_svcalls_ipc.c"
"${SFW_IPC_SPM_DIR}/tfm_message_queue.c"
- "${SFW_IPC_SPM_DIR}/../runtime/utilities.c"
- "${SFW_IPC_SPM_DIR}/../runtime/tfm_core_utils.c"
- "${SFW_IPC_SPM_DIR}/../runtime/tfm_spm_services.c"
+ "${SFW_SPM_RUNTIME_DIR}/utilities.c"
+ "${SFW_SPM_RUNTIME_DIR}/tfm_core_utils.c"
"${SFW_IPC_SPM_DIR}/tfm_pools.c"
"${SFW_IPC_SPM_DIR}/tfm_thread.c"
"${SFW_IPC_SPM_DIR}/tfm_wait.c"
@@ -57,7 +57,7 @@
else ()
list(APPEND SFW_IPC_SPM_SRC "${SFW_IPC_SPM_DIR}/tfm_nspm_ipc.c"
"${SFW_IPC_SPM_DIR}/tfm_psa_api_veneers.c"
- "${SFW_IPC_SPM_DIR}/../runtime/tfm_core_mem_check.c"
+ "${SFW_SPM_RUNTIME_DIR}/tfm_core_mem_check.c"
)
endif ()
@@ -71,5 +71,8 @@
embedded_include_directories(PATH ${TFM_ROOT_DIR}/interface/include ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/include ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/spm/include ABSOLUTE)
-embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/spm/arch ABSOLUTE)
+embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/spm/cmsis_psa/arch ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/bl2/include ABSOLUTE)
+
+#Involve all IPC related sources in psa CMakeLists.inc
+include(${SFW_IPC_SPM_DIR}/arch/CMakeLists.inc)
diff --git a/secure_fw/spm/arch/CMakeLists.inc b/secure_fw/spm/cmsis_psa/arch/CMakeLists.inc
similarity index 97%
rename from secure_fw/spm/arch/CMakeLists.inc
rename to secure_fw/spm/cmsis_psa/arch/CMakeLists.inc
index 01ab370..c0616cd 100644
--- a/secure_fw/spm/arch/CMakeLists.inc
+++ b/secure_fw/spm/cmsis_psa/arch/CMakeLists.inc
@@ -57,4 +57,3 @@
#Setting include directories
embedded_include_directories(PATH ${TFM_ROOT_DIR}/platform/ext/cmsis ABSOLUTE)
embedded_include_directories(PATH ${TFM_ROOT_DIR}/secure_fw/include ABSOLUTE)
-embedded_include_directories(PATH ${TFM_ARCH_DIR}/include ABSOLUTE)
diff --git a/secure_fw/spm/arch/tfm_arch.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch.c
similarity index 67%
rename from secure_fw/spm/arch/tfm_arch.c
rename to secure_fw/spm/cmsis_psa/arch/tfm_arch.c
index 54df423..99e6cbf 100644
--- a/secure_fw/spm/arch/tfm_arch.c
+++ b/secure_fw/spm/cmsis_psa/arch/tfm_arch.c
@@ -7,8 +7,43 @@
#include "tfm_arch.h"
#include "tfm_core_utils.h"
+#include "tfm/tfm_core_svc.h"
+#include "tfm/tfm_spm_services.h"
-#ifdef TFM_PSA_API
+__attribute__((naked))
+int32_t tfm_spm_request(void)
+{
+ __ASM volatile(
+ "SVC %0\n"
+ "BX lr\n"
+ : : "I" (TFM_SVC_SPM_REQUEST));
+}
+
+__attribute__((naked))
+int32_t tfm_spm_request_reset_vote(void)
+{
+ __ASM volatile(
+ "MOVS R0, %0\n"
+ "B tfm_spm_request\n"
+ : : "I" (TFM_SPM_REQUEST_RESET_VOTE));
+}
+
+__attribute__((naked))
+void tfm_enable_irq(psa_signal_t irq_signal)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_ENABLE_IRQ));
+}
+
+__attribute__((naked))
+void tfm_disable_irq(psa_signal_t irq_signal)
+{
+ __ASM("SVC %0\n"
+ "BX LR\n"
+ : : "I" (TFM_SVC_DISABLE_IRQ));
+}
+
static void tfm_arch_init_state_ctx(struct tfm_state_context_t *p_stat_ctx,
void *param, uintptr_t pfn)
{
@@ -48,5 +83,3 @@
tfm_core_util_memset(p_actx, 0, sizeof(*p_actx));
tfm_arch_init_actx(p_actx, (uint32_t)p_stat_ctx, (uint32_t)stk_btm);
}
-
-#endif /* TFM_PSA_API */
diff --git a/secure_fw/spm/arch/tfm_arch_v6m_v7m.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v6m_v7m.c
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch_v6m_v7m.c
rename to secure_fw/spm/cmsis_psa/arch/tfm_arch_v6m_v7m.c
diff --git a/secure_fw/spm/arch/tfm_arch_v6m_v7m.h b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v6m_v7m.h
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch_v6m_v7m.h
rename to secure_fw/spm/cmsis_psa/arch/tfm_arch_v6m_v7m.h
diff --git a/secure_fw/spm/arch/tfm_arch_v8m_base.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch_v8m_base.c
rename to secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c
diff --git a/secure_fw/spm/arch/tfm_arch_v8m_main.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch_v8m_main.c
rename to secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c
diff --git a/secure_fw/spm/model_ipc/include/tfm_internal_defines.h b/secure_fw/spm/cmsis_psa/include/tfm_internal_defines.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_internal_defines.h
rename to secure_fw/spm/cmsis_psa/include/tfm_internal_defines.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_list.h b/secure_fw/spm/cmsis_psa/include/tfm_list.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_list.h
rename to secure_fw/spm/cmsis_psa/include/tfm_list.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_message_queue.h b/secure_fw/spm/cmsis_psa/include/tfm_message_queue.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_message_queue.h
rename to secure_fw/spm/cmsis_psa/include/tfm_message_queue.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_multi_core.h b/secure_fw/spm/cmsis_psa/include/tfm_multi_core.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_multi_core.h
rename to secure_fw/spm/cmsis_psa/include/tfm_multi_core.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_pools.h b/secure_fw/spm/cmsis_psa/include/tfm_pools.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_pools.h
rename to secure_fw/spm/cmsis_psa/include/tfm_pools.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_rpc.h b/secure_fw/spm/cmsis_psa/include/tfm_rpc.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_rpc.h
rename to secure_fw/spm/cmsis_psa/include/tfm_rpc.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_spe_mailbox.h b/secure_fw/spm/cmsis_psa/include/tfm_spe_mailbox.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_spe_mailbox.h
rename to secure_fw/spm/cmsis_psa/include/tfm_spe_mailbox.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_svcalls.h b/secure_fw/spm/cmsis_psa/include/tfm_svcalls.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_svcalls.h
rename to secure_fw/spm/cmsis_psa/include/tfm_svcalls.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_thread.h b/secure_fw/spm/cmsis_psa/include/tfm_thread.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_thread.h
rename to secure_fw/spm/cmsis_psa/include/tfm_thread.h
diff --git a/secure_fw/spm/model_ipc/include/tfm_wait.h b/secure_fw/spm/cmsis_psa/include/tfm_wait.h
similarity index 100%
rename from secure_fw/spm/model_ipc/include/tfm_wait.h
rename to secure_fw/spm/cmsis_psa/include/tfm_wait.h
diff --git a/secure_fw/spm/model_ipc/spm_ipc.c b/secure_fw/spm/cmsis_psa/spm_ipc.c
similarity index 100%
rename from secure_fw/spm/model_ipc/spm_ipc.c
rename to secure_fw/spm/cmsis_psa/spm_ipc.c
diff --git a/secure_fw/spm/model_ipc/spm_psa_client_call.c b/secure_fw/spm/cmsis_psa/spm_psa_client_call.c
similarity index 100%
rename from secure_fw/spm/model_ipc/spm_psa_client_call.c
rename to secure_fw/spm/cmsis_psa/spm_psa_client_call.c
diff --git a/secure_fw/spm/model_ipc/spm_psa_client_call.h b/secure_fw/spm/cmsis_psa/spm_psa_client_call.h
similarity index 100%
rename from secure_fw/spm/model_ipc/spm_psa_client_call.h
rename to secure_fw/spm/cmsis_psa/spm_psa_client_call.h
diff --git a/secure_fw/spm/model_ipc/tfm_core_svcalls_ipc.c b/secure_fw/spm/cmsis_psa/tfm_core_svcalls_ipc.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_core_svcalls_ipc.c
rename to secure_fw/spm/cmsis_psa/tfm_core_svcalls_ipc.c
diff --git a/secure_fw/spm/model_ipc/tfm_message_queue.c b/secure_fw/spm/cmsis_psa/tfm_message_queue.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_message_queue.c
rename to secure_fw/spm/cmsis_psa/tfm_message_queue.c
diff --git a/secure_fw/spm/model_ipc/tfm_multi_core.c b/secure_fw/spm/cmsis_psa/tfm_multi_core.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_multi_core.c
rename to secure_fw/spm/cmsis_psa/tfm_multi_core.c
diff --git a/secure_fw/spm/model_ipc/tfm_multi_core_mem_check.c b/secure_fw/spm/cmsis_psa/tfm_multi_core_mem_check.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_multi_core_mem_check.c
rename to secure_fw/spm/cmsis_psa/tfm_multi_core_mem_check.c
diff --git a/secure_fw/spm/model_ipc/tfm_nspm_ipc.c b/secure_fw/spm/cmsis_psa/tfm_nspm_ipc.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_nspm_ipc.c
rename to secure_fw/spm/cmsis_psa/tfm_nspm_ipc.c
diff --git a/secure_fw/spm/model_ipc/tfm_pools.c b/secure_fw/spm/cmsis_psa/tfm_pools.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_pools.c
rename to secure_fw/spm/cmsis_psa/tfm_pools.c
diff --git a/secure_fw/spm/model_ipc/tfm_psa_api_veneers.c b/secure_fw/spm/cmsis_psa/tfm_psa_api_veneers.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_psa_api_veneers.c
rename to secure_fw/spm/cmsis_psa/tfm_psa_api_veneers.c
diff --git a/secure_fw/spm/model_ipc/tfm_rpc.c b/secure_fw/spm/cmsis_psa/tfm_rpc.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_rpc.c
rename to secure_fw/spm/cmsis_psa/tfm_rpc.c
diff --git a/secure_fw/spm/model_ipc/tfm_secure_irq_handlers_ipc.inc b/secure_fw/spm/cmsis_psa/tfm_secure_irq_handlers_ipc.inc
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_secure_irq_handlers_ipc.inc
rename to secure_fw/spm/cmsis_psa/tfm_secure_irq_handlers_ipc.inc
diff --git a/secure_fw/spm/model_ipc/tfm_secure_irq_handlers_ipc.inc.template b/secure_fw/spm/cmsis_psa/tfm_secure_irq_handlers_ipc.inc.template
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_secure_irq_handlers_ipc.inc.template
rename to secure_fw/spm/cmsis_psa/tfm_secure_irq_handlers_ipc.inc.template
diff --git a/secure_fw/spm/model_ipc/tfm_spe_mailbox.c b/secure_fw/spm/cmsis_psa/tfm_spe_mailbox.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_spe_mailbox.c
rename to secure_fw/spm/cmsis_psa/tfm_spe_mailbox.c
diff --git a/secure_fw/spm/model_ipc/tfm_spm_db_ipc.inc b/secure_fw/spm/cmsis_psa/tfm_spm_db_ipc.inc
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_spm_db_ipc.inc
rename to secure_fw/spm/cmsis_psa/tfm_spm_db_ipc.inc
diff --git a/secure_fw/spm/model_ipc/tfm_spm_db_ipc.inc.template b/secure_fw/spm/cmsis_psa/tfm_spm_db_ipc.inc.template
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_spm_db_ipc.inc.template
rename to secure_fw/spm/cmsis_psa/tfm_spm_db_ipc.inc.template
diff --git a/secure_fw/spm/model_ipc/tfm_thread.c b/secure_fw/spm/cmsis_psa/tfm_thread.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_thread.c
rename to secure_fw/spm/cmsis_psa/tfm_thread.c
diff --git a/secure_fw/spm/model_ipc/tfm_wait.c b/secure_fw/spm/cmsis_psa/tfm_wait.c
similarity index 100%
rename from secure_fw/spm/model_ipc/tfm_wait.c
rename to secure_fw/spm/cmsis_psa/tfm_wait.c
diff --git a/secure_fw/spm/init/tfm_boot_data.c b/secure_fw/spm/common/init/tfm_boot_data.c
similarity index 100%
rename from secure_fw/spm/init/tfm_boot_data.c
rename to secure_fw/spm/common/init/tfm_boot_data.c
diff --git a/secure_fw/spm/init/tfm_core.c b/secure_fw/spm/common/init/tfm_core.c
similarity index 100%
rename from secure_fw/spm/init/tfm_core.c
rename to secure_fw/spm/common/init/tfm_core.c
diff --git a/secure_fw/spm/runtime/tfm_core_mem_check.c b/secure_fw/spm/common/runtime/tfm_core_mem_check.c
similarity index 100%
rename from secure_fw/spm/runtime/tfm_core_mem_check.c
rename to secure_fw/spm/common/runtime/tfm_core_mem_check.c
diff --git a/secure_fw/spm/runtime/tfm_core_utils.c b/secure_fw/spm/common/runtime/tfm_core_utils.c
similarity index 100%
rename from secure_fw/spm/runtime/tfm_core_utils.c
rename to secure_fw/spm/common/runtime/tfm_core_utils.c
diff --git a/secure_fw/spm/runtime/utilities.c b/secure_fw/spm/common/runtime/utilities.c
similarity index 100%
rename from secure_fw/spm/runtime/utilities.c
rename to secure_fw/spm/common/runtime/utilities.c
diff --git a/secure_fw/spm/arch/tfm_arch.h b/secure_fw/spm/include/tfm_arch.h
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch.h
rename to secure_fw/spm/include/tfm_arch.h
diff --git a/secure_fw/spm/arch/tfm_arch_v8m.h b/secure_fw/spm/include/tfm_arch_v8m.h
similarity index 100%
rename from secure_fw/spm/arch/tfm_arch_v8m.h
rename to secure_fw/spm/include/tfm_arch_v8m.h
diff --git a/secure_fw/spm/model_func/arch.c b/secure_fw/spm/model_func/arch.c
deleted file mode 100644
index e7faa2c..0000000
--- a/secure_fw/spm/model_func/arch.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#include "tfm_secure_api.h"
-
-#if defined(__ARM_ARCH_8_1M_MAIN__) || defined(__ARM_ARCH_8M_MAIN__)
-__attribute__((section("SFN"), naked))
-int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr)
-{
- __ASM volatile(
- "PUSH {r4-r12, lr} \n"
- "SVC %[SVC_REQ] \n"
- "MOV r4, #0 \n"
- "MOV r5, r4 \n"
- "MOV r6, r4 \n"
- "MOV r7, r4 \n"
- "MOV r8, r4 \n"
- "MOV r9, r4 \n"
- "MOV r10, r4 \n"
- "MOV r11, r4 \n"
- "BLX lr \n"
- "SVC %[SVC_RET] \n"
- "POP {r4-r12, pc} \n"
- : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST),
- [SVC_RET] "I" (TFM_SVC_SFN_RETURN)
- );
-}
-
-__attribute__((section("SFN"), naked))
-void priv_irq_handler_main(uint32_t partition_id, uint32_t unpriv_handler,
- uint32_t irq_signal, uint32_t irq_line)
-{
- __ASM(
- /* Save the callee saved registers*/
- "PUSH {r4-r12, lr} \n"
- /* Request SVC to configure environment for the unpriv IRQ handler */
- "SVC %[SVC_REQ] \n"
- /* clear the callee saved registers to prevent information leak */
- "MOV r4, #0 \n"
- "MOV r5, r4 \n"
- "MOV r6, r4 \n"
- "MOV r7, r4 \n"
- "MOV r8, r4 \n"
- "MOV r9, r4 \n"
- "MOV r10, r4 \n"
- "MOV r11, r4 \n"
- /* Branch to the unprivileged handler */
- "BLX lr \n"
- /* Request SVC to reconfigure the environment of the interrupted
- * partition
- */
- "SVC %[SVC_RET] \n"
- /* restore callee saved registers and return */
- "POP {r4-r12, pc} \n"
- : : [SVC_REQ] "I" (TFM_SVC_DEPRIV_REQ)
- , [SVC_RET] "I" (TFM_SVC_DEPRIV_RET)
- );
-}
-#elif defined(__ARM_ARCH_8M_BASE__)
-__attribute__((section("SFN"), naked))
-int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr)
-{
- __ASM volatile(
- "PUSH {lr} \n"
- "PUSH {r4-r7} \n"
- "MOV r4, r8 \n"
- "MOV r5, r9 \n"
- "MOV r6, r10 \n"
- "MOV r7, r11 \n"
- "PUSH {r4-r7} \n"
- "MOV r4, r12 \n"
- "PUSH {r4} \n"
- "SVC %[SVC_REQ] \n"
- "MOVS r4, #0 \n"
- "MOV r5, r4 \n"
- "MOV r6, r4 \n"
- "MOV r7, r4 \n"
- "MOV r8, r4 \n"
- "MOV r9, r4 \n"
- "MOV r10, r4 \n"
- "MOV r11, r4 \n"
- "BLX lr \n"
- "SVC %[SVC_RET] \n"
- "POP {r4} \n"
- "MOV r12, r4 \n"
- "POP {r4-r7} \n"
- "MOV r8, r4 \n"
- "MOV r9, r5 \n"
- "MOV r10, r6 \n"
- "MOV r11, r7 \n"
- "POP {r4-r7} \n"
- "POP {pc} \n"
- : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST),
- [SVC_RET] "I" (TFM_SVC_SFN_RETURN)
- );
-}
-
-__attribute__((section("SFN"), naked))
-void priv_irq_handler_main(uint32_t partition_id, uint32_t unpriv_handler,
- uint32_t irq_signal, uint32_t irq_line)
-{
- __ASM(
- /* Save the callee saved registers*/
- "PUSH {r4-r7, lr} \n"
- "MOV r4, r8 \n"
- "MOV r5, r9 \n"
- "MOV r6, r10 \n"
- "MOV r7, r11 \n"
- "PUSH {r4-r7} \n"
- "MOV r4, r12 \n"
- "PUSH {r4} \n"
- /* Request SVC to configure environment for the unpriv IRQ handler */
- "SVC %[SVC_REQ] \n"
- /* clear the callee saved registers to prevent information leak */
- "MOVS r4, #0 \n"
- "MOV r5, r4 \n"
- "MOV r6, r4 \n"
- "MOV r7, r4 \n"
- "MOV r8, r4 \n"
- "MOV r9, r4 \n"
- "MOV r10, r4 \n"
- "MOV r11, r4 \n"
- /* Branch to the unprivileged handler */
- "BLX lr \n"
- /* Request SVC to reconfigure the environment of the interrupted
- * partition
- */
- "SVC %[SVC_RET] \n"
- /* restore callee saved registers and return */
- "POP {r4} \n"
- "MOV r12, r4 \n"
- "POP {r4-r7} \n"
- "MOV r8, r4 \n"
- "MOV r9, r5 \n"
- "MOV r10, r6 \n"
- "MOV r11, r7 \n"
- "POP {r4-r7, pc} \n"
- : : [SVC_REQ] "I" (TFM_SVC_DEPRIV_REQ)
- , [SVC_RET] "I" (TFM_SVC_DEPRIV_RET)
- );
-}
-#endif
diff --git a/secure_fw/spm/runtime/tfm_spm_services.c b/secure_fw/spm/runtime/tfm_spm_services.c
deleted file mode 100644
index 033bbb1..0000000
--- a/secure_fw/spm/runtime/tfm_spm_services.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2017-2020, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#include <arm_cmse.h>
-
-#include "tfm/tfm_core_svc.h"
-#include "tfm_secure_api.h"
-#include "tfm_internal.h"
-#include "tfm/tfm_spm_services.h"
-#include "spm_api.h"
-#include "psa/service.h"
-
-#ifndef TFM_PSA_API
-nsfptr_t ns_entry;
-
-void jump_to_ns_code(void)
-{
- /* Calls the non-secure Reset_Handler to jump to the non-secure binary */
- ns_entry();
-}
-
-__attribute__((naked))
-int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id)
-{
- __ASM volatile(
- "SVC %0\n"
- "BX LR\n"
- : : "I" (TFM_SVC_GET_CALLER_CLIENT_ID));
-}
-
-#endif
-
-__attribute__((naked))
-int32_t tfm_spm_request(void)
-{
- __ASM volatile(
- "SVC %0\n"
- "BX lr\n"
- : : "I" (TFM_SVC_SPM_REQUEST));
-}
-
-__attribute__((naked))
-int32_t tfm_spm_request_reset_vote(void)
-{
- __ASM volatile(
- "MOVS R0, %0\n"
- "B tfm_spm_request\n"
- : : "I" (TFM_SPM_REQUEST_RESET_VOTE));
-}
-
-__attribute__((naked))
-void tfm_enable_irq(psa_signal_t irq_signal)
-{
- __ASM("SVC %0\n"
- "BX LR\n"
- : : "I" (TFM_SVC_ENABLE_IRQ));
-}
-
-__attribute__((naked))
-void tfm_disable_irq(psa_signal_t irq_signal)
-{
- __ASM("SVC %0\n"
- "BX LR\n"
- : : "I" (TFM_SVC_DISABLE_IRQ));
-}
-
-#ifndef TFM_PSA_API
-
-__attribute__((naked))
-static psa_signal_t psa_wait_internal(psa_signal_t signal_mask,
- uint32_t timeout)
-{
- __ASM("SVC %0\n"
- "BX LR\n"
- : : "I" (TFM_SVC_PSA_WAIT));
-}
-
-psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout)
-{
- /* FIXME: By using the 'WFI' instruction this function blocks until an
- * interrupt happens. It is necessary to do this here as tfm_core_psa_wait
- * runs with the priority of the SVC, so it cannot be interrupted, so
- * waiting in it for the required interrupt to happen is not an option.
- */
- psa_signal_t actual_signal_mask;
-
- while (1) {
- actual_signal_mask = psa_wait_internal(signal_mask, timeout);
- if ((actual_signal_mask & signal_mask) != 0) {
- return actual_signal_mask;
- }
- __WFI();
- }
-}
-
-__attribute__((naked))
-void psa_eoi(psa_signal_t irq_signal)
-{
- __ASM("SVC %0\n"
- "BX LR\n"
- : : "I" (TFM_SVC_PSA_EOI));
-}
-
-#endif