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 "da_global" 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_GLOBAL 23*655d4809SGabriele Monaco #include "da_global.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_da_global); 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_da_global); 42*655d4809SGabriele Monaco } 43*655d4809SGabriele Monaco 44*655d4809SGabriele Monaco static int enable_da_global(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("da_global", /* XXX: tracepoint */, handle_event_1); 53*655d4809SGabriele Monaco rv_attach_trace_probe("da_global", /* 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_da_global(void) 59*655d4809SGabriele Monaco { 60*655d4809SGabriele Monaco rv_this.enabled = 0; 61*655d4809SGabriele Monaco 62*655d4809SGabriele Monaco rv_detach_trace_probe("da_global", /* XXX: tracepoint */, handle_event_1); 63*655d4809SGabriele Monaco rv_detach_trace_probe("da_global", /* 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 = "da_global", 73*655d4809SGabriele Monaco .description = "auto-generated", 74*655d4809SGabriele Monaco .enable = enable_da_global, 75*655d4809SGabriele Monaco .disable = disable_da_global, 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_da_global(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_da_global(void) 86*655d4809SGabriele Monaco { 87*655d4809SGabriele Monaco rv_unregister_monitor(&rv_this); 88*655d4809SGabriele Monaco } 89*655d4809SGabriele Monaco 90*655d4809SGabriele Monaco module_init(register_da_global); 91*655d4809SGabriele Monaco module_exit(unregister_da_global); 92*655d4809SGabriele Monaco 93*655d4809SGabriele Monaco MODULE_LICENSE("GPL"); 94*655d4809SGabriele Monaco MODULE_AUTHOR("rvgen: auto-generated"); 95*655d4809SGabriele Monaco MODULE_DESCRIPTION("da_global: auto-generated"); 96