This commit is contained in:
zy
2023-11-23 04:45:35 -05:00
parent 173d054423
commit 316174b71e
9 changed files with 314 additions and 116 deletions

View File

@@ -42,31 +42,35 @@ static int device_release(struct inode *inode, struct file *file) {
return 0;
}
typedef struct {
int pid;
} ioctl_pid;
static long device_ioctl(struct file *file, unsigned int ioctl_num,
unsigned long ioctl_param) {
int ret = 0;
watch_arg warg;
// watch_arg warg;
ioctl_dump_param dump_param;
int wpid;
ioctl_pid wpid;
printk(KERN_INFO "variable_monitor fun: %s with ioctl_num %d\n", __FUNCTION__,
ioctl_num);
switch (ioctl_num) {
case 0:
// copy watch_arg
if (copy_from_user(&warg, (watch_arg *)ioctl_param, sizeof(warg))) {
return -EACCES;
}
printk(KERN_INFO
"Watch_arg: task_id=%d, name=%s, ptr=%p, length_byte=%d, "
"time_ns=%ld, threshold=%lld\n",
warg.task_id, warg.name, warg.ptr, warg.length_byte, warg.time_ns,
warg.threshold);
// start watch variable
start_watch_variable(warg);
break;
// case 0:
// // copy watch_arg
// if (copy_from_user(&warg, (watch_arg *)ioctl_param, sizeof(warg))) {
// return -EACCES;
// }
// printk(KERN_INFO
// "Watch_arg: task_id=%d, name=%s, ptr=%p, length_byte=%d, "
// "time_ns=%ld, threshold=%lld\n",
// warg.task_id, warg.name, warg.ptr, warg.length_byte, warg.time_ns,
// warg.threshold);
// // start watch variable
// start_watch_variable(warg);
// break;
case 1:
printk(KERN_INFO "variable_monitor 1\n");
ret = copy_from_user(&dump_param, (ioctl_dump_param *)ioctl_param,
@@ -82,13 +86,16 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num,
}
printk(KERN_INFO "copy_to_user \n");
break;
case 2:
case 0:
printk(KERN_INFO "variable_monitor test 2\n");
ret = copy_from_user(&wpid, (int *)ioctl_param, sizeof(int));
diag_test(wpid);
ret = copy_from_user(&wpid, (ioctl_pid *)ioctl_param, sizeof(ioctl_pid));
diag_test(wpid.pid);
/* code */
break;
default:
printk(KERN_INFO "variable_monitor test default\n");
ret = copy_from_user(&wpid, (ioctl_pid *)ioctl_param, sizeof(ioctl_pid));
diag_test(wpid.pid);
break;
}
return 0;
@@ -107,21 +114,6 @@ int init_module(void) {
return -1;
}
if ((watch_cdev = cdev_alloc()) == NULL) {
printk(KERN_ALERT "Failed to allocate cdev structure\n");
unregister_chrdev_region(dev_num, 1);
return -1;
}
cdev_init(watch_cdev, &fops);
if (cdev_add(watch_cdev, dev_num, 1) == -1) {
printk(KERN_ALERT "Failed to add cdev structure\n");
device_destroy(watch_class, dev_num);
class_destroy(watch_class);
unregister_chrdev_region(dev_num, 1);
return -1;
}
if ((watch_class = class_create(THIS_MODULE, DEVICE_NAME)) == NULL) {
printk(KERN_ALERT "Failed to create class\n");
cdev_del(watch_cdev);
@@ -137,6 +129,21 @@ int init_module(void) {
return -1;
}
if ((watch_cdev = cdev_alloc()) == NULL) {
printk(KERN_ALERT "Failed to allocate cdev structure\n");
unregister_chrdev_region(dev_num, 1);
return -1;
}
cdev_init(watch_cdev, &fops);
if (cdev_add(watch_cdev, dev_num, 1) == -1) {
printk(KERN_ALERT "Failed to add cdev structure\n");
device_destroy(watch_class, dev_num);
class_destroy(watch_class);
unregister_chrdev_region(dev_num, 1);
return -1;
}
printk(KERN_INFO "dev number: %d\n", dev_num);
printk(KERN_INFO "path: /dev/%s %d\n", DEVICE_NAME, dev_num);