summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShivangi Kesharwani <quic_skesharw@quicinc.com>2022-12-21 11:30:54 +0530
committerrthavti <quic_rthavti@quicinc.com>2023-04-20 17:12:21 +0530
commitc16958000f92874c29c61012f2553954ba6a8a4d (patch)
treed4cecb3265a9c866f0888525e960d1b24ad51bc9
parent841473f521aca51737b626b99e2050e4c67797f7 (diff)
downloadsecuremsm-c16958000f92874c29c61012f2553954ba6a8a4d.tar.gz
Qcedev: To make qcedev compatible with 32 bit targets.
1) As per new design change to support 32bit targets, Qcedev driver will work on buffer allocated using kmalloc instead of user buffer, so using "memcpy" instead of "get_user" and "put_user". 2) Replaced "copy_from_user" and "copy_to_user" API with "memmove" in case of 32bit target, as buffer allocated with kmalloc is not compatible with these API. Tests: Validated all qcedev test in 32bit target and 64bit target 1)./qcedev_test -n (Nominal) 2)./qcedev_test -a (Adversarial) 3)./qcedev_test -r (Repeatabilty) 4)./qcedev_test -s (Stress) 5)./qcedev_test -p (Performance) Change-Id: Ia9f9e55afcaca944cd376e4c1eb204da8d1d23cc Signed-off-by: Shivangi Kesharwani <quic_skesharw@quicinc.com>
-rw-r--r--crypto-qti/compat_qcedev.c6
-rw-r--r--crypto-qti/qcedev.c158
2 files changed, 76 insertions, 88 deletions
diff --git a/crypto-qti/compat_qcedev.c b/crypto-qti/compat_qcedev.c
index 9863f5c..59b3305 100644
--- a/crypto-qti/compat_qcedev.c
+++ b/crypto-qti/compat_qcedev.c
@@ -489,7 +489,7 @@ long compat_qcedev_ioctl(struct file *file,
int err;
data32 = compat_ptr(arg);
- data = kmalloc(sizeof(*data),GFP_KERNEL);
+ data = kmalloc(sizeof(*data), GFP_KERNEL);
if (!data)
return -EINVAL;
@@ -502,8 +502,6 @@ long compat_qcedev_ioctl(struct file *file,
err = compat_xfer_qcedev_map_buf_req(data32, data, false);
kfree(data);
return ret ? ret : err;
-
- break;
}
case COMPAT_QCEDEV_IOCTL_UNMAP_BUF_REQ: {
struct compat_qcedev_unmap_buf_req __user *data32;
@@ -524,8 +522,6 @@ long compat_qcedev_ioctl(struct file *file,
err = compat_xfer_qcedev_unmap_buf_req(data32, data, false);
kfree(data);
return ret ? ret : err;
-
- break;
}
default:
return -ENOIOCTLCMD;
diff --git a/crypto-qti/qcedev.c b/crypto-qti/qcedev.c
index ad52395..4b5136b 100644
--- a/crypto-qti/qcedev.c
+++ b/crypto-qti/qcedev.c
@@ -2195,7 +2195,7 @@ long qcedev_ioctl(struct file *file,
switch (cmd) {
case QCEDEV_IOCTL_ENC_REQ:
- case QCEDEV_IOCTL_DEC_REQ:
+ case QCEDEV_IOCTL_DEC_REQ: {
K_COPY_FROM_USER(err, &qcedev_areq->cipher_op_req,
arg, sizeof(struct qcedev_cipher_op_req));
if (err) {
@@ -2221,8 +2221,8 @@ long qcedev_ioctl(struct file *file,
goto exit_free_qcedev_areq;
}
break;
-
- case QCEDEV_IOCTL_OFFLOAD_OP_REQ:
+ }
+ case QCEDEV_IOCTL_OFFLOAD_OP_REQ: {
K_COPY_FROM_USER(err, &qcedev_areq->offload_cipher_op_req,
arg, sizeof(struct qcedev_offload_cipher_op_req));
if (err) {
@@ -2248,9 +2248,8 @@ long qcedev_ioctl(struct file *file,
goto exit_free_qcedev_areq;
}
break;
-
- case QCEDEV_IOCTL_SHA_INIT_REQ:
- {
+ }
+ case QCEDEV_IOCTL_SHA_INIT_REQ: {
struct scatterlist sg_src;
K_COPY_FROM_USER(err, &qcedev_areq->sha_op_req,
arg, sizeof(struct qcedev_sha_op_req));
@@ -2278,16 +2277,16 @@ long qcedev_ioctl(struct file *file,
goto exit_free_qcedev_areq;
}
handle->sha_ctxt.init_done = true;
- }
break;
- case QCEDEV_IOCTL_GET_CMAC_REQ:
+ }
+ case QCEDEV_IOCTL_GET_CMAC_REQ: {
if (!podev->ce_support.cmac) {
err = -ENOTTY;
goto exit_free_qcedev_areq;
}
+ }
/* Fall-through */
- case QCEDEV_IOCTL_SHA_UPDATE_REQ:
- {
+ case QCEDEV_IOCTL_SHA_UPDATE_REQ: {
struct scatterlist sg_src;
K_COPY_FROM_USER(err, &qcedev_areq->sha_op_req,
arg, sizeof(struct qcedev_sha_op_req));
@@ -2340,11 +2339,9 @@ long qcedev_ioctl(struct file *file,
err = -EFAULT;
goto exit_free_qcedev_areq;
}
- }
break;
-
- case QCEDEV_IOCTL_SHA_FINAL_REQ:
-
+ }
+ case QCEDEV_IOCTL_SHA_FINAL_REQ: {
if (!handle->sha_ctxt.init_done) {
pr_err("%s Init was not called\n", __func__);
err = -EINVAL;
@@ -2388,9 +2385,8 @@ long qcedev_ioctl(struct file *file,
}
handle->sha_ctxt.init_done = false;
break;
-
- case QCEDEV_IOCTL_GET_SHA_REQ:
- {
+ }
+ case QCEDEV_IOCTL_GET_SHA_REQ: {
struct scatterlist sg_src;
K_COPY_FROM_USER(err, &qcedev_areq->sha_op_req,
arg, sizeof(struct qcedev_sha_op_req));
@@ -2434,86 +2430,82 @@ long qcedev_ioctl(struct file *file,
err = -EFAULT;
goto exit_free_qcedev_areq;
}
- }
break;
+ }
+ case QCEDEV_IOCTL_MAP_BUF_REQ: {
+ unsigned long long vaddr = 0;
+ struct qcedev_map_buf_req map_buf = { {0} };
+ int i = 0;
- case QCEDEV_IOCTL_MAP_BUF_REQ:
- {
- unsigned long long vaddr = 0;
- struct qcedev_map_buf_req map_buf = { {0} };
- int i = 0;
-
- K_COPY_FROM_USER(err, &map_buf,
- arg, sizeof(map_buf));
- if (err) {
- err = -EFAULT;
- goto exit_free_qcedev_areq;
- }
-
- if (map_buf.num_fds > ARRAY_SIZE(map_buf.fd)) {
- pr_err("%s: err: num_fds = %d exceeds max value\n",
- __func__, map_buf.num_fds);
- err = -EINVAL;
- goto exit_free_qcedev_areq;
- }
+ K_COPY_FROM_USER(err, &map_buf,
+ arg, sizeof(map_buf));
+ if (err) {
+ err = -EFAULT;
+ goto exit_free_qcedev_areq;
+ }
- for (i = 0; i < map_buf.num_fds; i++) {
- err = qcedev_check_and_map_buffer(handle,
- map_buf.fd[i],
- map_buf.fd_offset[i],
- map_buf.fd_size[i],
- &vaddr);
- if (err) {
- pr_err(
- "%s: err: failed to map fd(%d) - %d\n",
- __func__, map_buf.fd[i], err);
- goto exit_free_qcedev_areq;
- }
- map_buf.buf_vaddr[i] = vaddr;
- pr_info("%s: info: vaddr = %llx\n, fd = %d",
- __func__, vaddr, map_buf.fd[i]);
- }
+ if (map_buf.num_fds > ARRAY_SIZE(map_buf.fd)) {
+ pr_err("%s: err: num_fds = %d exceeds max value\n",
+ __func__, map_buf.num_fds);
+ err = -EINVAL;
+ goto exit_free_qcedev_areq;
+ }
- K_COPY_TO_USER(err, arg, &map_buf,
- sizeof(map_buf));
+ for (i = 0; i < map_buf.num_fds; i++) {
+ err = qcedev_check_and_map_buffer(handle,
+ map_buf.fd[i],
+ map_buf.fd_offset[i],
+ map_buf.fd_size[i],
+ &vaddr);
if (err) {
- err = -EFAULT;
+ pr_err(
+ "%s: err: failed to map fd(%d) - %d\n",
+ __func__, map_buf.fd[i], err);
goto exit_free_qcedev_areq;
}
- break;
+ map_buf.buf_vaddr[i] = vaddr;
+ pr_info("%s: info: vaddr = %llx\n, fd = %d",
+ __func__, vaddr, map_buf.fd[i]);
}
- case QCEDEV_IOCTL_UNMAP_BUF_REQ:
- {
- struct qcedev_unmap_buf_req unmap_buf = { { 0 } };
- int i = 0;
+ K_COPY_TO_USER(err, arg, &map_buf,
+ sizeof(map_buf));
+ if (err) {
+ err = -EFAULT;
+ goto exit_free_qcedev_areq;
+ }
+ break;
+ }
+ case QCEDEV_IOCTL_UNMAP_BUF_REQ: {
+ struct qcedev_unmap_buf_req unmap_buf = { { 0 } };
+ int i = 0;
- K_COPY_FROM_USER(err, &unmap_buf,
- arg, sizeof(unmap_buf));
+ K_COPY_FROM_USER(err, &unmap_buf,
+ arg, sizeof(unmap_buf));
+ if (err) {
+ err = -EFAULT;
+ goto exit_free_qcedev_areq;
+ }
+ if (unmap_buf.num_fds > ARRAY_SIZE(unmap_buf.fd)) {
+ pr_err("%s: err: num_fds = %d exceeds max value\n",
+ __func__, unmap_buf.num_fds);
+ err = -EINVAL;
+ goto exit_free_qcedev_areq;
+ }
+
+ for (i = 0; i < unmap_buf.num_fds; i++) {
+ err = qcedev_check_and_unmap_buffer(handle,
+ unmap_buf.fd[i]);
if (err) {
- err = -EFAULT;
- goto exit_free_qcedev_areq;
- }
- if (unmap_buf.num_fds > ARRAY_SIZE(unmap_buf.fd)) {
- pr_err("%s: err: num_fds = %d exceeds max value\n",
- __func__, unmap_buf.num_fds);
- err = -EINVAL;
+ pr_err(
+ "%s: err: failed to unmap fd(%d) - %d\n",
+ __func__,
+ unmap_buf.fd[i], err);
goto exit_free_qcedev_areq;
}
-
- for (i = 0; i < unmap_buf.num_fds; i++) {
- err = qcedev_check_and_unmap_buffer(handle,
- unmap_buf.fd[i]);
- if (err) {
- pr_err(
- "%s: err: failed to unmap fd(%d) - %d\n",
- __func__,
- unmap_buf.fd[i], err);
- goto exit_free_qcedev_areq;
- }
- }
- break;
}
+ break;
+ }
default:
err = -ENOTTY;