mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * SPDX-License-Identifier: BSD-3-Clause
kenjiArai 0:5b88d5760320 5 *
kenjiArai 0:5b88d5760320 6 */
kenjiArai 0:5b88d5760320 7
kenjiArai 0:5b88d5760320 8 #include <stdio.h>
kenjiArai 0:5b88d5760320 9 #include <stdbool.h>
kenjiArai 0:5b88d5760320 10 #include "secure_utilities.h"
kenjiArai 0:5b88d5760320 11 #include "tfm_api.h"
kenjiArai 0:5b88d5760320 12 #ifdef TFM_PSA_API
kenjiArai 0:5b88d5760320 13 #include "tfm_utils.h"
kenjiArai 0:5b88d5760320 14 #include "tfm_internal.h"
kenjiArai 0:5b88d5760320 15 #endif
kenjiArai 0:5b88d5760320 16
kenjiArai 0:5b88d5760320 17 #ifndef TFM_MAX_NS_THREAD_COUNT
kenjiArai 0:5b88d5760320 18 #define TFM_MAX_NS_THREAD_COUNT 8
kenjiArai 0:5b88d5760320 19 #endif
kenjiArai 0:5b88d5760320 20 #define INVALID_CLIENT_ID 0
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #define DEFAULT_NS_CLIENT_ID ((int32_t)-1)
kenjiArai 0:5b88d5760320 23
kenjiArai 0:5b88d5760320 24 #define INVALID_NS_CLIENT_IDX (-1)
kenjiArai 0:5b88d5760320 25 #define DEFAULT_NS_CLIENT_IDX 0
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 typedef uint32_t TZ_ModuleId_t;
kenjiArai 0:5b88d5760320 28 typedef uint32_t TZ_MemoryId_t;
kenjiArai 0:5b88d5760320 29
kenjiArai 0:5b88d5760320 30 static struct ns_client_list_t {
kenjiArai 0:5b88d5760320 31 int32_t ns_client_id;
kenjiArai 0:5b88d5760320 32 int32_t next_free_index;
kenjiArai 0:5b88d5760320 33 } NsClientIdList[TFM_MAX_NS_THREAD_COUNT];
kenjiArai 0:5b88d5760320 34
kenjiArai 0:5b88d5760320 35 static int32_t free_index = 0U;
kenjiArai 0:5b88d5760320 36 static int32_t active_ns_client_idx = INVALID_NS_CLIENT_IDX;
kenjiArai 0:5b88d5760320 37
kenjiArai 0:5b88d5760320 38 static int get_next_ns_client_id()
kenjiArai 0:5b88d5760320 39 {
kenjiArai 0:5b88d5760320 40 #ifdef TFM_NS_CLIENT_IDENTIFICATION
kenjiArai 0:5b88d5760320 41 static int32_t next_ns_client_id = DEFAULT_NS_CLIENT_ID;
kenjiArai 0:5b88d5760320 42
kenjiArai 0:5b88d5760320 43 if (next_ns_client_id > 0)
kenjiArai 0:5b88d5760320 44 {
kenjiArai 0:5b88d5760320 45 next_ns_client_id = DEFAULT_NS_CLIENT_ID;
kenjiArai 0:5b88d5760320 46 }
kenjiArai 0:5b88d5760320 47 return next_ns_client_id--;
kenjiArai 0:5b88d5760320 48 #else
kenjiArai 0:5b88d5760320 49 return DEFAULT_NS_CLIENT_ID;
kenjiArai 0:5b88d5760320 50 #endif
kenjiArai 0:5b88d5760320 51 }
kenjiArai 0:5b88d5760320 52
kenjiArai 0:5b88d5760320 53 void tfm_nspm_configure_clients(void)
kenjiArai 0:5b88d5760320 54 {
kenjiArai 0:5b88d5760320 55 int32_t i;
kenjiArai 0:5b88d5760320 56
kenjiArai 0:5b88d5760320 57 /* Default to one NS client */
kenjiArai 0:5b88d5760320 58 free_index = 1;
kenjiArai 0:5b88d5760320 59 NsClientIdList[0].ns_client_id = get_next_ns_client_id();
kenjiArai 0:5b88d5760320 60 for (i = 1; i < TFM_MAX_NS_THREAD_COUNT; ++i) {
kenjiArai 0:5b88d5760320 61 NsClientIdList[i].ns_client_id = INVALID_CLIENT_ID;
kenjiArai 0:5b88d5760320 62 }
kenjiArai 0:5b88d5760320 63 active_ns_client_idx = DEFAULT_NS_CLIENT_IDX;
kenjiArai 0:5b88d5760320 64 }
kenjiArai 0:5b88d5760320 65
kenjiArai 0:5b88d5760320 66 int32_t tfm_nspm_get_current_client_id()
kenjiArai 0:5b88d5760320 67 {
kenjiArai 0:5b88d5760320 68 if (active_ns_client_idx == INVALID_NS_CLIENT_IDX)
kenjiArai 0:5b88d5760320 69 {
kenjiArai 0:5b88d5760320 70 return 0;
kenjiArai 0:5b88d5760320 71 } else {
kenjiArai 0:5b88d5760320 72 return NsClientIdList[active_ns_client_idx].ns_client_id;
kenjiArai 0:5b88d5760320 73 }
kenjiArai 0:5b88d5760320 74 }
kenjiArai 0:5b88d5760320 75
kenjiArai 0:5b88d5760320 76 /* TF-M implementation of the CMSIS TZ RTOS thread context management API */
kenjiArai 0:5b88d5760320 77
kenjiArai 0:5b88d5760320 78 /// Initialize secure context memory system
kenjiArai 0:5b88d5760320 79 /// \return execution status (1: success, 0: error)
kenjiArai 0:5b88d5760320 80 /* This veneer is TF-M internal, not a secure service */
kenjiArai 0:5b88d5760320 81 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 82 uint32_t TZ_InitContextSystem_S(void)
kenjiArai 0:5b88d5760320 83 {
kenjiArai 0:5b88d5760320 84 int32_t i;
kenjiArai 0:5b88d5760320 85
kenjiArai 0:5b88d5760320 86 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 87 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 88 return 0U;
kenjiArai 0:5b88d5760320 89 }
kenjiArai 0:5b88d5760320 90
kenjiArai 0:5b88d5760320 91 /* NS RTOS supports TZ context management, override defaults */
kenjiArai 0:5b88d5760320 92 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 93 LOG_MSG("NS RTOS initialized TZ RTOS context management");
kenjiArai 0:5b88d5760320 94 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 95 for (i = 1; i < TFM_MAX_NS_THREAD_COUNT; ++i) {
kenjiArai 0:5b88d5760320 96 NsClientIdList[i].ns_client_id = INVALID_CLIENT_ID;
kenjiArai 0:5b88d5760320 97 NsClientIdList[i].next_free_index = i + 1;
kenjiArai 0:5b88d5760320 98 }
kenjiArai 0:5b88d5760320 99
kenjiArai 0:5b88d5760320 100 /* Terminate list */
kenjiArai 0:5b88d5760320 101 NsClientIdList[i - 1].next_free_index = INVALID_NS_CLIENT_IDX;
kenjiArai 0:5b88d5760320 102 /* Success */
kenjiArai 0:5b88d5760320 103 return 1U;
kenjiArai 0:5b88d5760320 104 }
kenjiArai 0:5b88d5760320 105
kenjiArai 0:5b88d5760320 106
kenjiArai 0:5b88d5760320 107 /// Allocate context memory for calling secure software modules in TrustZone
kenjiArai 0:5b88d5760320 108 /// \param[in] module identifies software modules called from non-secure mode
kenjiArai 0:5b88d5760320 109 /// \return value != 0 id TrustZone memory slot identifier
kenjiArai 0:5b88d5760320 110 /// \return value 0 no memory available or internal error
kenjiArai 0:5b88d5760320 111 /* This veneer is TF-M internal, not a secure service */
kenjiArai 0:5b88d5760320 112 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 113 TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module)
kenjiArai 0:5b88d5760320 114 {
kenjiArai 0:5b88d5760320 115 TZ_MemoryId_t tz_id;
kenjiArai 0:5b88d5760320 116 (void) module; /* Currently unused */
kenjiArai 0:5b88d5760320 117
kenjiArai 0:5b88d5760320 118 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 119 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 120 return 0U;
kenjiArai 0:5b88d5760320 121 }
kenjiArai 0:5b88d5760320 122
kenjiArai 0:5b88d5760320 123 if (free_index < 0) {
kenjiArai 0:5b88d5760320 124 /* No more free slots */
kenjiArai 0:5b88d5760320 125 return 0U;
kenjiArai 0:5b88d5760320 126 }
kenjiArai 0:5b88d5760320 127
kenjiArai 0:5b88d5760320 128 /* TZ_MemoryId_t must be a positive integer */
kenjiArai 0:5b88d5760320 129 tz_id = (TZ_MemoryId_t)free_index + 1;
kenjiArai 0:5b88d5760320 130 NsClientIdList[free_index].ns_client_id = get_next_ns_client_id();
kenjiArai 0:5b88d5760320 131 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 132 printf("TZ_AllocModuleContext_S called, returning id %d\r\n",
kenjiArai 0:5b88d5760320 133 NsClientIdList[free_index].ns_client_id);
kenjiArai 0:5b88d5760320 134 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 135 free_index = NsClientIdList[free_index].next_free_index;
kenjiArai 0:5b88d5760320 136
kenjiArai 0:5b88d5760320 137 return tz_id;
kenjiArai 0:5b88d5760320 138 }
kenjiArai 0:5b88d5760320 139
kenjiArai 0:5b88d5760320 140
kenjiArai 0:5b88d5760320 141 /// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
kenjiArai 0:5b88d5760320 142 /// \param[in] id TrustZone memory slot identifier
kenjiArai 0:5b88d5760320 143 /// \return execution status (1: success, 0: error)
kenjiArai 0:5b88d5760320 144 /* This veneer is TF-M internal, not a secure service */
kenjiArai 0:5b88d5760320 145 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 146 uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id)
kenjiArai 0:5b88d5760320 147 {
kenjiArai 0:5b88d5760320 148 uint32_t index;
kenjiArai 0:5b88d5760320 149
kenjiArai 0:5b88d5760320 150 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 151 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 152 return 0U;
kenjiArai 0:5b88d5760320 153 }
kenjiArai 0:5b88d5760320 154
kenjiArai 0:5b88d5760320 155 if ((id == 0U) || (id > TFM_MAX_NS_THREAD_COUNT)) {
kenjiArai 0:5b88d5760320 156 /* Invalid TZ_MemoryId_t */
kenjiArai 0:5b88d5760320 157 return 0U;
kenjiArai 0:5b88d5760320 158 }
kenjiArai 0:5b88d5760320 159
kenjiArai 0:5b88d5760320 160 index = id - 1;
kenjiArai 0:5b88d5760320 161
kenjiArai 0:5b88d5760320 162 if (NsClientIdList[index].ns_client_id == INVALID_CLIENT_ID) {
kenjiArai 0:5b88d5760320 163 /* Non-existent client */
kenjiArai 0:5b88d5760320 164 return 0U;
kenjiArai 0:5b88d5760320 165 }
kenjiArai 0:5b88d5760320 166
kenjiArai 0:5b88d5760320 167 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 168 printf("TZ_FreeModuleContext_S called for id %d\r\n",
kenjiArai 0:5b88d5760320 169 NsClientIdList[index].ns_client_id);
kenjiArai 0:5b88d5760320 170 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 171 if (active_ns_client_idx == index) {
kenjiArai 0:5b88d5760320 172 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 173 printf("Freeing active NS client, NS inactive\r\n");
kenjiArai 0:5b88d5760320 174 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 175 active_ns_client_idx = DEFAULT_NS_CLIENT_IDX;
kenjiArai 0:5b88d5760320 176 }
kenjiArai 0:5b88d5760320 177 NsClientIdList[index].ns_client_id = INVALID_CLIENT_ID;
kenjiArai 0:5b88d5760320 178 NsClientIdList[index].next_free_index = free_index;
kenjiArai 0:5b88d5760320 179
kenjiArai 0:5b88d5760320 180 free_index = index;
kenjiArai 0:5b88d5760320 181
kenjiArai 0:5b88d5760320 182 return 1U; // Success
kenjiArai 0:5b88d5760320 183 }
kenjiArai 0:5b88d5760320 184
kenjiArai 0:5b88d5760320 185
kenjiArai 0:5b88d5760320 186 /// Load secure context (called on RTOS thread context switch)
kenjiArai 0:5b88d5760320 187 /// \param[in] id TrustZone memory slot identifier
kenjiArai 0:5b88d5760320 188 /// \return execution status (1: success, 0: error)
kenjiArai 0:5b88d5760320 189 /* This veneer is TF-M internal, not a secure service */
kenjiArai 0:5b88d5760320 190 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 191 uint32_t TZ_LoadContext_S (TZ_MemoryId_t id)
kenjiArai 0:5b88d5760320 192 {
kenjiArai 0:5b88d5760320 193 uint32_t index;
kenjiArai 0:5b88d5760320 194
kenjiArai 0:5b88d5760320 195 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 196 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 197 return 0U;
kenjiArai 0:5b88d5760320 198 }
kenjiArai 0:5b88d5760320 199
kenjiArai 0:5b88d5760320 200 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 201 LOG_MSG("TZ_LoadContext_S called");
kenjiArai 0:5b88d5760320 202 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 203 if ((id == 0U) || (id > TFM_MAX_NS_THREAD_COUNT)) {
kenjiArai 0:5b88d5760320 204 /* Invalid TZ_MemoryId_t */
kenjiArai 0:5b88d5760320 205 return 0U;
kenjiArai 0:5b88d5760320 206 }
kenjiArai 0:5b88d5760320 207
kenjiArai 0:5b88d5760320 208 index = id - 1;
kenjiArai 0:5b88d5760320 209
kenjiArai 0:5b88d5760320 210 if (NsClientIdList[index].ns_client_id == INVALID_CLIENT_ID) {
kenjiArai 0:5b88d5760320 211 /* Non-existent client */
kenjiArai 0:5b88d5760320 212 return 0U;
kenjiArai 0:5b88d5760320 213 }
kenjiArai 0:5b88d5760320 214
kenjiArai 0:5b88d5760320 215 active_ns_client_idx = index;
kenjiArai 0:5b88d5760320 216 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 217 printf("TZ_LoadContext_S called for id %d\r\n",
kenjiArai 0:5b88d5760320 218 NsClientIdList[index].ns_client_id);
kenjiArai 0:5b88d5760320 219 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 220
kenjiArai 0:5b88d5760320 221 return 1U; // Success
kenjiArai 0:5b88d5760320 222 }
kenjiArai 0:5b88d5760320 223
kenjiArai 0:5b88d5760320 224
kenjiArai 0:5b88d5760320 225 /// Store secure context (called on RTOS thread context switch)
kenjiArai 0:5b88d5760320 226 /// \param[in] id TrustZone memory slot identifier
kenjiArai 0:5b88d5760320 227 /// \return execution status (1: success, 0: error)
kenjiArai 0:5b88d5760320 228 /* This veneer is TF-M internal, not a secure service */
kenjiArai 0:5b88d5760320 229 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 230 uint32_t TZ_StoreContext_S (TZ_MemoryId_t id)
kenjiArai 0:5b88d5760320 231 {
kenjiArai 0:5b88d5760320 232 uint32_t index;
kenjiArai 0:5b88d5760320 233
kenjiArai 0:5b88d5760320 234 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 235 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 236 return 0U;
kenjiArai 0:5b88d5760320 237 }
kenjiArai 0:5b88d5760320 238
kenjiArai 0:5b88d5760320 239 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 240 LOG_MSG("TZ_StoreContext_S called");
kenjiArai 0:5b88d5760320 241 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 242 /* id corresponds to context being swapped out on NS side */
kenjiArai 0:5b88d5760320 243 if ((id == 0U) || (id > TFM_MAX_NS_THREAD_COUNT)) {
kenjiArai 0:5b88d5760320 244 /* Invalid TZ_MemoryId_t */
kenjiArai 0:5b88d5760320 245 return 0U;
kenjiArai 0:5b88d5760320 246 }
kenjiArai 0:5b88d5760320 247
kenjiArai 0:5b88d5760320 248 index = id - 1;
kenjiArai 0:5b88d5760320 249
kenjiArai 0:5b88d5760320 250 if (NsClientIdList[index].ns_client_id == INVALID_CLIENT_ID) {
kenjiArai 0:5b88d5760320 251 /* Non-existent client */
kenjiArai 0:5b88d5760320 252 return 0U;
kenjiArai 0:5b88d5760320 253 }
kenjiArai 0:5b88d5760320 254
kenjiArai 0:5b88d5760320 255 if (active_ns_client_idx != index) {
kenjiArai 0:5b88d5760320 256 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 257 printf("TZ_StoreContext_S called for id %d, active id: %d\r\n",
kenjiArai 0:5b88d5760320 258 NsClientIdList[index].ns_client_id,
kenjiArai 0:5b88d5760320 259 NsClientIdList[active_ns_client_idx].ns_client_id);
kenjiArai 0:5b88d5760320 260 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 261 return 0U;
kenjiArai 0:5b88d5760320 262 }
kenjiArai 0:5b88d5760320 263
kenjiArai 0:5b88d5760320 264 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 265 printf("TZ_StoreContext_S called for id %d\r\n",
kenjiArai 0:5b88d5760320 266 NsClientIdList[index].ns_client_id);
kenjiArai 0:5b88d5760320 267 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 268 active_ns_client_idx = DEFAULT_NS_CLIENT_IDX;
kenjiArai 0:5b88d5760320 269
kenjiArai 0:5b88d5760320 270 return 1U; // Success
kenjiArai 0:5b88d5760320 271 }
kenjiArai 0:5b88d5760320 272
kenjiArai 0:5b88d5760320 273 #ifdef TFM_NS_CLIENT_IDENTIFICATION
kenjiArai 0:5b88d5760320 274 __attribute__((cmse_nonsecure_entry))
kenjiArai 0:5b88d5760320 275 enum tfm_status_e tfm_register_client_id (int32_t ns_client_id)
kenjiArai 0:5b88d5760320 276 {
kenjiArai 0:5b88d5760320 277 int current_client_id;
kenjiArai 0:5b88d5760320 278
kenjiArai 0:5b88d5760320 279 if (__get_active_exc_num() == EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 280 /* This veneer should only be called by NS RTOS in handler mode */
kenjiArai 0:5b88d5760320 281 return TFM_ERROR_NS_THREAD_MODE_CALL;
kenjiArai 0:5b88d5760320 282 }
kenjiArai 0:5b88d5760320 283
kenjiArai 0:5b88d5760320 284 if (ns_client_id >= 0) {
kenjiArai 0:5b88d5760320 285 /* The client ID is invalid */
kenjiArai 0:5b88d5760320 286 return TFM_ERROR_INVALID_PARAMETER;
kenjiArai 0:5b88d5760320 287 }
kenjiArai 0:5b88d5760320 288
kenjiArai 0:5b88d5760320 289 if (active_ns_client_idx < 0) {
kenjiArai 0:5b88d5760320 290 /* No client is active */
kenjiArai 0:5b88d5760320 291 return TFM_ERROR_GENERIC;
kenjiArai 0:5b88d5760320 292 }
kenjiArai 0:5b88d5760320 293
kenjiArai 0:5b88d5760320 294 current_client_id = NsClientIdList[active_ns_client_idx].ns_client_id;
kenjiArai 0:5b88d5760320 295 if (current_client_id >= 0 ) {
kenjiArai 0:5b88d5760320 296 /* The client ID is invalid */
kenjiArai 0:5b88d5760320 297 return TFM_ERROR_INVALID_PARAMETER;
kenjiArai 0:5b88d5760320 298 }
kenjiArai 0:5b88d5760320 299
kenjiArai 0:5b88d5760320 300 NsClientIdList[active_ns_client_idx].ns_client_id = ns_client_id;
kenjiArai 0:5b88d5760320 301 #ifdef PRINT_NSPM_DEBUG
kenjiArai 0:5b88d5760320 302 printf("tfm_register_client_id called with id %d\r\n", ns_client_id);
kenjiArai 0:5b88d5760320 303 #endif /* PRINT_NSPM_DEBUG */
kenjiArai 0:5b88d5760320 304
kenjiArai 0:5b88d5760320 305 return TFM_SUCCESS;
kenjiArai 0:5b88d5760320 306 }
kenjiArai 0:5b88d5760320 307 #endif
kenjiArai 0:5b88d5760320 308
kenjiArai 0:5b88d5760320 309 #ifdef TFM_PSA_API
kenjiArai 0:5b88d5760320 310 __attribute__((section("SFN")))
kenjiArai 0:5b88d5760320 311 psa_status_t tfm_nspm_thread_entry(void)
kenjiArai 0:5b88d5760320 312 {
kenjiArai 0:5b88d5760320 313 #ifdef TFM_CORE_DEBUG
kenjiArai 0:5b88d5760320 314 /* Jumps to non-secure code */
kenjiArai 0:5b88d5760320 315 LOG_MSG("Jumping to non-secure code...");
kenjiArai 0:5b88d5760320 316 #endif
kenjiArai 0:5b88d5760320 317
kenjiArai 0:5b88d5760320 318 jump_to_ns_code();
kenjiArai 0:5b88d5760320 319
kenjiArai 0:5b88d5760320 320 /* Should not run here */
kenjiArai 0:5b88d5760320 321 TFM_ASSERT(false);
kenjiArai 0:5b88d5760320 322 return PSA_SUCCESS;
kenjiArai 0:5b88d5760320 323 }
kenjiArai 0:5b88d5760320 324 #endif