|
@@ -385,8 +385,8 @@ static int z90crypt_release(struct inode *, struct file *);
|
|
|
static ssize_t z90crypt_read(struct file *, char __user *, size_t, loff_t *);
|
|
|
static ssize_t z90crypt_write(struct file *, const char __user *,
|
|
|
size_t, loff_t *);
|
|
|
-static int z90crypt_ioctl(struct inode *, struct file *,
|
|
|
- unsigned int, unsigned long);
|
|
|
+static long z90crypt_unlocked_ioctl(struct file *, unsigned int, unsigned long);
|
|
|
+static long z90crypt_compat_ioctl(struct file *, unsigned int, unsigned long);
|
|
|
|
|
|
static void z90crypt_reader_task(unsigned long);
|
|
|
static void z90crypt_schedule_reader_task(unsigned long);
|
|
@@ -433,12 +433,15 @@ static atomic_t total_open;
|
|
|
static atomic_t z90crypt_step;
|
|
|
|
|
|
static struct file_operations z90crypt_fops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .read = z90crypt_read,
|
|
|
- .write = z90crypt_write,
|
|
|
- .ioctl = z90crypt_ioctl,
|
|
|
- .open = z90crypt_open,
|
|
|
- .release = z90crypt_release
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .read = z90crypt_read,
|
|
|
+ .write = z90crypt_write,
|
|
|
+ .unlocked_ioctl = z90crypt_unlocked_ioctl,
|
|
|
+#ifdef CONFIG_COMPAT
|
|
|
+ .compat_ioctl = z90crypt_compat_ioctl,
|
|
|
+#endif
|
|
|
+ .open = z90crypt_open,
|
|
|
+ .release = z90crypt_release
|
|
|
};
|
|
|
|
|
|
#ifndef Z90CRYPT_USE_HOTPLUG
|
|
@@ -474,14 +477,13 @@ struct ica_rsa_modexpo_32 { // For 32-bit callers
|
|
|
compat_uptr_t n_modulus;
|
|
|
};
|
|
|
|
|
|
-static int
|
|
|
-trans_modexpo32(unsigned int fd, unsigned int cmd, unsigned long arg,
|
|
|
- struct file *file)
|
|
|
+static long
|
|
|
+trans_modexpo32(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct ica_rsa_modexpo_32 __user *mex32u = compat_ptr(arg);
|
|
|
struct ica_rsa_modexpo_32 mex32k;
|
|
|
struct ica_rsa_modexpo __user *mex64;
|
|
|
- int ret = 0;
|
|
|
+ long ret = 0;
|
|
|
unsigned int i;
|
|
|
|
|
|
if (!access_ok(VERIFY_WRITE, mex32u, sizeof(struct ica_rsa_modexpo_32)))
|
|
@@ -498,7 +500,7 @@ trans_modexpo32(unsigned int fd, unsigned int cmd, unsigned long arg,
|
|
|
__put_user(compat_ptr(mex32k.b_key), &mex64->b_key) ||
|
|
|
__put_user(compat_ptr(mex32k.n_modulus), &mex64->n_modulus))
|
|
|
return -EFAULT;
|
|
|
- ret = sys_ioctl(fd, cmd, (unsigned long)mex64);
|
|
|
+ ret = z90crypt_unlocked_ioctl(filp, cmd, (unsigned long)mex64);
|
|
|
if (!ret)
|
|
|
if (__get_user(i, &mex64->outputdatalength) ||
|
|
|
__put_user(i, &mex32u->outputdatalength))
|
|
@@ -518,14 +520,13 @@ struct ica_rsa_modexpo_crt_32 { // For 32-bit callers
|
|
|
compat_uptr_t u_mult_inv;
|
|
|
};
|
|
|
|
|
|
-static int
|
|
|
-trans_modexpo_crt32(unsigned int fd, unsigned int cmd, unsigned long arg,
|
|
|
- struct file *file)
|
|
|
+static long
|
|
|
+trans_modexpo_crt32(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct ica_rsa_modexpo_crt_32 __user *crt32u = compat_ptr(arg);
|
|
|
struct ica_rsa_modexpo_crt_32 crt32k;
|
|
|
struct ica_rsa_modexpo_crt __user *crt64;
|
|
|
- int ret = 0;
|
|
|
+ long ret = 0;
|
|
|
unsigned int i;
|
|
|
|
|
|
if (!access_ok(VERIFY_WRITE, crt32u,
|
|
@@ -546,9 +547,8 @@ trans_modexpo_crt32(unsigned int fd, unsigned int cmd, unsigned long arg,
|
|
|
__put_user(compat_ptr(crt32k.np_prime), &crt64->np_prime) ||
|
|
|
__put_user(compat_ptr(crt32k.nq_prime), &crt64->nq_prime) ||
|
|
|
__put_user(compat_ptr(crt32k.u_mult_inv), &crt64->u_mult_inv))
|
|
|
- ret = -EFAULT;
|
|
|
- if (!ret)
|
|
|
- ret = sys_ioctl(fd, cmd, (unsigned long)crt64);
|
|
|
+ return -EFAULT;
|
|
|
+ ret = z90crypt_unlocked_ioctl(filp, cmd, (unsigned long)crt64);
|
|
|
if (!ret)
|
|
|
if (__get_user(i, &crt64->outputdatalength) ||
|
|
|
__put_user(i, &crt32u->outputdatalength))
|
|
@@ -556,66 +556,34 @@ trans_modexpo_crt32(unsigned int fd, unsigned int cmd, unsigned long arg,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int compatible_ioctls[] = {
|
|
|
- ICAZ90STATUS, Z90QUIESCE, Z90STAT_TOTALCOUNT, Z90STAT_PCICACOUNT,
|
|
|
- Z90STAT_PCICCCOUNT, Z90STAT_PCIXCCCOUNT, Z90STAT_PCIXCCMCL2COUNT,
|
|
|
- Z90STAT_PCIXCCMCL3COUNT, Z90STAT_CEX2CCOUNT, Z90STAT_REQUESTQ_COUNT,
|
|
|
- Z90STAT_PENDINGQ_COUNT, Z90STAT_TOTALOPEN_COUNT, Z90STAT_DOMAIN_INDEX,
|
|
|
- Z90STAT_STATUS_MASK, Z90STAT_QDEPTH_MASK, Z90STAT_PERDEV_REQCNT,
|
|
|
-};
|
|
|
-
|
|
|
-static void z90_unregister_ioctl32s(void)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- unregister_ioctl32_conversion(ICARSAMODEXPO);
|
|
|
- unregister_ioctl32_conversion(ICARSACRT);
|
|
|
-
|
|
|
- for(i = 0; i < ARRAY_SIZE(compatible_ioctls); i++)
|
|
|
- unregister_ioctl32_conversion(compatible_ioctls[i]);
|
|
|
-}
|
|
|
-
|
|
|
-static int z90_register_ioctl32s(void)
|
|
|
-{
|
|
|
- int result, i;
|
|
|
-
|
|
|
- result = register_ioctl32_conversion(ICARSAMODEXPO, trans_modexpo32);
|
|
|
- if (result == -EBUSY) {
|
|
|
- unregister_ioctl32_conversion(ICARSAMODEXPO);
|
|
|
- result = register_ioctl32_conversion(ICARSAMODEXPO,
|
|
|
- trans_modexpo32);
|
|
|
- }
|
|
|
- if (result)
|
|
|
- return result;
|
|
|
- result = register_ioctl32_conversion(ICARSACRT, trans_modexpo_crt32);
|
|
|
- if (result == -EBUSY) {
|
|
|
- unregister_ioctl32_conversion(ICARSACRT);
|
|
|
- result = register_ioctl32_conversion(ICARSACRT,
|
|
|
- trans_modexpo_crt32);
|
|
|
- }
|
|
|
- if (result)
|
|
|
- return result;
|
|
|
-
|
|
|
- for(i = 0; i < ARRAY_SIZE(compatible_ioctls); i++) {
|
|
|
- result = register_ioctl32_conversion(compatible_ioctls[i], 0);
|
|
|
- if (result == -EBUSY) {
|
|
|
- unregister_ioctl32_conversion(compatible_ioctls[i]);
|
|
|
- result = register_ioctl32_conversion(
|
|
|
- compatible_ioctls[i], 0);
|
|
|
- }
|
|
|
- if (result)
|
|
|
- return result;
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#else // !CONFIG_COMPAT
|
|
|
-static inline void z90_unregister_ioctl32s(void)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static inline int z90_register_ioctl32s(void)
|
|
|
+static long
|
|
|
+z90crypt_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ switch (cmd) {
|
|
|
+ case ICAZ90STATUS:
|
|
|
+ case Z90QUIESCE:
|
|
|
+ case Z90STAT_TOTALCOUNT:
|
|
|
+ case Z90STAT_PCICACOUNT:
|
|
|
+ case Z90STAT_PCICCCOUNT:
|
|
|
+ case Z90STAT_PCIXCCCOUNT:
|
|
|
+ case Z90STAT_PCIXCCMCL2COUNT:
|
|
|
+ case Z90STAT_PCIXCCMCL3COUNT:
|
|
|
+ case Z90STAT_CEX2CCOUNT:
|
|
|
+ case Z90STAT_REQUESTQ_COUNT:
|
|
|
+ case Z90STAT_PENDINGQ_COUNT:
|
|
|
+ case Z90STAT_TOTALOPEN_COUNT:
|
|
|
+ case Z90STAT_DOMAIN_INDEX:
|
|
|
+ case Z90STAT_STATUS_MASK:
|
|
|
+ case Z90STAT_QDEPTH_MASK:
|
|
|
+ case Z90STAT_PERDEV_REQCNT:
|
|
|
+ return z90crypt_unlocked_ioctl(filp, cmd, arg);
|
|
|
+ case ICARSAMODEXPO:
|
|
|
+ return trans_modexpo32(filp, cmd, arg);
|
|
|
+ case ICARSACRT:
|
|
|
+ return trans_modexpo_crt32(filp, cmd, arg);
|
|
|
+ default:
|
|
|
+ return -ENOIOCTLCMD;
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -730,14 +698,9 @@ z90crypt_init_module(void)
|
|
|
reader_timer.expires = jiffies + (READERTIME * HZ / 1000);
|
|
|
add_timer(&reader_timer);
|
|
|
|
|
|
- if ((result = z90_register_ioctl32s()))
|
|
|
- goto init_module_cleanup;
|
|
|
-
|
|
|
return 0; // success
|
|
|
|
|
|
init_module_cleanup:
|
|
|
- z90_unregister_ioctl32s();
|
|
|
-
|
|
|
#ifndef Z90CRYPT_USE_HOTPLUG
|
|
|
if ((nresult = misc_deregister(&z90crypt_misc_device)))
|
|
|
PRINTK("misc_deregister failed with %d.\n", nresult);
|
|
@@ -763,8 +726,6 @@ z90crypt_cleanup_module(void)
|
|
|
|
|
|
PDEBUG("PID %d\n", PID());
|
|
|
|
|
|
- z90_unregister_ioctl32s();
|
|
|
-
|
|
|
remove_proc_entry("driver/z90crypt", 0);
|
|
|
|
|
|
#ifndef Z90CRYPT_USE_HOTPLUG
|
|
@@ -800,7 +761,7 @@ z90crypt_cleanup_module(void)
|
|
|
* z90crypt_release
|
|
|
* z90crypt_read
|
|
|
* z90crypt_write
|
|
|
- * z90crypt_ioctl
|
|
|
+ * z90crypt_unlocked_ioctl
|
|
|
* z90crypt_status
|
|
|
* z90crypt_status_write
|
|
|
* disable_card
|
|
@@ -1804,9 +1765,8 @@ z90crypt_rsa(struct priv_data *private_data_p, pid_t pid,
|
|
|
* This function is a little long, but it's really just one large switch
|
|
|
* statement.
|
|
|
*/
|
|
|
-static int
|
|
|
-z90crypt_ioctl(struct inode *inode, struct file *filp,
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
+static long
|
|
|
+z90crypt_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct priv_data *private_data_p = filp->private_data;
|
|
|
unsigned char *status;
|