xref: /qemu/trace/control.h (revision 17f7ac75df3909c384c18274b41a2a91192599e3)
1 /*
2  * Interface for configuring and controlling the state of tracing events.
3  *
4  * Copyright (C) 2011-2016 Lluís Vilanova <vilanova@ac.upc.edu>
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7  * See the COPYING file in the top-level directory.
8  */
9 
10 #ifndef TRACE__CONTROL_H
11 #define TRACE__CONTROL_H
12 
13 #include "qemu-common.h"
14 #include "trace/generated-events.h"
15 
16 
17 /**
18  * TraceEventID:
19  *
20  * Unique tracing event identifier.
21  *
22  * These are named as 'TRACE_${EVENT_NAME}'.
23  *
24  * See also: "trace/generated-events.h"
25  */
26 enum TraceEventID;
27 
28 /**
29  * trace_event_id:
30  * @id: Event identifier.
31  *
32  * Get an event by its identifier.
33  *
34  * This routine has a constant cost, as opposed to trace_event_name and
35  * trace_event_pattern.
36  *
37  * Pre-conditions: The identifier is valid.
38  *
39  * Returns: pointer to #TraceEvent.
40  *
41  */
42 static TraceEvent *trace_event_id(TraceEventID id);
43 
44 /**
45  * trace_event_name:
46  * @id: Event name.
47  *
48  * Search an event by its name.
49  *
50  * Returns: pointer to #TraceEvent or NULL if not found.
51  */
52 TraceEvent *trace_event_name(const char *name);
53 
54 /**
55  * trace_event_pattern:
56  * @pat: Event name pattern.
57  * @ev: Event to start searching from (not included).
58  *
59  * Get all events with a given name pattern.
60  *
61  * Returns: pointer to #TraceEvent or NULL if not found.
62  */
63 TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev);
64 
65 /**
66  * trace_event_is_pattern:
67  *
68  * Whether the given string is an event name pattern.
69  */
70 static bool trace_event_is_pattern(const char *str);
71 
72 /**
73  * trace_event_count:
74  *
75  * Return the number of events.
76  */
77 static TraceEventID trace_event_count(void);
78 
79 
80 
81 /**
82  * trace_event_get_id:
83  *
84  * Get the identifier of an event.
85  */
86 static TraceEventID trace_event_get_id(TraceEvent *ev);
87 
88 /**
89  * trace_event_get_vcpu_id:
90  *
91  * Get the per-vCPU identifier of an event.
92  *
93  * Special value #TRACE_VCPU_EVENT_COUNT means the event is not vCPU-specific
94  * (does not have the "vcpu" property).
95  */
96 static TraceEventVCPUID trace_event_get_vcpu_id(TraceEvent *ev);
97 
98 /**
99  * trace_event_is_vcpu:
100  *
101  * Whether this is a per-vCPU event.
102  */
103 static bool trace_event_is_vcpu(TraceEvent *ev);
104 
105 /**
106  * trace_event_get_name:
107  *
108  * Get the name of an event.
109  */
110 static const char * trace_event_get_name(TraceEvent *ev);
111 
112 /**
113  * trace_event_get_state:
114  * @id: Event identifier.
115  *
116  * Get the tracing state of an event (both static and dynamic).
117  *
118  * If the event has the disabled property, the check will have no performance
119  * impact.
120  *
121  * As a down side, you must always use an immediate #TraceEventID value.
122  */
123 #define trace_event_get_state(id)                       \
124     ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
125 
126 /**
127  * trace_event_get_state_static:
128  * @id: Event identifier.
129  *
130  * Get the static tracing state of an event.
131  *
132  * Use the define 'TRACE_${EVENT_NAME}_ENABLED' for compile-time checks (it will
133  * be set to 1 or 0 according to the presence of the disabled property).
134  */
135 static bool trace_event_get_state_static(TraceEvent *ev);
136 
137 /**
138  * trace_event_get_state_dynamic:
139  *
140  * Get the dynamic tracing state of an event.
141  */
142 static bool trace_event_get_state_dynamic(TraceEvent *ev);
143 
144 /**
145  * trace_event_set_state:
146  *
147  * Set the tracing state of an event (only if possible).
148  */
149 #define trace_event_set_state(id, state)                \
150     do {                                                \
151         if ((id ##_ENABLED)) {                          \
152             TraceEvent *_e = trace_event_id(id);        \
153             trace_event_set_state_dynamic(_e, state);   \
154         }                                               \
155     } while (0)
156 
157 /**
158  * trace_event_set_state_dynamic:
159  *
160  * Set the dynamic tracing state of an event.
161  *
162  * Pre-condition: trace_event_get_state_static(ev) == true
163  */
164 static void trace_event_set_state_dynamic(TraceEvent *ev, bool state);
165 
166 
167 
168 /**
169  * trace_init_backends:
170  * @file:   Name of trace output file; may be NULL.
171  *          Corresponds to commandline option "-trace file=...".
172  *
173  * Initialize the tracing backend.
174  *
175  * Returns: Whether the backends could be successfully initialized.
176  */
177 bool trace_init_backends(void);
178 
179 /**
180  * trace_init_file:
181  * @file:   Name of trace output file; may be NULL.
182  *          Corresponds to commandline option "-trace file=...".
183  *
184  * Record the name of the output file for the tracing backend.
185  * Exits if no selected backend does not support specifying the
186  * output file, and a non-NULL file was passed.
187  */
188 void trace_init_file(const char *file);
189 
190 /**
191  * trace_list_events:
192  *
193  * List all available events.
194  */
195 void trace_list_events(void);
196 
197 /**
198  * trace_enable_events:
199  * @line_buf: A string with a glob pattern of events to be enabled or,
200  *            if the string starts with '-', disabled.
201  *
202  * Enable or disable matching events.
203  */
204 void trace_enable_events(const char *line_buf);
205 
206 /**
207  * Definition of QEMU options describing trace subsystem configuration
208  */
209 extern QemuOptsList qemu_trace_opts;
210 
211 /**
212  * trace_opt_parse:
213  * @optarg: A string argument of --trace command line argument
214  *
215  * Initialize tracing subsystem.
216  *
217  * Returns the filename to save trace to.  It must be freed with g_free().
218  */
219 char *trace_opt_parse(const char *optarg);
220 
221 #include "trace/control-internal.h"
222 
223 #endif /* TRACE__CONTROL_H */
224