Enable NSID management from NS side

Enable the new implementation on NS client identification from NS side.
Replace TFM_NS_CLIENT_IDENTIFICATION with TFM_NS_MANAGE_NSID.
TFM_NS_MANAGE_NSID is used to enable new NSID management from NS side.
TFM_NS_CLIENT_IDENTIFICATION for old NSID implementation needs to be deprecated.

Signed-off-by: Xinyu Zhang <xinyu.zhang@arm.com>
Change-Id: I29700f1beeaba32e0167b90e9876c334992474d5
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index ace6184..9613494 100755
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -30,6 +30,9 @@
 # NS interface implemented by NSPE
 set(NS_INTERFACE_DIR     ${CMAKE_CURRENT_SOURCE_DIR}/../ns_interface)
 
+# nsid_manager
+set(NSID_MGR_DIR         ${NS_INTERFACE_DIR}/ns_client_ext)
+
 #################### TF-M NS interface (header only) ###########################
 
 add_library(tfm_ns_interface INTERFACE)
@@ -47,6 +50,7 @@
 target_include_directories(tfm_ns_interface
     INTERFACE
         ${NS_INTERFACE_DIR}
+        ${NSID_MGR_DIR}
 )
 
 # PSA interface files are generated from a template
@@ -65,7 +69,7 @@
     INTERFACE
         $<$<BOOL:${TFM_PSA_API}>:TFM_PSA_API>
         $<$<STREQUAL:${TEST_PSA_API},IPC>:PSA_API_TEST_IPC>
-        $<$<BOOL:${TFM_NS_CLIENT_IDENTIFICATION}>:TFM_NS_CLIENT_IDENTIFICATION>
+        $<$<BOOL:${TFM_NS_MANAGE_NSID}>:TFM_NS_MANAGE_NSID>
         $<$<BOOL:${TFM_MULTI_CORE_TOPOLOGY}>:TFM_MULTI_CORE_TOPOLOGY>
         $<$<BOOL:${TFM_MULTI_CORE_NS_OS}>:TFM_MULTI_CORE_NS_OS>
         $<$<AND:$<BOOL:${TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD}>,$<BOOL:${TFM_MULTI_CORE_NS_OS}>>:TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD>
@@ -76,6 +80,11 @@
 
 add_library(tfm_api_ns STATIC)
 
+target_sources(tfm_api_ns
+    PRIVATE
+        $<$<BOOL:${TFM_NS_MANAGE_NSID}>:${NSID_MGR_DIR}/tfm_nsid_manager.c>
+)
+
 if (${TFM_PSA_API})
     target_sources(tfm_api_ns PRIVATE
         $<$<OR:$<BOOL:${FORWARD_PROT_MSG}>,$<BOOL:${TFM_PARTITION_PLATFORM}>>:${INTERFACE_SRC_DIR}/tfm_platform_ipc_api.c>
@@ -269,9 +278,11 @@
 
 target_sources(CMSIS_5_tfm_ns
     INTERFACE
+        ${NSID_MGR_DIR}/tz_shim_layer.c
         ${CMSIS_5_PATH}/RTOS2/RTX/Config/RTX_Config.c
         ${CMSIS_5_PATH}/RTOS2/RTX/Source/rtx_lib.c
         ${CMAKE_CURRENT_SOURCE_DIR}/os_wrapper_cmsis_rtos_v2.c
+        $<$<BOOL:${TFM_NS_MANAGE_NSID}>:${CMAKE_CURRENT_SOURCE_DIR}/tfm_nsid_map_table.c>
 )
 
 target_include_directories(CMSIS_5_tfm_ns
@@ -280,9 +291,15 @@
         ${CMSIS_5_PATH}/RTOS2/Include
         ${CMSIS_5_PATH}/RTOS2/RTX/Include
         ${CMSIS_5_PATH}/RTOS2/RTX/Config
+        $<$<BOOL:${TFM_NS_MANAGE_NSID}>:${CMAKE_CURRENT_SOURCE_DIR}>
 )
 
 target_link_libraries(CMSIS_5_tfm_ns
     INTERFACE
         platform_ns
 )
+
+target_compile_definitions(CMSIS_5_tfm_ns
+    INTERFACE
+        $<$<BOOL:${TFM_NS_MANAGE_NSID}>:TFM_NS_MANAGE_NSID>
+)
diff --git a/app/main_ns.c b/app/main_ns.c
index 2df4ffd..33a70db 100644
--- a/app/main_ns.c
+++ b/app/main_ns.c
@@ -9,6 +9,7 @@
 #include "cmsis_os2.h"
 #include "cmsis_compiler.h"
 #include "tfm_ns_interface.h"
+#include "tfm_nsid_manager.h"
 #if defined(TEST_FRAMEWORK_NS) || defined(TEST_FRAMEWORK_S)
 #include "tfm_integ_test.h"
 #endif
@@ -52,7 +53,8 @@
  || defined(PSA_API_TEST_NS)
 static const osThreadAttr_t thread_attr = {
     .name = "test_thread",
-    .stack_size = 4096U
+    .stack_size = 4096U,
+    .tz_module = ((TZ_ModuleId_t)TFM_DEFAULT_NSID)
 };
 #endif
 
diff --git a/app/os_wrapper_cmsis_rtos_v2.c b/app/os_wrapper_cmsis_rtos_v2.c
old mode 100644
new mode 100755
index 810a244..ec785f2
--- a/app/os_wrapper_cmsis_rtos_v2.c
+++ b/app/os_wrapper_cmsis_rtos_v2.c
@@ -9,16 +9,22 @@
 #include "os_wrapper/mutex.h"
 #include "os_wrapper/semaphore.h"
 
-#include <string.h>
 #include "cmsis_os2.h"
 
+#include "tfm_nsid_manager.h"
+#ifdef TFM_NS_MANAGE_NSID
+#include "tfm_nsid_map_table.h"
+#endif
+
 /* This is an example OS abstraction layer for CMSIS-RTOSv2 */
 
 void *os_wrapper_thread_new(const char *name, int32_t stack_size,
                             os_wrapper_thread_func func, void *arg,
                             uint32_t priority)
 {
-    osThreadAttr_t task_attribs = {.tz_module = 1};
+    osThreadAttr_t task_attribs = {
+        .tz_module = ((TZ_ModuleId_t)TFM_DEFAULT_NSID)
+    };
 
     /* By default, the thread starts as osThreadDetached */
     if (stack_size != OS_WRAPPER_DEFAULT_STACK_SIZE) {
@@ -27,6 +33,10 @@
     task_attribs.name = name;
     task_attribs.priority = (osPriority_t) priority;
 
+#ifdef TFM_NS_MANAGE_NSID
+    task_attribs.tz_module = (TZ_ModuleId_t)nsid_mgr_get_thread_nsid(name);
+#endif
+
     return (void *)osThreadNew(func, arg, &task_attribs);
 }
 
diff --git a/test/suites/ps/non_secure/psa_ps_ns_interface_testsuite.c b/test/suites/ps/non_secure/psa_ps_ns_interface_testsuite.c
index 6aee714..cdb0cd1 100644
--- a/test/suites/ps/non_secure/psa_ps_ns_interface_testsuite.c
+++ b/test/suites/ps/non_secure/psa_ps_ns_interface_testsuite.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
@@ -62,13 +62,13 @@
 static void tfm_ps_test_1013(struct test_result_t *ret);
 static void tfm_ps_test_1014(struct test_result_t *ret);
 static void tfm_ps_test_1015(struct test_result_t *ret);
-#ifdef TFM_NS_CLIENT_IDENTIFICATION
+#ifdef TFM_NS_MANAGE_NSID
 static void tfm_ps_test_1016(struct test_result_t *ret);
 static void tfm_ps_test_1017(struct test_result_t *ret);
 static void tfm_ps_test_1018(struct test_result_t *ret);
 static void tfm_ps_test_1019(struct test_result_t *ret);
 static void tfm_ps_test_1020(struct test_result_t *ret);
-#endif /* TFM_NS_CLIENT_IDENTIFICATION */
+#endif /* TFM_NS_MANAGE_NSID */
 static void tfm_ps_test_1021(struct test_result_t *ret);
 static void tfm_ps_test_1022(struct test_result_t *ret);
 static void tfm_ps_test_1023(struct test_result_t *ret);
@@ -106,7 +106,7 @@
      "Remove interface with write once UID"},
     {&tfm_ps_test_1015, "TFM_NS_PS_TEST_1015",
      "Remove interface with invalid UID"},
-#ifdef TFM_NS_CLIENT_IDENTIFICATION
+#ifdef TFM_NS_MANAGE_NSID
     {&tfm_ps_test_1016, "TFM_NS_PS_TEST_1016",
      "Get interface with invalid thread name"},
     {&tfm_ps_test_1017, "TFM_NS_PS_TEST_1017",
@@ -117,7 +117,7 @@
      "Attempt to access UID belonging to another thread"},
     {&tfm_ps_test_1020, "TFM_NS_PS_TEST_1020",
      "Set UID alternately from two threads"},
-#endif /* TFM_NS_CLIENT_IDENTIFICATION */
+#endif /* TFM_NS_MANAGE_NSID */
     {&tfm_ps_test_1021, "TFM_NS_PS_TEST_1021",
      "Block compaction after remove"},
     {&tfm_ps_test_1022, "TFM_NS_PS_TEST_1022",
@@ -855,7 +855,7 @@
     ret->val = TEST_PASSED;
 }
 
-#ifdef TFM_NS_CLIENT_IDENTIFICATION
+#ifdef TFM_NS_MANAGE_NSID
 /**
  * \brief Sets UID with a valid thread name.
  */
@@ -1449,7 +1449,7 @@
 
     tfm_ps_run_test("Thread_A", ret, tfm_ps_test_1020_task_7);
 }
-#endif /* TFM_NS_CLIENT_IDENTIFICATION */
+#endif /* TFM_NS_MANAGE_NSID */
 
 /**
  * \brief Tests data block compact feature.