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 <tkaratapanis@census-labs.com>
This commit is contained in:
parent
707cdaf42e
commit
9970e6a54e
4 changed files with 57 additions and 41 deletions
|
|
@ -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
|
* Name: optee_va_to_pa
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ int optee_to_msg_param(FAR struct optee_priv_data *priv,
|
||||||
FAR const struct tee_ioctl_param *params);
|
FAR const struct tee_ioctl_param *params);
|
||||||
|
|
||||||
int optee_convert_to_errno(uint32_t oterr);
|
int optee_convert_to_errno(uint32_t oterr);
|
||||||
|
uint32_t optee_convert_from_errno(int err);
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -188,32 +188,16 @@ static void optee_rpc_cmd_shm_alloc(FAR struct optee_priv_data *priv,
|
||||||
ret = optee_supplicant_alloc(priv, size, &shm);
|
ret = optee_supplicant_alloc(priv, size, &shm);
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
arg->ret = TEE_ERROR_NOT_SUPPORTED;
|
ret = -ENOTSUP;
|
||||||
return;
|
|
||||||
#endif
|
#endif
|
||||||
case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
|
case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
|
||||||
ret = optee_shm_alloc(priv, NULL, size, TEE_SHM_ALLOC, &shm);
|
ret = optee_shm_alloc(priv, NULL, size, TEE_SHM_ALLOC, &shm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == -ENOMEM)
|
arg->ret = optee_convert_from_errno(ret);
|
||||||
|
if (arg->ret != TEE_SUCCESS)
|
||||||
{
|
{
|
||||||
arg->ret = TEE_ERROR_OUT_OF_MEMORY;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (ret == -ECOMM)
|
|
||||||
{
|
|
||||||
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;
|
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.size = size;
|
||||||
arg->params[0].u.tmem.shm_ref = (unsigned long)shm;
|
arg->params[0].u.tmem.shm_ref = (unsigned long)shm;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg->ret = TEE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|
|
||||||
|
|
@ -558,34 +558,22 @@ void optee_supplicant_cmd(FAR struct optee_priv_data *priv,
|
||||||
return;
|
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;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg->ret = optee_supplicant_request(arg->cmd, arg->num_params, params);
|
arg->ret = optee_supplicant_request(arg->cmd, arg->num_params, params);
|
||||||
|
if (arg->ret != TEE_SUCCESS)
|
||||||
if ((ret = optee_to_msg_param(priv, arg->params, arg->num_params, params)))
|
|
||||||
{
|
{
|
||||||
if (ret == -ENOMEM)
|
goto out;
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = optee_to_msg_param(priv, arg->params, arg->num_params, params);
|
||||||
|
arg->ret = optee_convert_from_errno(ret);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kmm_free(params);
|
kmm_free(params);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue