diff options
Diffstat (limited to 'source/module/monitor_kernel.c')
| -rw-r--r-- | source/module/monitor_kernel.c | 85 |
1 files changed, 41 insertions, 44 deletions
diff --git a/source/module/monitor_kernel.c b/source/module/monitor_kernel.c index 82092c0..fd26828 100644 --- a/source/module/monitor_kernel.c +++ b/source/module/monitor_kernel.c @@ -1,12 +1,12 @@ #include "monitor_kernel.h" -#include <linux/cdev.h> // for cdev +#include <linux/cdev.h> // for cdev #include <linux/device.h> #include <linux/fs.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/module.h> -#include <linux/slab.h> // for kmalloc +#include <linux/slab.h> // for kmalloc #define DEVICE_NAME "variable_monitor" @@ -25,7 +25,8 @@ static int device_open(struct inode *inode, struct file *file) { current->pid); // save pid data = kmalloc(sizeof(*data), GFP_KERNEL); - if (!data) return -ENOMEM; + if (!data) + return -ENOMEM; data->pid = current->pid; file->private_data = data; return 0; @@ -38,12 +39,12 @@ static int device_release(struct inode *inode, struct file *file) { data->pid); // clear watch with pid clear_watch(data->pid); - kfree(data); // free data memory + kfree(data); // free data memory return 0; } typedef struct { - int pid; + int pid; } ioctl_pid; static long device_ioctl(struct file *file, unsigned int ioctl_num, @@ -51,50 +52,46 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, int ret = 0; watch_arg warg; ioctl_dump_param dump_param; - // ioctl_pid 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 1: - printk(KERN_INFO "variable_monitor ioctl_num 1\n"); - ret = copy_from_user(&dump_param, (ioctl_dump_param *)ioctl_param, - sizeof(ioctl_dump_param)); - printk(KERN_INFO "dump_param: %p %lu %p\n", dump_param.user_ptr_len, dump_param.user_buf_len, dump_param.user_buf); - if (!ret) { - // printk(KERN_INFO "ret\n"); - ret = copy_to_user_variant_buffer( - &load_monitor_variant_buffer, dump_param.user_ptr_len, - dump_param.user_buf, dump_param.user_buf_len); - printk(KERN_INFO "ret %d, %lu\n", ret, dump_param.user_buf_len); - } - printk(KERN_INFO "copy_to_user_variant_buffer \n"); - break; - // case 0: - // printk(KERN_INFO "variable_monitor test 2\n"); - // 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; + 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 ioctl_num 1\n"); + ret = copy_from_user(&dump_param, (ioctl_dump_param *)ioctl_param, + sizeof(ioctl_dump_param)); + printk(KERN_INFO "dump_param: %p %lu %p\n", dump_param.user_ptr_len, + dump_param.user_buf_len, dump_param.user_buf); + if (!ret) { + // printk(KERN_INFO "ret\n"); + ret = copy_to_user_variant_buffer( + &load_monitor_variant_buffer, dump_param.user_ptr_len, + dump_param.user_buf, dump_param.user_buf_len); + printk(KERN_INFO "ret %d, %lu\n", ret, dump_param.user_buf_len); + } + printk(KERN_INFO "copy_to_user_variant_buffer \n"); + break; + case 2: + printk(KERN_INFO "variable_monitor ioctl_num 2\n"); + ret = copy_from_user(&wpid, (ioctl_pid *)ioctl_param, sizeof(ioctl_pid)); + diag_test(wpid.pid); + break; + default: + break; } return 0; } |
