static int simlock_ioctl(struct inode *inode, struct file *file, unsigned int command, unsigned long arg) { struct msg_s *msg_p = (struct msg_s *)arg; int size, ret; unsigned int unlock; switch (command) { case SIMLOCK_GET_SET_CMD: if (copy_from_user(&size, (void __user *)&msg_p->size, sizeof(int))) { printk(KERN_ERR "simlock_ioctl: copy_from_user error\n"); return -EFAULT; } if (size > CODE_SIZE) { printk(KERN_ERR "simlock_ioctl: size error\n"); return -EFAULT; } if (size > 0) { if (copy_from_user(&unlock, (void __user *)&msg_p->unlock, sizeof(unsigned int))) { printk(KERN_ERR "simlock_ioctl: copy_from_user error\n"); return -EFAULT; } if (copy_from_user(code, (void __user *)&msg_p->code, size)) { printk(KERN_ERR "simlock_ioctl: copy_from_user error\n"); return -EFAULT; } ret = secure_simlock_unlock(unlock, code); } else { ret = secure_read_simlock_mask(); } if (copy_to_user(&msg_p->size, &ret, sizeof(int))) { printk(KERN_ERR "simlock_ioctl: copy_to_user error\n"); return -EFAULT; } break; case SIMLOCK_GET_SECURITY_LEVEL: ret = secure_get_security_level(); if (copy_to_user(&msg_p->size, &ret, sizeof(int))) { printk(KERN_ERR "simlock_ioctl: copy_to_user error\n"); return -EFAULT; } break; default: printk(KERN_ERR "simlock_ioctl: command error\n"); return -EFAULT; } return ret; }
static int __init simlock_init(void) { int ret; ret = register_chrdev(0, DEVICE_NAME, &simlock_fops); if (ret < 0) { printk(KERN_ERR "simlock_init : register module fail\n"); return ret; } simlock_major = ret; simlock_class = class_create(THIS_MODULE, "simlock"); device_create(simlock_class, NULL, MKDEV(simlock_major , 0), NULL, DEVICE_NAME); printk(KERN_INFO "simlock_init: register module ok\n"); secure_read_simlock_mask(); return 0; }