xref: /linux/tools/verification/rvgen/tests/golden/test_da/test_da.c (revision 55ee4b931a7ffedc886175d265dd6e6d08fd4151)
1*655d4809SGabriele Monaco // SPDX-License-Identifier: GPL-2.0
2*655d4809SGabriele Monaco #include <linux/ftrace.h>
3*655d4809SGabriele Monaco #include <linux/tracepoint.h>
4*655d4809SGabriele Monaco #include <linux/kernel.h>
5*655d4809SGabriele Monaco #include <linux/module.h>
6*655d4809SGabriele Monaco #include <linux/init.h>
7*655d4809SGabriele Monaco #include <linux/rv.h>
8*655d4809SGabriele Monaco #include <rv/instrumentation.h>
9*655d4809SGabriele Monaco 
10*655d4809SGabriele Monaco #define MODULE_NAME "test_da"
11*655d4809SGabriele Monaco 
12*655d4809SGabriele Monaco /*
13*655d4809SGabriele Monaco  * XXX: include required tracepoint headers, e.g.,
14*655d4809SGabriele Monaco  * #include <trace/events/sched.h>
15*655d4809SGabriele Monaco  */
16*655d4809SGabriele Monaco #include <rv_trace.h>
17*655d4809SGabriele Monaco 
18*655d4809SGabriele Monaco /*
19*655d4809SGabriele Monaco  * This is the self-generated part of the monitor. Generally, there is no need
20*655d4809SGabriele Monaco  * to touch this section.
21*655d4809SGabriele Monaco  */
22*655d4809SGabriele Monaco #define RV_MON_TYPE RV_MON_PER_CPU
23*655d4809SGabriele Monaco #include "test_da.h"
24*655d4809SGabriele Monaco #include <rv/da_monitor.h>
25*655d4809SGabriele Monaco 
26*655d4809SGabriele Monaco /*
27*655d4809SGabriele Monaco  * This is the instrumentation part of the monitor.
28*655d4809SGabriele Monaco  *
29*655d4809SGabriele Monaco  * This is the section where manual work is required. Here the kernel events
30*655d4809SGabriele Monaco  * are translated into model's event.
31*655d4809SGabriele Monaco  *
32*655d4809SGabriele Monaco  */
33*655d4809SGabriele Monaco static void handle_event_1(void *data, /* XXX: fill header */)
34*655d4809SGabriele Monaco {
35*655d4809SGabriele Monaco 	da_handle_event(event_1_test_da);
36*655d4809SGabriele Monaco }
37*655d4809SGabriele Monaco 
38*655d4809SGabriele Monaco static void handle_event_2(void *data, /* XXX: fill header */)
39*655d4809SGabriele Monaco {
40*655d4809SGabriele Monaco 	/* XXX: validate that this event always leads to the initial state */
41*655d4809SGabriele Monaco 	da_handle_start_event(event_2_test_da);
42*655d4809SGabriele Monaco }
43*655d4809SGabriele Monaco 
44*655d4809SGabriele Monaco static int enable_test_da(void)
45*655d4809SGabriele Monaco {
46*655d4809SGabriele Monaco 	int retval;
47*655d4809SGabriele Monaco 
48*655d4809SGabriele Monaco 	retval = da_monitor_init();
49*655d4809SGabriele Monaco 	if (retval)
50*655d4809SGabriele Monaco 		return retval;
51*655d4809SGabriele Monaco 
52*655d4809SGabriele Monaco 	rv_attach_trace_probe("test_da", /* XXX: tracepoint */, handle_event_1);
53*655d4809SGabriele Monaco 	rv_attach_trace_probe("test_da", /* XXX: tracepoint */, handle_event_2);
54*655d4809SGabriele Monaco 
55*655d4809SGabriele Monaco 	return 0;
56*655d4809SGabriele Monaco }
57*655d4809SGabriele Monaco 
58*655d4809SGabriele Monaco static void disable_test_da(void)
59*655d4809SGabriele Monaco {
60*655d4809SGabriele Monaco 	rv_this.enabled = 0;
61*655d4809SGabriele Monaco 
62*655d4809SGabriele Monaco 	rv_detach_trace_probe("test_da", /* XXX: tracepoint */, handle_event_1);
63*655d4809SGabriele Monaco 	rv_detach_trace_probe("test_da", /* XXX: tracepoint */, handle_event_2);
64*655d4809SGabriele Monaco 
65*655d4809SGabriele Monaco 	da_monitor_destroy();
66*655d4809SGabriele Monaco }
67*655d4809SGabriele Monaco 
68*655d4809SGabriele Monaco /*
69*655d4809SGabriele Monaco  * This is the monitor register section.
70*655d4809SGabriele Monaco  */
71*655d4809SGabriele Monaco static struct rv_monitor rv_this = {
72*655d4809SGabriele Monaco 	.name = "test_da",
73*655d4809SGabriele Monaco 	.description = "auto-generated",
74*655d4809SGabriele Monaco 	.enable = enable_test_da,
75*655d4809SGabriele Monaco 	.disable = disable_test_da,
76*655d4809SGabriele Monaco 	.reset = da_monitor_reset_all,
77*655d4809SGabriele Monaco 	.enabled = 0,
78*655d4809SGabriele Monaco };
79*655d4809SGabriele Monaco 
80*655d4809SGabriele Monaco static int __init register_test_da(void)
81*655d4809SGabriele Monaco {
82*655d4809SGabriele Monaco 	return rv_register_monitor(&rv_this, NULL);
83*655d4809SGabriele Monaco }
84*655d4809SGabriele Monaco 
85*655d4809SGabriele Monaco static void __exit unregister_test_da(void)
86*655d4809SGabriele Monaco {
87*655d4809SGabriele Monaco 	rv_unregister_monitor(&rv_this);
88*655d4809SGabriele Monaco }
89*655d4809SGabriele Monaco 
90*655d4809SGabriele Monaco module_init(register_test_da);
91*655d4809SGabriele Monaco module_exit(unregister_test_da);
92*655d4809SGabriele Monaco 
93*655d4809SGabriele Monaco MODULE_LICENSE("GPL");
94*655d4809SGabriele Monaco MODULE_AUTHOR("rvgen: auto-generated");
95*655d4809SGabriele Monaco MODULE_DESCRIPTION("test_da: auto-generated");
96