1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) 2024 Huawei Device Co., Ltd. 4 */ 5 6#include <linux/cdev.h> 7#include <linux/errno.h> 8#include <linux/miscdevice.h> 9#include <linux/module.h> 10#include <linux/slab.h> 11#include <linux/uaccess.h> 12 13#include "dec_misc.h" 14 15static int vfs_deal_policy_cmd(unsigned int cmd, void __user *arg) 16{ 17 pr_info("vfs dec deal policy cmd:%u\n", cmd); 18 int ret = 0; 19 struct dec_policy_info info = { 0 }; 20 21 ret = copy_from_user(&info, arg, sizeof(info)); 22 if (ret != 0) { 23 pr_err("copy from user failed\n"); 24 return -EFAULT; 25 } 26 27 pr_info("tokenid:%lu path_num:%u persist_flag:%d\n", info.tokenid, info.path_num, info.persist_flag); 28 29 return ret; 30} 31 32static int vfs_destroy_dec_policy(void __user *arg) 33{ 34 int ret = 0; 35 uint64_t tokenid; 36 37 ret = copy_from_user(&tokenid, arg, sizeof(tokenid)); 38 if (ret != 0) { 39 pr_err("destroy dec policy copy from caller failed\n"); 40 return -EFAULT; 41 } 42 43 pr_info("destroy dec policy tokenid:%ld\n", tokenid); 44 return 0; 45} 46 47static long dec_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 48{ 49 pr_info("dec ioctl cmd:%u\n", cmd); 50 int ret = 0; 51 52 switch (cmd) { 53 case SET_DEC_POLICY_CMD: 54 case DEL_DEC_POLICY_CMD: 55 case QUERY_DEC_POLICY_CMD: 56 case CHECK_DEC_POLICY_CMD: 57 case CONSTRAINT_DEC_POLICY_CMD: 58 case DENY_DEC_POLICY_CMD: 59 ret = vfs_deal_policy_cmd(cmd, (void __user *)arg); 60 break; 61 case DESTROY_DEC_POLICY_CMD: 62 ret = vfs_destroy_dec_policy((void __user *)arg); 63 break; 64 default: 65 ret = -EINVAL; 66 break; 67 } 68 69 return 0; 70} 71 72static int dec_open(struct inode *inode, struct file *filp) 73{ 74 pr_info("dec open\n"); 75 return 0; 76} 77 78static int dec_release(struct inode *inode, struct file *filp) 79{ 80 pr_info("dec close\n"); 81 return 0; 82} 83 84static const struct file_operations dec_fops = { 85 .owner = THIS_MODULE, 86 .open = dec_open, 87 .release = dec_release, 88 .unlocked_ioctl = dec_ioctl, 89 .compat_ioctl = dec_ioctl, 90}; 91 92static struct miscdevice dec_misc = { 93 .minor = MISC_DYNAMIC_MINOR, 94 .name = "dec", 95 .fops = &dec_fops, 96}; 97 98static int __init dec_init(void) 99{ 100 int err = 0; 101 102 err = misc_register(&dec_misc); 103 if (err < 0) { 104 pr_err("dec device init failed\n"); 105 return err; 106 } 107 108 pr_err("dec device init success\n"); 109 return 0; 110} 111 112static void __exit dec_exit(void) 113{ 114 misc_deregister(&dec_misc); 115 pr_info("dec exited"); 116} 117 118/* module entry points */ 119module_init(dec_init); 120module_exit(dec_exit); 121 122MODULE_LICENSE("GPL"); 123