1
0
Fork 0

s390/zcrypt: ep11 structs rework, export zcrypt_send_ep11_cprb

Minor rework for struct ep11_cprb and struct ep11_urb. Use of u8, u16,
u32 instead of unsigned char. Declare pointers to mem from userspace
with __user to give sparse a chance to check.

Export zcrypt_send_ep11_cprb() function as this function will be
called by code in progress which will build ep11 cprbs within the
zcrypt device driver zoo and send them to EP11 crypto cards.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
alistair/sensors
Harald Freudenberger 2019-08-30 15:57:17 +02:00 committed by Vasily Gorbik
parent 8f291ebf32
commit a7367997ab
3 changed files with 25 additions and 18 deletions

View File

@ -161,17 +161,17 @@ struct ica_xcRB {
* @payload_len: Payload length * @payload_len: Payload length
*/ */
struct ep11_cprb { struct ep11_cprb {
__u16 cprb_len; __u16 cprb_len;
unsigned char cprb_ver_id; __u8 cprb_ver_id;
unsigned char pad_000[2]; __u8 pad_000[2];
unsigned char flags; __u8 flags;
unsigned char func_id[2]; __u8 func_id[2];
__u32 source_id; __u32 source_id;
__u32 target_id; __u32 target_id;
__u32 ret_code; __u32 ret_code;
__u32 reserved1; __u32 reserved1;
__u32 reserved2; __u32 reserved2;
__u32 payload_len; __u32 payload_len;
} __attribute__((packed)); } __attribute__((packed));
/** /**
@ -197,13 +197,13 @@ struct ep11_target_dev {
*/ */
struct ep11_urb { struct ep11_urb {
__u16 targets_num; __u16 targets_num;
__u64 targets; __u8 __user *targets;
__u64 weight; __u64 weight;
__u64 req_no; __u64 req_no;
__u64 req_len; __u64 req_len;
__u64 req; __u8 __user *req;
__u64 resp_len; __u64 resp_len;
__u64 resp; __u8 __user *resp;
} __attribute__((packed)); } __attribute__((packed));
/** /**

View File

@ -923,8 +923,8 @@ 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(struct ap_perms *perms,
struct ep11_urb *xcrb) struct ep11_urb *xcrb)
{ {
struct zcrypt_card *zc, *pref_zc; struct zcrypt_card *zc, *pref_zc;
struct zcrypt_queue *zq, *pref_zq; struct zcrypt_queue *zq, *pref_zq;
@ -1029,6 +1029,12 @@ out:
return rc; return rc;
} }
long zcrypt_send_ep11_cprb(struct ep11_urb *xcrb)
{
return _zcrypt_send_ep11_cprb(&ap_perms, xcrb);
}
EXPORT_SYMBOL(zcrypt_send_ep11_cprb);
static long zcrypt_rng(char *buffer) static long zcrypt_rng(char *buffer)
{ {
struct zcrypt_card *zc, *pref_zc; struct zcrypt_card *zc, *pref_zc;
@ -1369,12 +1375,12 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
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(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(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);

View File

@ -140,6 +140,7 @@ struct zcrypt_ops *zcrypt_msgtype(unsigned char *, int);
int zcrypt_api_init(void); int zcrypt_api_init(void);
void zcrypt_api_exit(void); void zcrypt_api_exit(void);
long zcrypt_send_cprb(struct ica_xcRB *xcRB); long zcrypt_send_cprb(struct ica_xcRB *xcRB);
long zcrypt_send_ep11_cprb(struct ep11_urb *urb);
void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus); 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);