1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/ftrace.h> 3 #include <linux/tracepoint.h> 4 #include <linux/kernel.h> 5 #include <linux/module.h> 6 #include <linux/init.h> 7 #include <linux/rv.h> 8 #include <rv/instrumentation.h> 9 10 #define MODULE_NAME "da_pertask_desc" 11 12 /* 13 * XXX: include required tracepoint headers, e.g., 14 * #include <trace/events/sched.h> 15 */ 16 #include <rv_trace.h> 17 18 /* 19 * This is the self-generated part of the monitor. Generally, there is no need 20 * to touch this section. 21 */ 22 #define RV_MON_TYPE RV_MON_PER_TASK 23 #include "da_pertask_desc.h" 24 #include <rv/da_monitor.h> 25 26 /* 27 * This is the instrumentation part of the monitor. 28 * 29 * This is the section where manual work is required. Here the kernel events 30 * are translated into model's event. 31 * 32 */ 33 static void handle_event_1(void *data, /* XXX: fill header */) 34 { 35 /* XXX: validate that this event is only valid in the initial state */ 36 struct task_struct *p = /* XXX: how do I get p? */; 37 da_handle_start_run_event(p, event_1_da_pertask_desc); 38 } 39 40 static void handle_event_2(void *data, /* XXX: fill header */) 41 { 42 struct task_struct *p = /* XXX: how do I get p? */; 43 da_handle_event(p, event_2_da_pertask_desc); 44 } 45 46 static void handle_event_3(void *data, /* XXX: fill header */) 47 { 48 struct task_struct *p = /* XXX: how do I get p? */; 49 da_handle_event(p, event_3_da_pertask_desc); 50 } 51 52 static int enable_da_pertask_desc(void) 53 { 54 int retval; 55 56 retval = da_monitor_init(); 57 if (retval) 58 return retval; 59 60 rv_attach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_1); 61 rv_attach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_2); 62 rv_attach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_3); 63 64 return 0; 65 } 66 67 static void disable_da_pertask_desc(void) 68 { 69 rv_this.enabled = 0; 70 71 rv_detach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_1); 72 rv_detach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_2); 73 rv_detach_trace_probe("da_pertask_desc", /* XXX: tracepoint */, handle_event_3); 74 75 da_monitor_destroy(); 76 } 77 78 /* 79 * This is the monitor register section. 80 */ 81 static struct rv_monitor rv_this = { 82 .name = "da_pertask_desc", 83 .description = "Custom description for testing", 84 .enable = enable_da_pertask_desc, 85 .disable = disable_da_pertask_desc, 86 .reset = da_monitor_reset_all, 87 .enabled = 0, 88 }; 89 90 static int __init register_da_pertask_desc(void) 91 { 92 return rv_register_monitor(&rv_this, NULL); 93 } 94 95 static void __exit unregister_da_pertask_desc(void) 96 { 97 rv_unregister_monitor(&rv_this); 98 } 99 100 module_init(register_da_pertask_desc); 101 module_exit(unregister_da_pertask_desc); 102 103 MODULE_LICENSE("GPL"); 104 MODULE_AUTHOR("rvgen: auto-generated"); 105 MODULE_DESCRIPTION("da_pertask_desc: Custom description for testing"); 106