Commit 52f72feb authored by Harald Freudenberger's avatar Harald Freudenberger Committed by Vasily Gorbik

s390/zcrypt: remove set_fs() invocation in zcrypt device driver

This patch reworks the zcrypt device driver so that the set_fs()
invocation is not needed any more. Instead there is a new flag bool
userspace passed through all the functions which tells if the pointer
arguments are userspace or kernelspace. Together with the two new
inline functions z_copy_from_user() and z_copy_to_user() which either
invoke copy_from_user (userspace is true) or memcpy (userspace is
false) the zcrypt dd and the AP bus now has no requirement for
the set_fs() functionality any more.
Signed-off-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
Reviewed-by: default avatarIngo Franzki <ifranzki@linux.ibm.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent c360c9a2
...@@ -797,7 +797,7 @@ static long zcrypt_rsa_crt(struct ap_perms *perms, ...@@ -797,7 +797,7 @@ static long zcrypt_rsa_crt(struct ap_perms *perms,
return rc; return rc;
} }
static long _zcrypt_send_cprb(struct ap_perms *perms, static long _zcrypt_send_cprb(bool userspace, struct ap_perms *perms,
struct ica_xcRB *xcRB) struct ica_xcRB *xcRB)
{ {
struct zcrypt_card *zc, *pref_zc; struct zcrypt_card *zc, *pref_zc;
...@@ -813,7 +813,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms, ...@@ -813,7 +813,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
xcRB->status = 0; xcRB->status = 0;
ap_init_message(&ap_msg); ap_init_message(&ap_msg);
rc = get_cprb_fc(xcRB, &ap_msg, &func_code, &domain); rc = get_cprb_fc(userspace, xcRB, &ap_msg, &func_code, &domain);
if (rc) if (rc)
goto out; goto out;
...@@ -878,7 +878,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms, ...@@ -878,7 +878,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
if (*domain == AUTOSEL_DOM) if (*domain == AUTOSEL_DOM)
*domain = AP_QID_QUEUE(qid); *domain = AP_QID_QUEUE(qid);
rc = pref_zq->ops->send_cprb(pref_zq, xcRB, &ap_msg); rc = pref_zq->ops->send_cprb(userspace, pref_zq, xcRB, &ap_msg);
spin_lock(&zcrypt_list_lock); spin_lock(&zcrypt_list_lock);
zcrypt_drop_queue(pref_zc, pref_zq, mod, weight); zcrypt_drop_queue(pref_zc, pref_zq, mod, weight);
...@@ -893,7 +893,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms, ...@@ -893,7 +893,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
long zcrypt_send_cprb(struct ica_xcRB *xcRB) long zcrypt_send_cprb(struct ica_xcRB *xcRB)
{ {
return _zcrypt_send_cprb(&ap_perms, xcRB); return _zcrypt_send_cprb(false, &ap_perms, xcRB);
} }
EXPORT_SYMBOL(zcrypt_send_cprb); EXPORT_SYMBOL(zcrypt_send_cprb);
...@@ -924,7 +924,7 @@ static bool is_desired_ep11_queue(unsigned int dev_qid, ...@@ -924,7 +924,7 @@ static bool is_desired_ep11_queue(unsigned int dev_qid,
return false; return false;
} }
static long _zcrypt_send_ep11_cprb(struct ap_perms *perms, static long _zcrypt_send_ep11_cprb(bool userspace, struct ap_perms *perms,
struct ep11_urb *xcrb) struct ep11_urb *xcrb)
{ {
struct zcrypt_card *zc, *pref_zc; struct zcrypt_card *zc, *pref_zc;
...@@ -956,7 +956,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms, ...@@ -956,7 +956,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms,
} }
uptr = (struct ep11_target_dev __force __user *) xcrb->targets; uptr = (struct ep11_target_dev __force __user *) xcrb->targets;
if (copy_from_user(targets, uptr, if (z_copy_from_user(userspace, targets, uptr,
target_num * sizeof(*targets))) { target_num * sizeof(*targets))) {
func_code = 0; func_code = 0;
rc = -EFAULT; rc = -EFAULT;
...@@ -964,7 +964,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms, ...@@ -964,7 +964,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms,
} }
} }
rc = get_ep11cprb_fc(xcrb, &ap_msg, &func_code); rc = get_ep11cprb_fc(userspace, xcrb, &ap_msg, &func_code);
if (rc) if (rc)
goto out_free; goto out_free;
...@@ -1015,7 +1015,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms, ...@@ -1015,7 +1015,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms,
} }
qid = pref_zq->queue->qid; qid = pref_zq->queue->qid;
rc = pref_zq->ops->send_ep11_cprb(pref_zq, xcrb, &ap_msg); rc = pref_zq->ops->send_ep11_cprb(userspace, pref_zq, xcrb, &ap_msg);
spin_lock(&zcrypt_list_lock); spin_lock(&zcrypt_list_lock);
zcrypt_drop_queue(pref_zc, pref_zq, mod, weight); zcrypt_drop_queue(pref_zc, pref_zq, mod, weight);
...@@ -1032,7 +1032,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms, ...@@ -1032,7 +1032,7 @@ static long _zcrypt_send_ep11_cprb(struct ap_perms *perms,
long zcrypt_send_ep11_cprb(struct ep11_urb *xcrb) long zcrypt_send_ep11_cprb(struct ep11_urb *xcrb)
{ {
return _zcrypt_send_ep11_cprb(&ap_perms, xcrb); return _zcrypt_send_ep11_cprb(false, &ap_perms, xcrb);
} }
EXPORT_SYMBOL(zcrypt_send_ep11_cprb); EXPORT_SYMBOL(zcrypt_send_ep11_cprb);
...@@ -1353,12 +1353,12 @@ static int zsecsendcprb_ioctl(struct ap_perms *perms, unsigned long arg) ...@@ -1353,12 +1353,12 @@ static int zsecsendcprb_ioctl(struct ap_perms *perms, unsigned long arg)
if (copy_from_user(&xcRB, uxcRB, sizeof(xcRB))) if (copy_from_user(&xcRB, uxcRB, sizeof(xcRB)))
return -EFAULT; return -EFAULT;
do { do {
rc = _zcrypt_send_cprb(perms, &xcRB); rc = _zcrypt_send_cprb(true, perms, &xcRB);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
/* on failure: retry once again after a requested rescan */ /* on failure: retry once again after a requested rescan */
if ((rc == -ENODEV) && (zcrypt_process_rescan())) if ((rc == -ENODEV) && (zcrypt_process_rescan()))
do { do {
rc = _zcrypt_send_cprb(perms, &xcRB); rc = _zcrypt_send_cprb(true, perms, &xcRB);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
if (rc) if (rc)
ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n", ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n",
...@@ -1377,12 +1377,12 @@ static int zsendep11cprb_ioctl(struct ap_perms *perms, unsigned long arg) ...@@ -1377,12 +1377,12 @@ static int zsendep11cprb_ioctl(struct ap_perms *perms, unsigned long arg)
if (copy_from_user(&xcrb, uxcrb, sizeof(xcrb))) if (copy_from_user(&xcrb, uxcrb, sizeof(xcrb)))
return -EFAULT; return -EFAULT;
do { do {
rc = _zcrypt_send_ep11_cprb(perms, &xcrb); rc = _zcrypt_send_ep11_cprb(true, perms, &xcrb);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
/* on failure: retry once again after a requested rescan */ /* on failure: retry once again after a requested rescan */
if ((rc == -ENODEV) && (zcrypt_process_rescan())) if ((rc == -ENODEV) && (zcrypt_process_rescan()))
do { do {
rc = _zcrypt_send_ep11_cprb(perms, &xcrb); rc = _zcrypt_send_ep11_cprb(true, perms, &xcrb);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
if (rc) if (rc)
ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc); ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc);
...@@ -1655,12 +1655,12 @@ static long trans_xcRB32(struct ap_perms *perms, struct file *filp, ...@@ -1655,12 +1655,12 @@ static long trans_xcRB32(struct ap_perms *perms, struct file *filp,
xcRB64.priority_window = xcRB32.priority_window; xcRB64.priority_window = xcRB32.priority_window;
xcRB64.status = xcRB32.status; xcRB64.status = xcRB32.status;
do { do {
rc = _zcrypt_send_cprb(perms, &xcRB64); rc = _zcrypt_send_cprb(true, perms, &xcRB64);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
/* on failure: retry once again after a requested rescan */ /* on failure: retry once again after a requested rescan */
if ((rc == -ENODEV) && (zcrypt_process_rescan())) if ((rc == -ENODEV) && (zcrypt_process_rescan()))
do { do {
rc = _zcrypt_send_cprb(perms, &xcRB64); rc = _zcrypt_send_cprb(true, perms, &xcRB64);
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
xcRB32.reply_control_blk_length = xcRB64.reply_control_blk_length; xcRB32.reply_control_blk_length = xcRB64.reply_control_blk_length;
xcRB32.reply_data_length = xcRB64.reply_data_length; xcRB32.reply_data_length = xcRB64.reply_data_length;
......
...@@ -59,9 +59,9 @@ struct zcrypt_ops { ...@@ -59,9 +59,9 @@ struct zcrypt_ops {
long (*rsa_modexpo)(struct zcrypt_queue *, struct ica_rsa_modexpo *); long (*rsa_modexpo)(struct zcrypt_queue *, struct ica_rsa_modexpo *);
long (*rsa_modexpo_crt)(struct zcrypt_queue *, long (*rsa_modexpo_crt)(struct zcrypt_queue *,
struct ica_rsa_modexpo_crt *); struct ica_rsa_modexpo_crt *);
long (*send_cprb)(struct zcrypt_queue *, struct ica_xcRB *, long (*send_cprb)(bool userspace, struct zcrypt_queue *, struct ica_xcRB *,
struct ap_message *); struct ap_message *);
long (*send_ep11_cprb)(struct zcrypt_queue *, struct ep11_urb *, long (*send_ep11_cprb)(bool userspace, struct zcrypt_queue *, struct ep11_urb *,
struct ap_message *); struct ap_message *);
long (*rng)(struct zcrypt_queue *, char *, struct ap_message *); long (*rng)(struct zcrypt_queue *, char *, struct ap_message *);
struct list_head list; /* zcrypt ops list. */ struct list_head list; /* zcrypt ops list. */
...@@ -145,4 +145,26 @@ void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus); ...@@ -145,4 +145,26 @@ void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus);
int zcrypt_device_status_ext(int card, int queue, int zcrypt_device_status_ext(int card, int queue,
struct zcrypt_device_status_ext *devstatus); struct zcrypt_device_status_ext *devstatus);
static inline unsigned long z_copy_from_user(bool userspace,
void *to,
const void __user *from,
unsigned long n)
{
if (likely(userspace))
return copy_from_user(to, from, n);
memcpy(to, (void __force *) from, n);
return 0;
}
static inline unsigned long z_copy_to_user(bool userspace,
void __user *to,
const void *from,
unsigned long n)
{
if (likely(userspace))
return copy_to_user(to, from, n);
memcpy((void __force *) to, from, n);
return 0;
}
#endif /* _ZCRYPT_API_H_ */ #endif /* _ZCRYPT_API_H_ */
...@@ -248,24 +248,6 @@ static inline void prep_xcrb(struct ica_xcRB *pxcrb, ...@@ -248,24 +248,6 @@ static inline void prep_xcrb(struct ica_xcRB *pxcrb,
pxcrb->reply_control_blk_addr = (void __user *) prepcblk; pxcrb->reply_control_blk_addr = (void __user *) prepcblk;
} }
/*
* Helper function which calls zcrypt_send_cprb with
* memory management segment adjusted to kernel space
* so that the copy_from_user called within this
* function do in fact copy from kernel space.
*/
static inline int _zcrypt_send_cprb(struct ica_xcRB *xcrb)
{
int rc;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
rc = zcrypt_send_cprb(xcrb);
set_fs(old_fs);
return rc;
}
/* /*
* Generate (random) CCA AES DATA secure key. * Generate (random) CCA AES DATA secure key.
*/ */
...@@ -359,7 +341,7 @@ int cca_genseckey(u16 cardnr, u16 domain, ...@@ -359,7 +341,7 @@ int cca_genseckey(u16 cardnr, u16 domain,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, errno %d\n", DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, errno %d\n",
__func__, (int) cardnr, (int) domain, rc); __func__, (int) cardnr, (int) domain, rc);
...@@ -497,7 +479,7 @@ int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize, ...@@ -497,7 +479,7 @@ int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
__func__, (int) cardnr, (int) domain, rc); __func__, (int) cardnr, (int) domain, rc);
...@@ -624,7 +606,7 @@ int cca_sec2protkey(u16 cardnr, u16 domain, ...@@ -624,7 +606,7 @@ int cca_sec2protkey(u16 cardnr, u16 domain,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
__func__, (int) cardnr, (int) domain, rc); __func__, (int) cardnr, (int) domain, rc);
...@@ -850,7 +832,7 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags, ...@@ -850,7 +832,7 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
...@@ -1018,7 +1000,7 @@ static int _ip_cprb_helper(u16 cardnr, u16 domain, ...@@ -1018,7 +1000,7 @@ static int _ip_cprb_helper(u16 cardnr, u16 domain,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
...@@ -1235,7 +1217,7 @@ int cca_cipher2protkey(u16 cardnr, u16 domain, const u8 *ckey, ...@@ -1235,7 +1217,7 @@ int cca_cipher2protkey(u16 cardnr, u16 domain, const u8 *ckey,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
...@@ -1366,7 +1348,7 @@ int cca_query_crypto_facility(u16 cardnr, u16 domain, ...@@ -1366,7 +1348,7 @@ int cca_query_crypto_facility(u16 cardnr, u16 domain,
prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk); prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
/* forward xcrb with request CPRB and reply CPRB to zcrypt dd */ /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
rc = _zcrypt_send_cprb(&xcrb); rc = zcrypt_send_cprb(&xcrb);
if (rc) { if (rc) {
DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n", DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
__func__, (int) cardnr, (int) domain, rc); __func__, (int) cardnr, (int) domain, rc);
......
...@@ -169,24 +169,6 @@ int ep11_check_aeskeyblob(debug_info_t *dbg, int dbflvl, ...@@ -169,24 +169,6 @@ int ep11_check_aeskeyblob(debug_info_t *dbg, int dbflvl,
} }
EXPORT_SYMBOL(ep11_check_aeskeyblob); EXPORT_SYMBOL(ep11_check_aeskeyblob);
/*
* Helper function which calls zcrypt_send_ep11_cprb with
* memory management segment adjusted to kernel space
* so that the copy_from_user called within this
* function do in fact copy from kernel space.
*/
static inline int _zcrypt_send_ep11_cprb(struct ep11_urb *urb)
{
int rc;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
rc = zcrypt_send_ep11_cprb(urb);
set_fs(old_fs);
return rc;
}
/* /*
* Allocate and prepare ep11 cprb plus additional payload. * Allocate and prepare ep11 cprb plus additional payload.
*/ */
...@@ -399,7 +381,7 @@ static int ep11_query_info(u16 cardnr, u16 domain, u32 query_type, ...@@ -399,7 +381,7 @@ static int ep11_query_info(u16 cardnr, u16 domain, u32 query_type,
req, sizeof(*req) + sizeof(*req_pl), req, sizeof(*req) + sizeof(*req_pl),
rep, sizeof(*rep) + sizeof(*rep_pl) + buflen); rep, sizeof(*rep) + sizeof(*rep_pl) + buflen);
rc = _zcrypt_send_ep11_cprb(urb); rc = zcrypt_send_ep11_cprb(urb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n", "%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n",
...@@ -637,7 +619,7 @@ int ep11_genaeskey(u16 card, u16 domain, u32 keybitsize, u32 keygenflags, ...@@ -637,7 +619,7 @@ int ep11_genaeskey(u16 card, u16 domain, u32 keybitsize, u32 keygenflags,
req, sizeof(*req) + sizeof(*req_pl), req, sizeof(*req) + sizeof(*req_pl),
rep, sizeof(*rep) + sizeof(*rep_pl)); rep, sizeof(*rep) + sizeof(*rep_pl));
rc = _zcrypt_send_ep11_cprb(urb); rc = zcrypt_send_ep11_cprb(urb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n", "%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n",
...@@ -757,7 +739,7 @@ static int ep11_cryptsingle(u16 card, u16 domain, ...@@ -757,7 +739,7 @@ static int ep11_cryptsingle(u16 card, u16 domain,
req, sizeof(*req) + req_pl_size, req, sizeof(*req) + req_pl_size,
rep, sizeof(*rep) + rep_pl_size); rep, sizeof(*rep) + rep_pl_size);
rc = _zcrypt_send_ep11_cprb(urb); rc = zcrypt_send_ep11_cprb(urb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n", "%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n",
...@@ -905,7 +887,7 @@ static int ep11_unwrapkey(u16 card, u16 domain, ...@@ -905,7 +887,7 @@ static int ep11_unwrapkey(u16 card, u16 domain,
req, sizeof(*req) + req_pl_size, req, sizeof(*req) + req_pl_size,
rep, sizeof(*rep) + sizeof(*rep_pl)); rep, sizeof(*rep) + sizeof(*rep_pl));
rc = _zcrypt_send_ep11_cprb(urb); rc = zcrypt_send_ep11_cprb(urb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n", "%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n",
...@@ -1033,7 +1015,7 @@ static int ep11_wrapkey(u16 card, u16 domain, ...@@ -1033,7 +1015,7 @@ static int ep11_wrapkey(u16 card, u16 domain,
req, sizeof(*req) + req_pl_size, req, sizeof(*req) + req_pl_size,
rep, sizeof(*rep) + sizeof(*rep_pl)); rep, sizeof(*rep) + sizeof(*rep_pl));
rc = _zcrypt_send_ep11_cprb(urb); rc = zcrypt_send_ep11_cprb(urb);
if (rc) { if (rc) {
DEBUG_ERR( DEBUG_ERR(
"%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n", "%s zcrypt_send_ep11_cprb(card=%d dom=%d) failed, rc=%d\n",
......
...@@ -388,7 +388,7 @@ struct type86_fmt2_msg { ...@@ -388,7 +388,7 @@ struct type86_fmt2_msg {
struct type86_fmt2_ext fmt2; struct type86_fmt2_ext fmt2;
} __packed; } __packed;
static int XCRB_msg_to_type6CPRB_msgX(struct ap_message *ap_msg, static int XCRB_msg_to_type6CPRB_msgX(bool userspace, struct ap_message *ap_msg,
struct ica_xcRB *xcRB, struct ica_xcRB *xcRB,
unsigned int *fcode, unsigned int *fcode,
unsigned short **dom) unsigned short **dom)
...@@ -465,7 +465,7 @@ static int XCRB_msg_to_type6CPRB_msgX(struct ap_message *ap_msg, ...@@ -465,7 +465,7 @@ static int XCRB_msg_to_type6CPRB_msgX(struct ap_message *ap_msg,
msg->hdr.FromCardLen2 = xcRB->reply_data_length; msg->hdr.FromCardLen2 = xcRB->reply_data_length;
/* prepare CPRB */ /* prepare CPRB */
if (copy_from_user(&(msg->cprbx), xcRB->request_control_blk_addr, if (z_copy_from_user(userspace, &(msg->cprbx), xcRB->request_control_blk_addr,
xcRB->request_control_blk_length)) xcRB->request_control_blk_length))
return -EFAULT; return -EFAULT;
if (msg->cprbx.cprb_len + sizeof(msg->hdr.function_code) > if (msg->cprbx.cprb_len + sizeof(msg->hdr.function_code) >
...@@ -484,14 +484,14 @@ static int XCRB_msg_to_type6CPRB_msgX(struct ap_message *ap_msg, ...@@ -484,14 +484,14 @@ static int XCRB_msg_to_type6CPRB_msgX(struct ap_message *ap_msg,
/* copy data block */ /* copy data block */
if (xcRB->request_data_length && if (xcRB->request_data_length &&
copy_from_user(req_data, xcRB->request_data_address, z_copy_from_user(userspace, req_data, xcRB->request_data_address,
xcRB->request_data_length)) xcRB->request_data_length))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
static int xcrb_msg_to_type6_ep11cprb_msgx(struct ap_message *ap_msg, static int xcrb_msg_to_type6_ep11cprb_msgx(bool userspace, struct ap_message *ap_msg,
struct ep11_urb *xcRB, struct ep11_urb *xcRB,
unsigned int *fcode) unsigned int *fcode)
{ {
...@@ -543,7 +543,7 @@ static int xcrb_msg_to_type6_ep11cprb_msgx(struct ap_message *ap_msg, ...@@ -543,7 +543,7 @@ static int xcrb_msg_to_type6_ep11cprb_msgx(struct ap_message *ap_msg,
msg->hdr.FromCardLen1 = xcRB->resp_len; msg->hdr.FromCardLen1 = xcRB->resp_len;
/* Import CPRB data from the ioctl input parameter */ /* Import CPRB data from the ioctl input parameter */
if (copy_from_user(&(msg->cprbx.cprb_len), if (z_copy_from_user(userspace, &(msg->cprbx.cprb_len),
(char __force __user *)xcRB->req, xcRB->req_len)) { (char __force __user *)xcRB->req, xcRB->req_len)) {
return -EFAULT; return -EFAULT;
} }
...@@ -707,7 +707,7 @@ static int convert_type86_ica(struct zcrypt_queue *zq, ...@@ -707,7 +707,7 @@ static int convert_type86_ica(struct zcrypt_queue *zq,
* *
* Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error. * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
*/ */
static int convert_type86_xcrb(struct zcrypt_queue *zq, static int convert_type86_xcrb(bool userspace, struct zcrypt_queue *zq,
struct ap_message *reply, struct ap_message *reply,
struct ica_xcRB *xcRB) struct ica_xcRB *xcRB)
{ {
...@@ -715,14 +715,14 @@ static int convert_type86_xcrb(struct zcrypt_queue *zq, ...@@ -715,14 +715,14 @@ static int convert_type86_xcrb(struct zcrypt_queue *zq,
char *data = reply->msg; char *data = reply->msg;
/* Copy CPRB to user */ /* Copy CPRB to user */
if (copy_to_user(xcRB->reply_control_blk_addr, if (z_copy_to_user(userspace, xcRB->reply_control_blk_addr,
data + msg->fmt2.offset1, msg->fmt2.count1)) data + msg->fmt2.offset1, msg->fmt2.count1))
return -EFAULT; return -EFAULT;
xcRB->reply_control_blk_length = msg->fmt2.count1; xcRB->reply_control_blk_length = msg->fmt2.count1;
/* Copy data buffer to user */ /* Copy data buffer to user */
if (msg->fmt2.count2) if (msg->fmt2.count2)
if (copy_to_user(xcRB->reply_data_addr, if (z_copy_to_user(userspace, xcRB->reply_data_addr,
data + msg->fmt2.offset2, msg->fmt2.count2)) data + msg->fmt2.offset2, msg->fmt2.count2))
return -EFAULT; return -EFAULT;
xcRB->reply_data_length = msg->fmt2.count2; xcRB->reply_data_length = msg->fmt2.count2;
...@@ -738,7 +738,7 @@ static int convert_type86_xcrb(struct zcrypt_queue *zq, ...@@ -738,7 +738,7 @@ static int convert_type86_xcrb(struct zcrypt_queue *zq,
* *
* Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error. * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
*/ */
static int convert_type86_ep11_xcrb(struct zcrypt_queue *zq, static int convert_type86_ep11_xcrb(bool userspace, struct zcrypt_queue *zq,
struct ap_message *reply, struct ap_message *reply,
struct ep11_urb *xcRB) struct ep11_urb *xcRB)
{ {
...@@ -749,7 +749,7 @@ static int convert_type86_ep11_xcrb(struct zcrypt_queue *zq, ...@@ -749,7 +749,7 @@ static int convert_type86_ep11_xcrb(struct zcrypt_queue *zq,
return -EINVAL; return -EINVAL;
/* Copy response CPRB to user */ /* Copy response CPRB to user */
if (copy_to_user((char __force __user *)xcRB->resp, if (z_copy_to_user(userspace, (char __force __user *)xcRB->resp,
data + msg->fmt2.offset1, msg->fmt2.count1)) data + msg->fmt2.offset1, msg->fmt2.count1))
return -EFAULT; return -EFAULT;
xcRB->resp_len = msg->fmt2.count1; xcRB->resp_len = msg->fmt2.count1;
...@@ -814,7 +814,7 @@ static int convert_response_ica(struct zcrypt_queue *zq, ...@@ -814,7 +814,7 @@ static int convert_response_ica(struct zcrypt_queue *zq,
} }
} }
static int convert_response_xcrb(struct zcrypt_queue *zq, static int convert_response_xcrb(bool userspace, struct zcrypt_queue *zq,
struct ap_message *reply, struct ap_message *reply,
struct ica_xcRB *xcRB) struct ica_xcRB *xcRB)
{ {
...@@ -831,7 +831,7 @@ static int convert_response_xcrb(struct zcrypt_queue *zq, ...@@ -831,7 +831,7 @@ static int convert_response_xcrb(struct zcrypt_queue *zq,
return convert_error(zq, reply); return convert_error(zq, reply);
} }
if (msg->cprbx.cprb_ver_id == 0x02) if (msg->cprbx.cprb_ver_id == 0x02)
return convert_type86_xcrb(zq, reply, xcRB); return convert_type86_xcrb(userspace, zq, reply, xcRB);
fallthrough; /* wrong cprb version is an unknown response */ fallthrough; /* wrong cprb version is an unknown response */
default: /* Unknown response type, this should NEVER EVER happen */ default: /* Unknown response type, this should NEVER EVER happen */
xcRB->status = 0x0008044DL; /* HDD_InvalidParm */ xcRB->status = 0x0008044DL; /* HDD_InvalidParm */
...@@ -848,7 +848,7 @@ static int convert_response_xcrb(struct zcrypt_queue *zq, ...@@ -848,7 +848,7 @@ static int convert_response_xcrb(struct zcrypt_queue *zq,
} }
} }
static int convert_response_ep11_xcrb(struct zcrypt_queue *zq, static int convert_response_ep11_xcrb(bool userspace, struct zcrypt_queue *zq,
struct ap_message *reply, struct ep11_urb *xcRB) struct ap_message *reply, struct ep11_urb *xcRB)
{ {
struct type86_ep11_reply *msg = reply->msg; struct type86_ep11_reply *msg = reply->msg;
...@@ -861,7 +861,7 @@ static int convert_response_ep11_xcrb(struct zcrypt_queue *zq, ...@@ -861,7 +861,7 @@ static int convert_response_ep11_xcrb(struct zcrypt_queue *zq,
if (msg->hdr.reply_code) if (msg->hdr.reply_code)
return convert_error(zq, reply); return convert_error(zq, reply);
if (msg->cprbx.cprb_ver_id == 0x04) if (msg->cprbx.cprb_ver_id == 0x04)
return convert_type86_ep11_xcrb(zq, reply, xcRB); return convert_type86_ep11_xcrb(userspace, zq, reply, xcRB);
fallthrough; /* wrong cprb version is an unknown resp */ fallthrough; /* wrong cprb version is an unknown resp */
default: /* Unknown response type, this should NEVER EVER happen */ default: /* Unknown response type, this should NEVER EVER happen */
zq->online = 0; zq->online = 0;
...@@ -1095,7 +1095,7 @@ static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq, ...@@ -1095,7 +1095,7 @@ static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq,
* by the caller with ap_init_message(). Also the caller has to * by the caller with ap_init_message(). Also the caller has to
* make sure ap_release_message() is always called even on failure. * make sure ap_release_message() is always called even on failure.
*/ */
unsigned int get_cprb_fc(struct ica_xcRB *xcRB, unsigned int get_cprb_fc(bool userspace, struct ica_xcRB *xcRB,
struct ap_message *ap_msg, struct ap_message *ap_msg,
unsigned int *func_code, unsigned short **dom) unsigned int *func_code, unsigned short **dom)
{ {
...@@ -1112,7 +1112,7 @@ unsigned int get_cprb_fc(struct ica_xcRB *xcRB, ...@@ -1112,7 +1112,7 @@ unsigned int get_cprb_fc(struct ica_xcRB *xcRB,
ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL); ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
if (!ap_msg->private) if (!ap_msg->private)
return -ENOMEM; return -ENOMEM;
return XCRB_msg_to_type6CPRB_msgX(ap_msg, xcRB, func_code, dom); return XCRB_msg_to_type6CPRB_msgX(userspace, ap_msg, xcRB, func_code, dom);
} }
/** /**
...@@ -1122,7 +1122,7 @@ unsigned int get_cprb_fc(struct ica_xcRB *xcRB, ...@@ -1122,7 +1122,7 @@ unsigned int get_cprb_fc(struct ica_xcRB *xcRB,
* CEXxC device to the request distributor * CEXxC device to the request distributor
* @xcRB: pointer to the send_cprb request buffer * @xcRB: pointer to the send_cprb request buffer
*/ */
static long zcrypt_msgtype6_send_cprb(struct zcrypt_queue *zq, static long zcrypt_msgtype6_send_cprb(bool userspace, struct zcrypt_queue *zq,
struct ica_xcRB *xcRB, struct ica_xcRB *xcRB,
struct ap_message *ap_msg) struct ap_message *ap_msg)
{ {
...@@ -1135,7 +1135,7 @@ static long zcrypt_msgtype6_send_cprb(struct zcrypt_queue *zq, ...@@ -1135,7 +1135,7 @@ static long zcrypt_msgtype6_send_cprb(struct zcrypt_queue *zq,
if (rc == 0) { if (rc == 0) {
rc = ap_msg->rc; rc = ap_msg->rc;
if (rc == 0) if (rc == 0)
rc = convert_response_xcrb(zq, ap_msg, xcRB); rc = convert_response_xcrb(userspace, zq, ap_msg, xcRB);
} else } else
/* Signal pending. */ /* Signal pending. */
ap_cancel_message(zq->queue, ap_msg); ap_cancel_message(zq->queue, ap_msg);
...@@ -1150,7 +1150,7 @@ static long zcrypt_msgtype6_send_cprb(struct zcrypt_queue *zq, ...@@ -1150,7 +1150,7 @@ static long zcrypt_msgtype6_send_cprb(struct zcrypt_queue *zq,
* by the caller with ap_init_message(). Also the caller has to * by the caller with ap_init_message(). Also the caller has to
* make sure ap_release_message() is always called even on failure. * make sure ap_release_message() is always called even on failure.
*/ */
unsigned int get_ep11cprb_fc(struct ep11_urb *xcrb, unsigned int get_ep11cprb_fc(bool userspace, struct ep11_urb *xcrb,
struct ap_message *ap_msg, struct ap_message *ap_msg,
unsigned int *func_code) unsigned int *func_code)
{ {
...@@ -1167,7 +1167,7 @@ unsigned int get_ep11cprb_fc(struct ep11_urb *xcrb, ...@@ -1167,7 +1167,7 @@ unsigned int get_ep11cprb_fc(struct ep11_urb *xcrb,
ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL); ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
if (!ap_msg->private) if (!ap_msg->private)
return -ENOMEM; return -ENOMEM;
return xcrb_msg_to_type6_ep11cprb_msgx(ap_msg, xcrb, func_code); return xcrb_msg_to_type6_ep11cprb_msgx(userspace, ap_msg, xcrb, func_code);
} }
/** /**
...@@ -1177,7 +1177,7 @@ unsigned int get_ep11cprb_fc(struct ep11_urb *xcrb, ...@@ -1177,7 +1177,7 @@ unsigned int get_ep11cprb_fc(struct ep11_urb *xcrb,
* CEX4P device to the request distributor * CEX4P device to the request distributor
* @xcRB: pointer to the ep11 user request block * @xcRB: pointer to the ep11 user request block
*/ */
static long zcrypt_msgtype6_send_ep11_cprb(struct zcrypt_queue *zq, static long zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *zq,
struct ep11_urb *xcrb, struct ep11_urb *xcrb,
struct ap_message *ap_msg) struct ap_message *ap_msg)
{ {
...@@ -1237,7 +1237,7 @@ static long zcrypt_msgtype6_send_ep11_cprb(struct zcrypt_queue *zq, ...@@ -1237,7 +1237,7 @@ static long zcrypt_msgtype6_send_ep11_cprb(struct zcrypt_queue *zq,
if (rc == 0) { if (rc == 0) {
rc = ap_msg->rc; rc = ap_msg->rc;
if (rc == 0) if (rc == 0)
rc = convert_response_ep11_xcrb(zq, ap_msg, xcrb); rc = convert_response_ep11_xcrb(userspace, zq, ap_msg, xcrb);
} else } else
/* Signal pending. */ /* Signal pending. */
ap_cancel_message(zq->queue, ap_msg); ap_cancel_message(zq->queue, ap_msg);
......
...@@ -96,9 +96,9 @@ struct type86_fmt2_ext { ...@@ -96,9 +96,9 @@ struct type86_fmt2_ext {
unsigned int offset4; /* 0x00000000 */ unsigned int offset4; /* 0x00000000 */
} __packed; } __packed;
unsigned int get_cprb_fc(struct ica_xcRB *, struct ap_message *, unsigned int get_cprb_fc(bool userspace, struct ica_xcRB *, struct ap_message *,
unsigned int *, unsigned short **); unsigned int *, unsigned short **);
unsigned int get_ep11cprb_fc(struct ep11_urb *, struct ap_message *, unsigned int get_ep11cprb_fc(bool userspace, struct ep11_urb *, struct ap_message *,
unsigned int *); unsigned int *);
unsigned int get_rng_fc(struct ap_message *, int *, unsigned int *); unsigned int get_rng_fc(struct ap_message *, int *, unsigned int *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment