diff options
author | Shivangi Kesharwani <quic_skesharw@quicinc.com> | 2022-12-21 11:30:54 +0530 |
---|---|---|
committer | rthavti <quic_rthavti@quicinc.com> | 2023-04-20 17:12:21 +0530 |
commit | c16958000f92874c29c61012f2553954ba6a8a4d (patch) | |
tree | d4cecb3265a9c866f0888525e960d1b24ad51bc9 | |
parent | 841473f521aca51737b626b99e2050e4c67797f7 (diff) | |
download | securemsm-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.c | 6 | ||||
-rw-r--r-- | crypto-qti/qcedev.c | 158 |
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; |