Test: Add a Secure Partition for multi-core test

Add a Secure Partition for multi-core topology specific tests.
Add a dummy service and corresponding signal.
Update the manifest files.

Change-Id: Id0d9530d54afab76053bd74989f88902bfbbdd9b
Signed-off-by: David Hu <david.hu@arm.com>
diff --git a/interface/include/psa_manifest/pid.h b/interface/include/psa_manifest/pid.h
index 322157b..c1a8d4b 100644
--- a/interface/include/psa_manifest/pid.h
+++ b/interface/include/psa_manifest/pid.h
@@ -28,8 +28,9 @@
 #define TFM_IRQ_TEST_1                                                 (267)
 #define TFM_SP_SST_TEST                                                (268)
 #define TFM_SP_SECURE_CLIENT_2                                         (269)
+#define TFM_SP_MULTI_CORE_TEST                                         (270)
 
-#define TFM_MAX_USER_PARTITIONS                                        (14)
+#define TFM_MAX_USER_PARTITIONS                                        (15)
 
 #ifdef __cplusplus
 }
diff --git a/interface/include/psa_manifest/sid.h b/interface/include/psa_manifest/sid.h
index ddf1cb5..4b66a3e 100644
--- a/interface/include/psa_manifest/sid.h
+++ b/interface/include/psa_manifest/sid.h
@@ -136,6 +136,10 @@
 #define TFM_SECURE_CLIENT_2_SID                                    (0x0000F0E0U)
 #define TFM_SECURE_CLIENT_2_VERSION                                (1U)
 
+/******** TFM_SP_MULTI_CORE_TEST ********/
+#define MULTI_CORE_TEST_DUMMY_SID                                  (0x0000F100U)
+#define MULTI_CORE_TEST_DUMMY_VERSION                              (1U)
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/interface/include/tfm_veneers.h b/interface/include/tfm_veneers.h
index 1eefbf0..f4f182c 100644
--- a/interface/include/tfm_veneers.h
+++ b/interface/include/tfm_veneers.h
@@ -150,6 +150,10 @@
 psa_status_t tfm_tfm_secure_client_2_call_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+/******** TFM_SP_MULTI_CORE_TEST ********/
+#endif /* TFM_MULTI_CORE_TEST */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/ext/common/armclang/tfm_common_s.sct b/platform/ext/common/armclang/tfm_common_s.sct
index 214f0f4..ca3acfc 100644
--- a/platform/ext/common/armclang/tfm_common_s.sct
+++ b/platform/ext/common/armclang/tfm_common_s.sct
@@ -168,6 +168,13 @@
     }
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    TFM_SP_MULTI_CORE_TEST_LINKER +0 ALIGN 32 {
+        *multi_core_test.* (+RO)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_FN)
+    }
+#endif /* TFM_MULTI_CORE_TEST */
+
     /*
      * This empty, zero long execution region is here to mark the end address
      * of APP RoT code.
@@ -285,6 +292,19 @@
 #endif
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    TFM_SP_MULTI_CORE_TEST_LINKER_DATA +0 ALIGN 32 {
+        *multi_core_test.* (+RW +ZI)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_RW)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_ZI)
+    }
+
+#if defined (TFM_PSA_API)
+    TFM_SP_MULTI_CORE_TEST_LINKER_STACK +0 ALIGN 128 EMPTY 0x0100 {
+    }
+#endif
+#endif /* TFM_MULTI_CORE_TEST */
+
     /*
      * This empty, zero long execution region is here to mark the end address
      * of APP RoT RW and Stack.
diff --git a/platform/ext/common/gcc/tfm_common_s.ld b/platform/ext/common/gcc/tfm_common_s.ld
index 42aebcf..a82a2f6 100644
--- a/platform/ext/common/gcc/tfm_common_s.ld
+++ b/platform/ext/common/gcc/tfm_common_s.ld
@@ -137,6 +137,11 @@
         LONG (ADDR(.TFM_SP_SECURE_CLIENT_2_LINKER_DATA))
         LONG (SIZEOF(.TFM_SP_SECURE_CLIENT_2_LINKER_DATA))
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_MULTI_CORE_TEST
+        LONG (LOADADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA))
+        LONG (ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA))
+        LONG (SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA))
+#endif /* TFM_MULTI_CORE_TEST */
 #if defined (S_RAM_CODE_START)
         LONG (LOADADDR(.TFM_RAM_CODE))
         LONG (ADDR(.TFM_RAM_CODE))
@@ -271,6 +276,14 @@
         LONG (SIZEOF(.TFM_SP_SECURE_CLIENT_2_LINKER_STACK))
 #endif
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_MULTI_CORE_TEST
+        LONG (ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_BSS))
+        LONG (SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_BSS))
+#if defined(TFM_PSA_API)
+        LONG (ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_STACK))
+        LONG (SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_STACK))
+#endif
+#endif /* TFM_MULTI_CORE_TEST */
         __zero_table_end__ = .;
     } > FLASH
 
@@ -517,6 +530,20 @@
     Image$$TFM_SP_SECURE_CLIENT_2_LINKER$$Limit = ADDR(.TFM_SP_SECURE_CLIENT_2_LINKER) + SIZEOF(.TFM_SP_SECURE_CLIENT_2_LINKER);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    .TFM_SP_MULTI_CORE_TEST_LINKER : ALIGN(32)
+    {
+        *multi_core_test.*(.text*)
+        *multi_core_test.*(.rodata*)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_FN)
+        . = ALIGN(32);
+    } > FLASH
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER$$RO$$Base = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER$$RO$$Limit = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER) + SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER$$Base = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER$$Limit = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER) + SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER);
+#endif /* TFM_MULTI_CORE_TEST */
+
     /**** APPLICATION RoT RO part (CODE + RODATA) end here */
     Image$$TFM_APP_CODE_END$$Base = .;
 
@@ -805,6 +832,39 @@
 
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    .TFM_SP_MULTI_CORE_TEST_LINKER_DATA : ALIGN(32)
+    {
+        *multi_core_test.*(.data*)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_RW)
+        . = ALIGN(32);
+    } > RAM AT> FLASH
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_DATA$$RW$$Base = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_DATA$$RW$$Limit = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA) + SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_DATA);
+
+    .TFM_SP_MULTI_CORE_TEST_LINKER_BSS : ALIGN(32)
+    {
+        start_of_TFM_SP_MULTI_CORE_TEST_LINKER = .;
+        *multi_core_test.*(.bss*)
+        *multi_core_test.*(COMMON)
+        *(TFM_SP_MULTI_CORE_TEST_ATTR_ZI)
+        . += (. - start_of_TFM_SP_MULTI_CORE_TEST_LINKER) ? 0 : 4;
+        . = ALIGN(32);
+    } > RAM AT> RAM
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_DATA$$ZI$$Base = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_BSS);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_DATA$$ZI$$Limit = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_BSS) + SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_BSS);
+
+#if defined (TFM_PSA_API)
+    .TFM_SP_MULTI_CORE_TEST_LINKER_STACK : ALIGN(128)
+    {
+        . += 0x0100;
+    } > RAM
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_STACK$$ZI$$Base = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_STACK);
+    Image$$TFM_SP_MULTI_CORE_TEST_LINKER_STACK$$ZI$$Limit = ADDR(.TFM_SP_MULTI_CORE_TEST_LINKER_STACK) + SIZEOF(.TFM_SP_MULTI_CORE_TEST_LINKER_STACK);
+#endif
+
+#endif /* TFM_MULTI_CORE_TEST */
+
     /**** APPLICATION RoT DATA end here */
     Image$$TFM_APP_RW_STACK_END$$Base = .;
 
diff --git a/secure_fw/core/ipc/tfm_secure_irq_handlers_ipc.inc b/secure_fw/core/ipc/tfm_secure_irq_handlers_ipc.inc
index bb7c694..6b0cbf0 100644
--- a/secure_fw/core/ipc/tfm_secure_irq_handlers_ipc.inc
+++ b/secure_fw/core/ipc/tfm_secure_irq_handlers_ipc.inc
@@ -21,6 +21,7 @@
 #include "test/test_services/tfm_irq_test_service_1/psa_manifest/tfm_irq_test_service_1.h"
 #include "test/test_services/tfm_sst_test_service/psa_manifest/tfm_sst_test_service.h"
 #include "test/test_services/tfm_secure_client_2/psa_manifest/tfm_secure_client_2.h"
+#include "test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h"
 #include "cmsis_compiler.h"
 
 /* Definitions of the signals of the IRQs (if any) */
diff --git a/secure_fw/core/tfm_secure_irq_handlers.inc b/secure_fw/core/tfm_secure_irq_handlers.inc
index c6a29f7..76116fe 100644
--- a/secure_fw/core/tfm_secure_irq_handlers.inc
+++ b/secure_fw/core/tfm_secure_irq_handlers.inc
@@ -21,6 +21,7 @@
 #include "test/test_services/tfm_irq_test_service_1/psa_manifest/tfm_irq_test_service_1.h"
 #include "test/test_services/tfm_sst_test_service/psa_manifest/tfm_sst_test_service.h"
 #include "test/test_services/tfm_secure_client_2/psa_manifest/tfm_secure_client_2.h"
+#include "test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h"
 #include "psa_manifest/pid.h"
 
 /* Definitions of the signals of the IRQs */
diff --git a/secure_fw/ns_callable/tfm_veneers.c b/secure_fw/ns_callable/tfm_veneers.c
index a7599f2..8170e9c 100644
--- a/secure_fw/ns_callable/tfm_veneers.c
+++ b/secure_fw/ns_callable/tfm_veneers.c
@@ -144,6 +144,10 @@
 psa_status_t tfm_secure_client_2_call(psa_invec *, size_t, psa_outvec *, size_t);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+/******** TFM_SP_MULTI_CORE_TEST ********/
+#endif /* TFM_MULTI_CORE_TEST */
+
 
 #define TFM_VENEER_FUNCTION(partition_name, sfn_name) \
     __tfm_secure_gateway_attributes__ \
@@ -291,3 +295,7 @@
 TFM_VENEER_FUNCTION(TFM_SP_SECURE_CLIENT_2, tfm_secure_client_2_call)
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+/******** TFM_SP_MULTI_CORE_TEST ********/
+#endif /* TFM_MULTI_CORE_TEST */
+
diff --git a/secure_fw/services/tfm_service_list.inc b/secure_fw/services/tfm_service_list.inc
index ba047ce..e3bc1a3 100644
--- a/secure_fw/services/tfm_service_list.inc
+++ b/secure_fw/services/tfm_service_list.inc
@@ -24,6 +24,7 @@
 #include "test/test_services/tfm_irq_test_service_1/psa_manifest/tfm_irq_test_service_1.h"
 #include "test/test_services/tfm_sst_test_service/psa_manifest/tfm_sst_test_service.h"
 #include "test/test_services/tfm_secure_client_2/psa_manifest/tfm_secure_client_2.h"
+#include "test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h"
 
 const struct tfm_spm_service_db_t service_db[] =
 {
@@ -511,6 +512,19 @@
     },
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    /******** TFM_SP_MULTI_CORE_TEST ********/
+    {
+        .name = "MULTI_CORE_TEST_DUMMY",
+        .partition_id = TFM_SP_MULTI_CORE_TEST,
+        .signal = MULTI_CORE_TEST_DUMMY_SIGNAL,
+        .sid = 0x0000F100,
+        .non_secure_client = true,
+        .version = 1,
+        .version_policy = TFM_VERSION_POLICY_STRICT
+    },
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 
 /**************************************************************************/
@@ -906,6 +920,17 @@
     },
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    /******** TFM_SP_MULTI_CORE_TEST ********/
+    {
+        .service_db = NULL,
+        .partition = NULL,
+        .handle_list = {0},
+        .msg_queue = {0},
+        .list = {0},
+    },
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 
 #endif /* __TFM_SERVICE_LIST_INC__ */
diff --git a/secure_fw/spm/tfm_spm_db.inc b/secure_fw/spm/tfm_spm_db.inc
index 59f7f0e..3da5c47 100644
--- a/secure_fw/spm/tfm_spm_db.inc
+++ b/secure_fw/spm/tfm_spm_db.inc
@@ -72,6 +72,10 @@
 #define TFM_PARTITION_TFM_SP_SECURE_CLIENT_2_IRQ_COUNT 0
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+#define TFM_PARTITION_TFM_SP_MULTI_CORE_TEST_IRQ_COUNT 0
+#endif /* TFM_MULTI_CORE_TEST */
+
 /**************************************************************************/
 /** Declarations of partition init functions */
 /**************************************************************************/
@@ -135,6 +139,10 @@
 extern void tfm_secure_client_2_init(void);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+extern void multi_core_test_main(void);
+#endif /* TFM_MULTI_CORE_TEST */
+
 /**************************************************************************/
 /** Memory region declarations */
 /**************************************************************************/
@@ -324,6 +332,19 @@
 REGION_DECLARE(Image$$, TFM_SP_SECURE_CLIENT_2_LINKER, _STACK$$ZI$$Limit);
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, $$Base);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, $$Limit);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, $$RO$$Base);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, $$RO$$Limit);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$RW$$Base);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$RW$$Limit);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$ZI$$Base);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$ZI$$Limit);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _STACK$$ZI$$Base);
+REGION_DECLARE(Image$$, TFM_SP_MULTI_CORE_TEST_LINKER, _STACK$$ZI$$Limit);
+#endif /* TFM_MULTI_CORE_TEST */
+
 #endif /* defined(TFM_PSA_API) */
 
 #ifndef TFM_PSA_API
@@ -471,6 +492,15 @@
         )) / sizeof(uint32_t)];
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+static uint32_t ctx_stack_TFM_SP_MULTI_CORE_TEST[
+        (sizeof(struct interrupted_ctx_stack_frame_t) +
+            (TFM_PARTITION_TFM_SP_MULTI_CORE_TEST_IRQ_COUNT) * (
+                sizeof(struct interrupted_ctx_stack_frame_t) +
+                sizeof(struct handler_ctx_stack_frame_t)
+        )) / sizeof(uint32_t)];
+#endif /* TFM_MULTI_CORE_TEST */
+
 
 uint32_t *ctx_stack_list[] =
 {
@@ -518,6 +548,9 @@
 #ifdef TFM_PARTITION_TEST_SECURE_SERVICES
     ctx_stack_TFM_SP_SECURE_CLIENT_2,
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
+#ifdef TFM_MULTI_CORE_TEST
+    ctx_stack_TFM_SP_MULTI_CORE_TEST,
+#endif /* TFM_MULTI_CORE_TEST */
 };
 #endif /* !defined(TFM_PSA_API) */
 
@@ -855,6 +888,22 @@
     },
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    {
+#ifdef TFM_PSA_API
+        .psa_framework_version = 0x0100,
+#endif /* defined(TFM_PSA_API) */
+        .partition_id         = TFM_SP_MULTI_CORE_TEST,
+        .partition_flags      = SPM_PART_FLAG_IPC
+                              | SPM_PART_FLAG_APP_ROT
+                              ,
+        .partition_priority   = TFM_PRIORITY(NORMAL),
+        .partition_init       = multi_core_test_main,
+        .dependencies_num     = 0,
+        .p_dependencies       = NULL,
+    },
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 
 /**************************************************************************/
@@ -962,6 +1011,10 @@
     NULL,
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    NULL,
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 
 /**************************************************************************/
@@ -1185,6 +1238,21 @@
     },
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+#ifdef TFM_MULTI_CORE_TEST
+    {
+        .code_start           = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, $$Base),
+        .code_limit           = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, $$Limit),
+        .ro_start             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, $$RO$$Base),
+        .ro_limit             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, $$RO$$Limit),
+        .rw_start             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$RW$$Base),
+        .rw_limit             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$RW$$Limit),
+        .zi_start             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$ZI$$Base),
+        .zi_limit             = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _DATA$$ZI$$Limit),
+        .stack_bottom         = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _STACK$$ZI$$Base),
+        .stack_top            = PART_REGION_ADDR(TFM_SP_MULTI_CORE_TEST_LINKER, _STACK$$ZI$$Limit),
+    },
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 #endif /* defined(TFM_PSA_API) */
 
@@ -1366,6 +1434,18 @@
     },
 #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */
 
+    /* -----------------------------------------------------------------------*/
+    /* - Partition DB record for TFM_SP_MULTI_CORE_TEST */
+    /* -----------------------------------------------------------------------*/
+#ifdef TFM_MULTI_CORE_TEST
+    {
+    /* Runtime data */
+        .runtime_data             = {},
+        .static_data              = NULL,
+        .platform_data_list       = NULL,
+    },
+#endif /* TFM_MULTI_CORE_TEST */
+
 };
 
 struct spm_partition_db_t g_spm_partition_db = {
diff --git a/test/test_services/CMakeLists.inc b/test/test_services/CMakeLists.inc
index 8e9a370..c22a33b 100644
--- a/test/test_services/CMakeLists.inc
+++ b/test/test_services/CMakeLists.inc
@@ -70,6 +70,12 @@
 		"${CORE_TEST_DIR}/tfm_sst_test_service/tfm_sst_test_service_api.c")
 endif()
 
+if (NOT DEFINED TFM_MULTI_CORE_TEST)
+	message(FATAL_ERROR "Incomplete build configuration: TFM_MULTI_CORE_TEST is undefined.")
+elseif (TFM_MULTI_CORE_TEST)
+	list(APPEND ALL_SRC_C_S "${CORE_TEST_DIR}/tfm_multi_core_test/tfm_multi_core_test.c")
+endif()
+
 embedded_include_directories(PATH ${TFM_ROOT_DIR} ABSOLUTE)
 embedded_include_directories(PATH ${TFM_ROOT_DIR}/interface/include ABSOLUTE)
 embedded_include_directories(PATH ${TFM_ROOT_DIR}/platform/include ABSOLUTE)
diff --git a/test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h b/test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h
new file mode 100644
index 0000000..a4b9cb2
--- /dev/null
+++ b/test/test_services/tfm_multi_core_test/psa_manifest/tfm_multi_core_test.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+/*********** WARNING: This is an auto-generated file. Do not edit! ***********/
+
+#ifndef __PSA_MANIFEST_TFM_MULTI_CORE_TEST_H__
+#define __PSA_MANIFEST_TFM_MULTI_CORE_TEST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MULTI_CORE_TEST_DUMMY_SIGNAL                            (1U << (0 + 4))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PSA_MANIFEST_TFM_MULTI_CORE_TEST_H__ */
diff --git a/test/test_services/tfm_multi_core_test/tfm_multi_core_test.c b/test/test_services/tfm_multi_core_test/tfm_multi_core_test.c
new file mode 100644
index 0000000..9d371fc
--- /dev/null
+++ b/test/test_services/tfm_multi_core_test/tfm_multi_core_test.c
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "psa/client.h"
+#include "psa/service.h"
+#include "psa_manifest/tfm_multi_core_test.h"
+
+/* Test thread */
+void multi_core_test_main(void *param)
+{
+    (void)param;
+
+    /* Do nothing */
+}
diff --git a/test/test_services/tfm_multi_core_test/tfm_multi_core_test.yaml b/test/test_services/tfm_multi_core_test/tfm_multi_core_test.yaml
new file mode 100644
index 0000000..3d2df09
--- /dev/null
+++ b/test/test_services/tfm_multi_core_test/tfm_multi_core_test.yaml
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+{
+  "psa_framework_version": 1.0,
+  "name": "TFM_SP_MULTI_CORE_TEST",
+  "type": "APPLICATION-ROT",
+  "priority": "NORMAL",
+  "id": "0x00000007",
+  "entry_point": "multi_core_test_main",
+  "stack_size": "0x0100",
+  "secure_functions": [
+  ],
+  "services" : [
+    {
+      "name": "MULTI_CORE_TEST_DUMMY",
+      "sid": "0x0000F100",
+      "signal": "MULTI_CORE_TEST_DUMMY_SIGNAL",
+      "non_secure_clients": true,
+      "minor_version": 1,
+      "minor_policy": "STRICT"
+    }
+  ],
+  "linker_pattern": {
+    "object_list": [
+      "*multi_core_test.*"
+    ]
+  }
+}
diff --git a/tools/tfm_manifest_list.yaml b/tools/tfm_manifest_list.yaml
index 6a93847..114fc8a 100644
--- a/tools/tfm_manifest_list.yaml
+++ b/tools/tfm_manifest_list.yaml
@@ -164,6 +164,17 @@
       "version_major": 0,
       "version_minor": 1,
       "pid": 269
+    },
+    {
+      "name": "TFM Multi-core Test",
+      "short_name": "TFM_MULTI_CORE_TEST",
+      "manifest": "test/test_services/tfm_multi_core_test/tfm_multi_core_test.yaml",
+      "tfm_extensions": true,
+      "tfm_partition_ipc": true,
+      "conditional": "TFM_MULTI_CORE_TEST",
+      "version_major": 0,
+      "version_minor": 1,
+      "pid": 270
     }
   ]
 }