1/* 2 * Copyright (c) 2017-2021, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 8/* 9 * An example to implement tfm_ns_interface_dispatch() in NS RTOS to integrate 10 * TF-M interface on Armv8-M TrustZone based platforms. 11 * 12 * In this example, NS OS calls mutex in tfm_ns_interface_dispatch() to 13 * synchronize multiple NS client calls. 14 * NS OS pseudo code in this example is not based on any specific RTOS. 15 * 16 * Please note that this example cannot be built directly. 17 */ 18 19#include <stdint.h> 20 21/* Include NS RTOS specific mutex declarations */ 22#include "mutex.h" 23#include "tfm_ns_interface.h" 24 25/* Static ns lock handle */ 26static void *ns_lock_handle = NULL; 27 28/* Initialize the ns lock */ 29int32_t ns_interface_lock_init(...) 30{ 31 /* NS RTOS specific mutex creation/initialization */ 32 ns_lock_handle = os_mutex_create(...); 33 if (ns_lock_handle) { 34 return OS_SUCCESS; 35 } 36 37 return OS_ERROR; 38} 39 40int32_t tfm_ns_interface_dispatch(veneer_fn fn, 41 uint32_t arg0, uint32_t arg1, 42 uint32_t arg2, uint32_t arg3) 43{ 44 int32_t result; 45 46 /* TF-M request protected by NS lock. */ 47 while (os_mutex_acquire(ns_lock_handle, ...) != OS_SUCCESS); 48 49 result = fn(arg0, arg1, arg2, arg3); 50 51 /* 52 * Whether to check/handle lock release return code depends on NS RTOS 53 * specific implementation and usage scenario. 54 */ 55 os_mutex_release(ns_lock_handle, ...); 56 57 return result; 58} 59