tee: add TEE_IOCTL_PARAM_ATTR_META
authorJens Wiklander <jens.wiklander@linaro.org>
Fri, 23 Dec 2016 12:13:34 +0000 (13:13 +0100)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:55:38 +0000 (15:55 -0500)
Adds TEE_IOCTL_PARAM_ATTR_META with 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>
Modified from: From: https://github.com/linaro-swg/linux.git
 Conflicts:
drivers/tee/tee_core.c
(cherry picked from commit 66d81fcf145fdc55322c0a11764c76a43d90ecad)

drivers/tee/optee/supp.c
drivers/tee/tee_core.c
include/uapi/linux/tee.h

index b4ea067..56aa8b9 100644 (file)
@@ -119,6 +119,27 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,
        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
  * @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;
        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
         * simultaneously we need to protect the data with a mutex which
index 879bf3e..17bd0fc 100644 (file)
@@ -201,11 +201,11 @@ static int params_from_user(struct tee_context *ctx, struct tee_param *params,
                        return -EFAULT;
 
                /* 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;
 
                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_VALUE_OUTPUT:
                        break;
@@ -443,8 +443,8 @@ static int params_to_supp(struct tee_context *ctx,
                struct tee_ioctl_param ip;
                struct tee_param *p = params + n;
 
-               ip.attr = p->attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK;
-               switch (p->attr) {
+               ip.attr = 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_INOUT:
                        ip.a = p->u.value.a;
@@ -508,6 +508,10 @@ static int tee_ioctl_supp_recv(struct tee_context *ctx,
        if (!params)
                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);
        if (rc)
                goto out;
@@ -537,11 +541,11 @@ static int params_from_supp(struct tee_param *params, size_t num_params,
                        return -EFAULT;
 
                /* 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;
 
                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_INOUT:
                        /* Only out and in/out values can be updated */
index 81ee3ff..31f7127 100644 (file)
@@ -183,6 +183,13 @@ struct tee_ioctl_buf_data {
  */
 #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
  * Are only defined for GP compliant TEEs