tee: add TEE_IOCTL_PARAM_ATTR_META
Adds TEE_IOCTL_PARAM_ATTR_META which can be used to indicate meta parameters when communicating with user space. These meta parameters can be used by supplicant support multiple parallel requests at a time. Reviewed-by: Etienne Carriere <etienne.carriere@linaro.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
parent
84debcc535
commit
f2aa97240c
|
@ -119,6 +119,27 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int supp_check_recv_params(size_t num_params, struct tee_param *params)
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there's memrefs we need to decrease those as they where
|
||||||
|
* increased earlier and we'll even refuse to accept any below.
|
||||||
|
*/
|
||||||
|
for (n = 0; n < num_params; n++)
|
||||||
|
if (tee_param_is_memref(params + n) && params[n].u.memref.shm)
|
||||||
|
tee_shm_put(params[n].u.memref.shm);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We only expect parameters as TEE_IOCTL_PARAM_ATTR_TYPE_NONE (0).
|
||||||
|
*/
|
||||||
|
for (n = 0; n < num_params; n++)
|
||||||
|
if (params[n].attr)
|
||||||
|
return -EINVAL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* optee_supp_recv() - receive request for supplicant
|
* optee_supp_recv() - receive request for supplicant
|
||||||
* @ctx: context receiving the request
|
* @ctx: context receiving the request
|
||||||
|
@ -137,6 +158,10 @@ int optee_supp_recv(struct tee_context *ctx, u32 *func, u32 *num_params,
|
||||||
struct optee_supp *supp = &optee->supp;
|
struct optee_supp *supp = &optee->supp;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
rc = supp_check_recv_params(*num_params, param);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In case two threads in one supplicant is calling this function
|
* In case two threads in one supplicant is calling this function
|
||||||
* simultaneously we need to protect the data with a mutex which
|
* simultaneously we need to protect the data with a mutex which
|
||||||
|
|
|
@ -152,11 +152,11 @@ static int params_from_user(struct tee_context *ctx, struct tee_param *params,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
/* All unused attribute bits has to be zero */
|
/* All unused attribute bits has to be zero */
|
||||||
if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_TYPE_MASK)
|
if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_MASK)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
params[n].attr = ip.attr;
|
params[n].attr = ip.attr;
|
||||||
switch (ip.attr) {
|
switch (ip.attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_NONE:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_NONE:
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
|
||||||
break;
|
break;
|
||||||
|
@ -394,8 +394,8 @@ static int params_to_supp(struct tee_context *ctx,
|
||||||
struct tee_ioctl_param ip;
|
struct tee_ioctl_param ip;
|
||||||
struct tee_param *p = params + n;
|
struct tee_param *p = params + n;
|
||||||
|
|
||||||
ip.attr = p->attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK;
|
ip.attr = p->attr;
|
||||||
switch (p->attr) {
|
switch (p->attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT:
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
|
||||||
ip.a = p->u.value.a;
|
ip.a = p->u.value.a;
|
||||||
|
@ -459,6 +459,10 @@ static int tee_ioctl_supp_recv(struct tee_context *ctx,
|
||||||
if (!params)
|
if (!params)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rc = params_from_user(ctx, params, num_params, uarg->params);
|
||||||
|
if (rc)
|
||||||
|
goto out;
|
||||||
|
|
||||||
rc = ctx->teedev->desc->ops->supp_recv(ctx, &func, &num_params, params);
|
rc = ctx->teedev->desc->ops->supp_recv(ctx, &func, &num_params, params);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -488,11 +492,11 @@ static int params_from_supp(struct tee_param *params, size_t num_params,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
/* All unused attribute bits has to be zero */
|
/* All unused attribute bits has to be zero */
|
||||||
if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_TYPE_MASK)
|
if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_MASK)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
p->attr = ip.attr;
|
p->attr = ip.attr;
|
||||||
switch (ip.attr) {
|
switch (ip.attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
|
||||||
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
|
case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
|
||||||
/* Only out and in/out values can be updated */
|
/* Only out and in/out values can be updated */
|
||||||
|
|
|
@ -154,6 +154,13 @@ struct tee_ioctl_buf_data {
|
||||||
*/
|
*/
|
||||||
#define TEE_IOCTL_PARAM_ATTR_TYPE_MASK 0xff
|
#define TEE_IOCTL_PARAM_ATTR_TYPE_MASK 0xff
|
||||||
|
|
||||||
|
/* Meta parameter carrying extra information about the message. */
|
||||||
|
#define TEE_IOCTL_PARAM_ATTR_META 0x100
|
||||||
|
|
||||||
|
/* Mask of all known attr bits */
|
||||||
|
#define TEE_IOCTL_PARAM_ATTR_MASK \
|
||||||
|
(TEE_IOCTL_PARAM_ATTR_TYPE_MASK | TEE_IOCTL_PARAM_ATTR_META)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Matches TEEC_LOGIN_* in GP TEE Client API
|
* Matches TEEC_LOGIN_* in GP TEE Client API
|
||||||
* Are only defined for GP compliant TEEs
|
* Are only defined for GP compliant TEEs
|
||||||
|
|
Loading…
Reference in New Issue