xref: /linux/tools/verification/rvgen/tests/golden/da_pertask_desc/da_pertask_desc.c (revision 55ee4b931a7ffedc886175d265dd6e6d08fd4151)
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