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); }