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/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