diff options
Diffstat (limited to 'source/module/monitor_kernel.c')
| -rw-r--r-- | source/module/monitor_kernel.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/source/module/monitor_kernel.c b/source/module/monitor_kernel.c index a7c1383..644da98 100644 --- a/source/module/monitor_kernel.c +++ b/source/module/monitor_kernel.c @@ -45,6 +45,23 @@ typedef struct { int id; } ioctl_id; +// dump log from buffer +static int dump_log(ioctl_dump_param *dump_param, unsigned long ioctl_param, + struct diag_variant_buffer *buffer) { + int ret = 0; + ret = copy_from_user(dump_param, (ioctl_dump_param *)ioctl_param, + sizeof(ioctl_dump_param)); + printk(KERN_INFO "dump_param: %p %lx %p\n", dump_param->user_ptr_len, + dump_param->user_buf_len, dump_param->user_buf); + if (!ret) { + ret = copy_to_user_variant_buffer(buffer, dump_param->user_ptr_len, + dump_param->user_buf, + dump_param->user_buf_len); + printk(KERN_INFO "ret %d, %lx\n", ret, dump_param->user_buf_len); + } + return ret; +} + static long device_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { int ret = 0; @@ -74,17 +91,10 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, break; case IOCTL_DUMP_LOG: printk(KERN_INFO "variable_monitor IOCTL_DUMP_LOG\n"); - ret = copy_from_user(&dump_param, (ioctl_dump_param *)ioctl_param, - sizeof(ioctl_dump_param)); - printk(KERN_INFO "dump_param: %p %lx %p\n", dump_param.user_ptr_len, - dump_param.user_buf_len, dump_param.user_buf); - if (!ret) { - 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, %lx\n", ret, dump_param.user_buf_len); + ret = dump_log(&dump_param, ioctl_param, &load_monitor_variant_buffer); + if (ret) { + printk(KERN_INFO "dump_log failed\n"); } - // printk(KERN_INFO "copy_to_user_variant_buffer \n"); break; case IOCTL_PID: printk(KERN_INFO "variable_monitor PID\n"); @@ -96,6 +106,13 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, ret = copy_from_user(&wid, (ioctl_id *)ioctl_param, sizeof(ioctl_id)); diag_tgid(wid.id); break; + case IOCTL_DUMP_LOG_SA: + printk(KERN_INFO "variable_monitor IOCTL_DUMP_LOG_SA\n"); + ret = dump_log(&dump_param, ioctl_param, &stand_alone_buffer); + if (ret) { + printk(KERN_INFO "dump_log failed\n"); + } + break; default: break; } |
