SST: Add uniform secure functions support

This patch adds the uniform secure functions support in SST.

Change-Id: I52475b43435ed3b6d289651ea777de9483116b7e
Signed-off-by: Marc Moreno <marc.morenoberengue@arm.com>
diff --git a/interface/src/tfm_sst_api.c b/interface/src/tfm_sst_api.c
index 2a20e28..5102b2f 100644
--- a/interface/src/tfm_sst_api.c
+++ b/interface/src/tfm_sst_api.c
@@ -9,20 +9,34 @@
 
 #include "tfm_ns_lock.h"
 #include "tfm_sst_defs.h"
-#include "tfm_sst_veneers.h"
+#include "tfm_veneers.h"
+
+#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
 
 psa_ps_status_t psa_ps_set(psa_ps_uid_t uid,
                            uint32_t data_length,
                            const void *p_data,
                            psa_ps_create_flags_t create_flags)
 {
+    psa_status_t status;
     enum tfm_sst_err_t err;
 
-    err = tfm_ns_lock_dispatch((veneer_fn)tfm_sst_veneer_set,
-                               (uint32_t)&uid,
-                               (uint32_t)data_length,
-                               (uint32_t)p_data,
-                               (uint32_t)create_flags);
+    psa_invec in_vec[] = {
+        { .base = &uid,   .len = sizeof(uid) },
+        { .base = p_data, .len = data_length },
+        { .base = &create_flags, .len = sizeof(create_flags) }
+    };
+
+    psa_outvec out_vec[] = {
+        { .base = &err , .len = sizeof(err) }
+    };
+
+    status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_set_req_veneer,
+                                  (uint32_t)in_vec,  IOVEC_LEN(in_vec),
+                                  (uint32_t)out_vec, IOVEC_LEN(out_vec));
+    if (status != PSA_SUCCESS) {
+        return PSA_PS_ERROR_OPERATION_FAILED;
+    }
 
     return TFM_SST_PSA_RETURN(err);
 }
@@ -32,39 +46,75 @@
                            uint32_t data_length,
                            void *p_data)
 {
+    psa_status_t status;
     enum tfm_sst_err_t err;
 
-    err = tfm_ns_lock_dispatch((veneer_fn)tfm_sst_veneer_get,
-                               (uint32_t)&uid,
-                               (uint32_t)data_offset,
-                               (uint32_t)data_length,
-                               (uint32_t)p_data);
+    psa_invec in_vec[] = {
+        { .base = &uid, .len = sizeof(uid) },
+        { .base = &data_offset, .len = sizeof(data_offset) }
+    };
+
+    psa_outvec out_vec[] = {
+        { .base = &err,   .len = sizeof(err) },
+        { .base = p_data, .len = data_length }
+    };
+
+    status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_req_veneer,
+                                  (uint32_t)in_vec,  IOVEC_LEN(in_vec),
+                                  (uint32_t)out_vec, IOVEC_LEN(out_vec));
+
+    if (status != PSA_SUCCESS) {
+        return PSA_PS_ERROR_OPERATION_FAILED;
+    }
 
     return TFM_SST_PSA_RETURN(err);
 }
 
 psa_ps_status_t psa_ps_get_info(psa_ps_uid_t uid, struct psa_ps_info_t *p_info)
 {
+    psa_status_t status;
     enum tfm_sst_err_t err;
 
-    err = tfm_ns_lock_dispatch((veneer_fn)tfm_sst_veneer_get_info,
-                               (uint32_t)&uid,
-                               (uint32_t)p_info,
-                               (uint32_t)0,
-                               (uint32_t)0);
+    psa_invec in_vec[] = {
+        { .base = &uid, .len = sizeof(uid) }
+    };
+
+    psa_outvec out_vec[] = {
+        { .base = &err,   .len = sizeof(err) },
+        { .base = p_info, .len = sizeof(*p_info) }
+    };
+
+    status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_info_req_veneer,
+                                  (uint32_t)in_vec,  IOVEC_LEN(in_vec),
+                                  (uint32_t)out_vec, IOVEC_LEN(out_vec));
+
+    if (status != PSA_SUCCESS) {
+        return PSA_PS_ERROR_OPERATION_FAILED;
+    }
 
     return TFM_SST_PSA_RETURN(err);
 }
 
 psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
 {
+    psa_status_t status;
     enum tfm_sst_err_t err;
 
-    err = tfm_ns_lock_dispatch((veneer_fn)tfm_sst_veneer_remove,
-                               (uint32_t)&uid,
-                               (uint32_t)0,
-                               (uint32_t)0,
-                               (uint32_t)0);
+    psa_invec in_vec[] = {
+        { .base = &uid, .len = sizeof(uid) }
+    };
+
+    psa_outvec out_vec[] = {
+        { .base = &err, .len = sizeof(err) }
+    };
+
+    status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_remove_req_veneer,
+                                  (uint32_t)in_vec,  IOVEC_LEN(in_vec),
+                                  (uint32_t)out_vec, IOVEC_LEN(out_vec));
+
+    if (status != PSA_SUCCESS) {
+        return PSA_PS_ERROR_OPERATION_FAILED;
+    }
 
     return TFM_SST_PSA_RETURN(err);
 }
@@ -85,21 +135,21 @@
 
 uint32_t psa_ps_get_support(void)
 {
-    uint32_t support_flags;
-
     /* Initialise support_flags to a sensible default, to avoid returning an
      * uninitialised value in case the secure function fails.
      */
-    support_flags = 0;
+    uint32_t support_flags = 0;
+
+    psa_outvec out_vec[] = {
+        { .base = &support_flags, .len = sizeof(support_flags) }
+    };
 
     /* The PSA API does not return an error, so any error from TF-M is
      * ignored.
      */
-    (void)tfm_ns_lock_dispatch((veneer_fn)tfm_sst_veneer_get_support,
-                               (uint32_t)&support_flags,
-                               (uint32_t)0,
-                               (uint32_t)0,
-                               (uint32_t)0);
+    (void)tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_support_req_veneer,
+                               (uint32_t)NULL,  0,
+                               (uint32_t)out_vec, IOVEC_LEN(out_vec));
 
     return support_flags;
 }