in tee_core.c [637:679]
static int params_to_supp(struct tee_context *ctx,
struct tee_ioctl_param __user *uparams,
size_t num_params, struct tee_param *params)
{
size_t n;
for (n = 0; n < num_params; n++) {
struct tee_ioctl_param ip;
struct tee_param *p = params + n;
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;
ip.b = p->u.value.b;
ip.c = p->u.value.c;
break;
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT:
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
ip.b = p->u.memref.size;
if (!p->u.memref.shm) {
ip.a = 0;
ip.c = (u64)-1; /* invalid shm id */
break;
}
ip.a = p->u.memref.shm_offs;
ip.c = p->u.memref.shm->id;
break;
default:
ip.a = 0;
ip.b = 0;
ip.c = 0;
break;
}
if (copy_to_user(uparams + n, &ip, sizeof(ip)))
return -EFAULT;
}
return 0;
}