Interface: Make the NS interface functions common
This patch implements common TF-M NS interface functions defined in
tfm_ns_interface.h, by calling the os_wrapper APIs.
With this change, the NSPE does not need to implement the TF-M NS
interface functions but only the os_wrapper APIs.
Still NSPE can overwrite the whole TF-M NS interface functions to
fulfill their special requirements.
Change-Id: Ifec47b99d6cba73acd94cfc0fde584f08333ab3c
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
diff --git a/interface/src/tfm_ns_interface.c b/interface/src/tfm_ns_interface.c
new file mode 100644
index 0000000..916af19
--- /dev/null
+++ b/interface/src/tfm_ns_interface.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "os_wrapper.h"
+
+#include "tfm_api.h"
+#include "tfm_ns_interface.h"
+
+/**
+ * \brief the ns_lock ID
+ */
+static uint32_t ns_lock_id = (uint32_t)NULL;
+
+__attribute__((weak))
+int32_t tfm_ns_interface_dispatch(veneer_fn fn,
+ uint32_t arg0, uint32_t arg1,
+ uint32_t arg2, uint32_t arg3)
+{
+ int32_t result;
+
+ /* TFM request protected by NS lock */
+ if (os_wrapper_mutex_acquire(ns_lock_id, OS_WRAPPER_WAIT_FOREVER)
+ != OS_WRAPPER_SUCCESS) {
+ return (int32_t)TFM_ERROR_GENERIC;
+ }
+
+ result = fn(arg0, arg1, arg2, arg3);
+
+ if (os_wrapper_mutex_release(ns_lock_id) != OS_WRAPPER_SUCCESS) {
+ return (int32_t)TFM_ERROR_GENERIC;
+ }
+
+ return result;
+}
+
+__attribute__((weak))
+enum tfm_status_e tfm_ns_interface_init(void)
+{
+ uint32_t id;
+
+ id = os_wrapper_mutex_create();
+ if (id == OS_WRAPPER_ERROR) {
+ return TFM_ERROR_GENERIC;
+ }
+
+ ns_lock_id = id;
+ return TFM_SUCCESS;
+}