SPM: Handle specific programmer errors in function

Preprocessor 'TFM_PROGRAMMER_ERROR' contains routine related codes,
CheckPatch would treat it as a warning and cause error in static checks
because it does not align with the recommended coding guidelines.

Signed-off-by: Xinyu Zhang <xinyu.zhang@arm.com>
Change-Id: Ie30dde1d018594e08303afbe29b962438240e1d5
diff --git a/secure_fw/spm/ffm/psa_api.c b/secure_fw/spm/ffm/psa_api.c
index b4cfbf9..9d3e6e1 100644
--- a/secure_fw/spm/ffm/psa_api.c
+++ b/secure_fw/spm/ffm/psa_api.c
@@ -86,6 +86,17 @@
 
 #endif /* PSA_FRAMEWORK_HAS_MM_IOVEC */
 
+void spm_handle_programmer_errors(psa_status_t status)
+{
+    if (status == PSA_ERROR_PROGRAMMER_ERROR ||
+        status == PSA_ERROR_CONNECTION_REFUSED ||
+        status == PSA_ERROR_CONNECTION_BUSY) {
+        if (!tfm_spm_is_ns_caller()) {
+            tfm_core_panic();
+        }
+    }
+}
+
 uint32_t tfm_spm_get_lifecycle_state(void)
 {
     /*
@@ -143,12 +154,12 @@
      */
     service = tfm_spm_get_service_by_sid(sid);
     if (!service) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_CONNECTION_REFUSED);
+        return PSA_ERROR_CONNECTION_REFUSED;
     }
 
     /* It is a PROGRAMMER ERROR if connecting to a stateless service. */
     if (SERVICE_IS_STATELESS(service->p_ldinf->flags)) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     /*
@@ -156,7 +167,7 @@
      * RoT Service.
      */
     if (tfm_spm_check_authorization(sid, service, ns_caller) != SPM_SUCCESS) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_CONNECTION_REFUSED);
+        return PSA_ERROR_CONNECTION_REFUSED;
     }
 
     /*
@@ -164,7 +175,7 @@
      * not supported on the platform.
      */
     if (tfm_spm_check_client_version(service, version) != SPM_SUCCESS) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_CONNECTION_REFUSED);
+        return PSA_ERROR_CONNECTION_REFUSED;
     }
 
     client_id = tfm_spm_get_client_id(ns_caller);
@@ -216,14 +227,14 @@
 
     /* The request type must be zero or positive. */
     if (type < 0) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     /* It is a PROGRAMMER ERROR if in_len + out_len > PSA_MAX_IOVEC. */
     if ((in_num > PSA_MAX_IOVEC) ||
         (out_num > PSA_MAX_IOVEC) ||
         (in_num + out_num > PSA_MAX_IOVEC)) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     client_id = tfm_spm_get_client_id(ns_caller);
@@ -233,7 +244,7 @@
         index = GET_INDEX_FROM_STATIC_HANDLE(handle);
 
         if (!IS_VALID_STATIC_HANDLE_IDX(index)) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
 
         service = GET_STATELESS_SERVICE(index);
@@ -249,13 +260,13 @@
          */
         if (tfm_spm_check_authorization(sid, service, ns_caller)
             != SPM_SUCCESS) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_CONNECTION_REFUSED);
+            return PSA_ERROR_CONNECTION_REFUSED;
         }
 
         version = GET_VERSION_FROM_STATIC_HANDLE(handle);
 
         if (tfm_spm_check_client_version(service, version) != SPM_SUCCESS) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
 
         CRITICAL_SECTION_ENTER(cs_assert);
@@ -263,7 +274,7 @@
         CRITICAL_SECTION_LEAVE(cs_assert);
 
         if (!conn_handle) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_CONNECTION_BUSY);
+            return PSA_ERROR_CONNECTION_BUSY;
         }
 
         conn_handle->rhandle = NULL;
@@ -274,7 +285,7 @@
         /* It is a PROGRAMMER ERROR if an invalid handle was passed. */
         if (tfm_spm_validate_conn_handle(conn_handle, client_id)
             != SPM_SUCCESS) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
 
         /*
@@ -282,7 +293,7 @@
          * handling a request.
          */
         if (conn_handle->status == TFM_HANDLE_STATUS_ACTIVE) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
 
         /*
@@ -310,7 +321,7 @@
      */
     if (tfm_memory_check(inptr, in_num * sizeof(psa_invec), ns_caller,
         TFM_MEMORY_ACCESS_RO, privileged) != SPM_SUCCESS) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     /*
@@ -320,7 +331,7 @@
      */
     if (tfm_memory_check(outptr, out_num * sizeof(psa_outvec), ns_caller,
         TFM_MEMORY_ACCESS_RW, privileged) != SPM_SUCCESS) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     spm_memset(invecs, 0, sizeof(invecs));
@@ -337,7 +348,7 @@
     for (i = 0; i < in_num; i++) {
         if (tfm_memory_check(invecs[i].base, invecs[i].len, ns_caller,
             TFM_MEMORY_ACCESS_RO, privileged) != SPM_SUCCESS) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
     }
 
@@ -352,7 +363,7 @@
                   (char *) invecs[i].base ||
                   (char *) invecs[j].base >=
                   (char *) invecs[i].base + invecs[i].len)) {
-                TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+                return PSA_ERROR_PROGRAMMER_ERROR;
             }
         }
     }
@@ -364,7 +375,7 @@
     for (i = 0; i < out_num; i++) {
         if (tfm_memory_check(outvecs[i].base, outvecs[i].len,
             ns_caller, TFM_MEMORY_ACCESS_RW, privileged) != SPM_SUCCESS) {
-            TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+            return PSA_ERROR_PROGRAMMER_ERROR;
         }
     }
 
@@ -375,7 +386,7 @@
     msg = tfm_spm_get_msg_buffer_from_conn_handle(conn_handle);
     if (!msg) {
         /* FixMe: Need to implement one mechanism to resolve this failure. */
-        TFM_PROGRAMMER_ERROR(ns_caller, PSA_ERROR_PROGRAMMER_ERROR);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     tfm_spm_fill_msg(msg, service, handle, type, client_id,
@@ -384,7 +395,7 @@
     return backend_instance.messaging(service, msg);
 }
 
-void tfm_spm_client_psa_close(psa_handle_t handle)
+psa_status_t tfm_spm_client_psa_close(psa_handle_t handle)
 {
     struct service_t *service;
     struct tfm_msg_body_t *msg;
@@ -394,12 +405,12 @@
 
     /* It will have no effect if called with the NULL handle */
     if (handle == PSA_NULL_HANDLE) {
-        return;
+        return PSA_SUCCESS;
     }
 
     /* It is a PROGRAMMER ERROR if called with a stateless handle. */
     if (IS_STATIC_HANDLE(handle)) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PROGRAMMER_ERROR_NULL);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     client_id = tfm_spm_get_client_id(ns_caller);
@@ -410,7 +421,7 @@
      * the null handle.
      */
     if (tfm_spm_validate_conn_handle(conn_handle, client_id) != SPM_SUCCESS) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PROGRAMMER_ERROR_NULL);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     service = conn_handle->internal_msg.service;
@@ -430,14 +441,14 @@
      * request.
      */
     if (conn_handle->status == TFM_HANDLE_STATUS_ACTIVE) {
-        TFM_PROGRAMMER_ERROR(ns_caller, PROGRAMMER_ERROR_NULL);
+        return PSA_ERROR_PROGRAMMER_ERROR;
     }
 
     /* No input or output needed for close message */
     tfm_spm_fill_msg(msg, service, handle, PSA_IPC_DISCONNECT, client_id,
                      NULL, 0, NULL, 0, NULL);
 
-    (void)backend_instance.messaging(service, msg);
+    return backend_instance.messaging(service, msg);
 }
 
 /* PSA Partition API function body */