This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 9970e6a54ed5100599050ad63a6ae86456223c3a
Author: Theodore Karatapanis <tkaratapa...@census-labs.com>
AuthorDate: Mon Jul 21 13:23:37 2025 +0300

    drivers/misc/optee: Add error conversion from errno to TEE errors
    
    This commit simplifies sending errors back to OP-TEE and avoids
    code duplication when handling errno values.
    
    Signed-off-by: Theodore Karatapanis <tkaratapa...@census-labs.com>
---
 drivers/misc/optee.c            | 45 +++++++++++++++++++++++++++++++++++++++++
 drivers/misc/optee.h            |  1 +
 drivers/misc/optee_rpc.c        | 24 +++-------------------
 drivers/misc/optee_supplicant.c | 28 ++++++++-----------------
 4 files changed, 57 insertions(+), 41 deletions(-)

diff --git a/drivers/misc/optee.c b/drivers/misc/optee.c
index 4426758d8ab..5d49136aab6 100644
--- a/drivers/misc/optee.c
+++ b/drivers/misc/optee.c
@@ -1251,6 +1251,51 @@ int optee_convert_to_errno(uint32_t oterr)
     }
 }
 
+/****************************************************************************
+ * Name: optee_convert_from_errno
+ *
+ * Description:
+ *   Convert errno values to TEE errors.
+ *
+ * Parameters:
+ *   err - errno value (negative).
+ *
+ * Returned Values:
+ *   The converted TEE error code.
+ *
+ ****************************************************************************/
+
+uint32_t optee_convert_from_errno(int err)
+{
+  /* Make sure we handle negative errno values */
+
+  switch (-err)
+    {
+      case 0:
+        return TEE_SUCCESS;
+      case EACCES:
+        return TEE_ERROR_ACCESS_DENIED;
+      case EINVAL:
+        return TEE_ERROR_BAD_PARAMETERS;
+      case ENOTSUP:
+      case EOPNOTSUPP:
+        return TEE_ERROR_NOT_SUPPORTED;
+      case ENOMEM:
+        return TEE_ERROR_OUT_OF_MEMORY;
+      case EBUSY:
+        return TEE_ERROR_BUSY;
+      case ECOMM:
+      case EPROTO:
+        return TEE_ERROR_COMMUNICATION;
+      case ENOBUFS:
+        return TEE_ERROR_SHORT_BUFFER;
+      case ETIMEDOUT:
+        return TEE_ERROR_TIMEOUT;
+      default:
+        return TEE_ERROR_GENERIC;
+    }
+}
+
 /****************************************************************************
  * Name: optee_va_to_pa
  *
diff --git a/drivers/misc/optee.h b/drivers/misc/optee.h
index c2fd32a8001..637c1afc3b4 100644
--- a/drivers/misc/optee.h
+++ b/drivers/misc/optee.h
@@ -126,6 +126,7 @@ int optee_to_msg_param(FAR struct optee_priv_data *priv,
                        FAR const struct tee_ioctl_param *params);
 
 int optee_convert_to_errno(uint32_t oterr);
+uint32_t optee_convert_from_errno(int err);
 #undef EXTERN
 #if defined(__cplusplus)
 }
diff --git a/drivers/misc/optee_rpc.c b/drivers/misc/optee_rpc.c
index 5a83fa803ad..d0047326fb0 100644
--- a/drivers/misc/optee_rpc.c
+++ b/drivers/misc/optee_rpc.c
@@ -188,32 +188,16 @@ static void optee_rpc_cmd_shm_alloc(FAR struct 
optee_priv_data *priv,
         ret = optee_supplicant_alloc(priv, size, &shm);
         break;
 #else
-        arg->ret = TEE_ERROR_NOT_SUPPORTED;
-        return;
+        ret = -ENOTSUP;
 #endif
       case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
         ret = optee_shm_alloc(priv, NULL, size, TEE_SHM_ALLOC, &shm);
         break;
     }
 
-  if (ret == -ENOMEM)
-    {
-      arg->ret = TEE_ERROR_OUT_OF_MEMORY;
-      return;
-    }
-  else if (ret == -ECOMM)
+  arg->ret = optee_convert_from_errno(ret);
+  if (arg->ret != TEE_SUCCESS)
     {
-      arg->ret = TEE_ERROR_COMMUNICATION;
-      return;
-    }
-  else if (ret == -EINVAL)
-    {
-      arg->ret = TEE_ERROR_BAD_PARAMETERS;
-      return;
-    }
-  else if (ret != OK)
-    {
-      arg->ret = TEE_ERROR_GENERIC;
       return;
     }
 
@@ -233,8 +217,6 @@ static void optee_rpc_cmd_shm_alloc(FAR struct 
optee_priv_data *priv,
       arg->params[0].u.tmem.size = size;
       arg->params[0].u.tmem.shm_ref = (unsigned long)shm;
     }
-
-  arg->ret = TEE_SUCCESS;
 }
 
 /****************************************************************************
diff --git a/drivers/misc/optee_supplicant.c b/drivers/misc/optee_supplicant.c
index c600bf7f364..7296e88cc15 100644
--- a/drivers/misc/optee_supplicant.c
+++ b/drivers/misc/optee_supplicant.c
@@ -558,34 +558,22 @@ void optee_supplicant_cmd(FAR struct optee_priv_data 
*priv,
       return;
     }
 
-  if (optee_from_msg_param(params, arg->num_params, arg->params))
+  if ((ret = optee_from_msg_param(params, arg->num_params, arg->params))
+      != 0)
     {
-      arg->ret = TEE_ERROR_BAD_PARAMETERS;
+      arg->ret = optee_convert_from_errno(ret);
       goto out;
     }
 
   arg->ret = optee_supplicant_request(arg->cmd, arg->num_params, params);
-
-  if ((ret = optee_to_msg_param(priv, arg->params, arg->num_params, params)))
+  if (arg->ret != TEE_SUCCESS)
     {
-      if (ret == -ENOMEM)
-        {
-          arg->ret = TEE_ERROR_OUT_OF_MEMORY;
-        }
-      else if (ret == -EPROTO)
-        {
-          arg->ret = TEE_ERROR_COMMUNICATION;
-        }
-      else if (ret == -EINVAL)
-        {
-          arg->ret = TEE_ERROR_BAD_PARAMETERS;
-        }
-      else
-        {
-          arg->ret = TEE_ERROR_GENERIC;
-        }
+      goto out;
     }
 
+  ret = optee_to_msg_param(priv, arg->params, arg->num_params, params);
+  arg->ret = optee_convert_from_errno(ret);
+
 out:
   kmm_free(params);
 }

Reply via email to