summaryrefslogtreecommitdiff
path: root/source/module/monitor_kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/module/monitor_kernel.c')
-rw-r--r--source/module/monitor_kernel.c85
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;
}