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;
}