1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (c) 2023 Huawei Device Co., Ltd. 4 */ 5#include <linux/fs.h> 6#include <linux/miscdevice.h> 7#include <linux/module.h> 8#include <linux/uaccess.h> 9 10#ifdef CONFIG_COMPAT 11#include <linux/compat.h> 12#endif // CONFIG_COMPAT 13 14#include "ucollection_process_cpu.h" 15 16static long (*unified_collection_ioctl_cb[])(unsigned int cmd, void __user *argp) = { 17 unified_collection_collect_process_cpu /* IOCTRL_COLLECT_CPU */ 18}; 19 20static long unified_collection_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 21{ 22 void __user *argp = u64_to_user_ptr(arg); 23 const char *comm = NULL; 24 25 if ((_IOC_TYPE(cmd) >= ARRAY_SIZE(unified_collection_ioctl_cb)) || 26 (unified_collection_ioctl_cb[_IOC_TYPE(cmd)] == NULL)) { 27 pr_err("invalid ioctrl cmd %u, _IOC_TYPE(cmd)=%d", cmd, _IOC_TYPE(cmd)); 28 return -EINVAL; 29 } 30 31 return unified_collection_ioctl_cb[_IOC_TYPE(cmd)](cmd, argp); 32} 33 34#ifdef CONFIG_COMPAT 35static long unified_collection_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 36{ 37 return unified_collection_ioctl(filp, cmd, (unsigned long) compat_ptr(arg)); 38} 39#endif // CONFIG_COMPAT 40 41static int unified_collection_open(struct inode *inode, struct file *filp) 42{ 43 return 0; 44} 45 46static int unified_collection_release(struct inode *inode, struct file *filp) 47{ 48 return 0; 49} 50 51static const struct file_operations unified_collection_device_fops = { 52 .owner = THIS_MODULE, 53 .unlocked_ioctl = unified_collection_ioctl, 54#ifdef CONFIG_COMPAT 55 .compat_ioctl = unified_collection_compat_ioctl, 56#endif // CONFIG_COMPAT 57 .open = unified_collection_open, 58 .release = unified_collection_release, 59}; 60 61static struct miscdevice unified_collection_device = { 62 .name = "ucollection", 63 .fops = &unified_collection_device_fops, 64 .minor = MISC_DYNAMIC_MINOR, 65}; 66 67static int __init unified_collection_init(void) 68{ 69 int ret = misc_register(&unified_collection_device); 70 if (ret) { 71 pr_err("failed to register unified collection device"); 72 return ret; 73 } 74 75 pr_info("register unified collection device successful"); 76 return 0; 77} 78 79static void __exit unified_collection_exit(void) 80{ 81 pr_info("deregister unified collection device successful"); 82 misc_deregister(&unified_collection_device); 83} 84 85module_init(unified_collection_init); 86module_exit(unified_collection_exit); 87 88MODULE_AUTHOR("OHOS"); 89MODULE_DESCRIPTION("Unified Collection Driver"); 90MODULE_LICENSE("GPL");