xref: /openbmc/qemu/trace/control.h (revision 17a319b175a57ee6fde4dabcaa2e11d47c39301e)
1e4858974SLluís /*
2e4858974SLluís  * Interface for configuring and controlling the state of tracing events.
3e4858974SLluís  *
43d211d9fSLluís Vilanova  * Copyright (C) 2011-2016 Lluís Vilanova <vilanova@ac.upc.edu>
5e4858974SLluís  *
6b1bae816SLluís Vilanova  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7b1bae816SLluís Vilanova  * See the COPYING file in the top-level directory.
8e4858974SLluís  */
9e4858974SLluís 
10b1bae816SLluís Vilanova #ifndef TRACE__CONTROL_H
11b1bae816SLluís Vilanova #define TRACE__CONTROL_H
12e4858974SLluís 
1334770187SDaniel P. Berrange #include "event-internal.h"
14fc764105SLluís 
156a1b0f3aSDaniel P. Berrange typedef struct TraceEventIter {
16c5cc58b1SGerd Hoffmann     /* iter state */
176a1b0f3aSDaniel P. Berrange     size_t event;
18fe4db84dSDaniel P. Berrange     size_t group;
19c5cc58b1SGerd Hoffmann     /* filter conditions */
20c5cc58b1SGerd Hoffmann     size_t group_id;
216a1b0f3aSDaniel P. Berrange     const char *pattern;
226a1b0f3aSDaniel P. Berrange } TraceEventIter;
23fc764105SLluís 
246a1b0f3aSDaniel P. Berrange 
256a1b0f3aSDaniel P. Berrange /**
26117856c3SGerd Hoffmann  * trace_event_iter_init_all:
276a1b0f3aSDaniel P. Berrange  * @iter: the event iterator struct
286a1b0f3aSDaniel P. Berrange  *
296a1b0f3aSDaniel P. Berrange  * Initialize the event iterator struct @iter,
30117856c3SGerd Hoffmann  * for all events.
31117856c3SGerd Hoffmann  */
32117856c3SGerd Hoffmann void trace_event_iter_init_all(TraceEventIter *iter);
33117856c3SGerd Hoffmann 
34117856c3SGerd Hoffmann /**
35117856c3SGerd Hoffmann  * trace_event_iter_init_pattern:
36117856c3SGerd Hoffmann  * @iter: the event iterator struct
37117856c3SGerd Hoffmann  * @pattern: pattern to filter events on name
38117856c3SGerd Hoffmann  *
39117856c3SGerd Hoffmann  * Initialize the event iterator struct @iter,
40117856c3SGerd Hoffmann  * using @pattern to filter out events
416a1b0f3aSDaniel P. Berrange  * with non-matching names.
426a1b0f3aSDaniel P. Berrange  */
43117856c3SGerd Hoffmann void trace_event_iter_init_pattern(TraceEventIter *iter, const char *pattern);
446a1b0f3aSDaniel P. Berrange 
456a1b0f3aSDaniel P. Berrange /**
46c5cc58b1SGerd Hoffmann  * trace_event_iter_init_group:
47c5cc58b1SGerd Hoffmann  * @iter: the event iterator struct
48c5cc58b1SGerd Hoffmann  * @group_id: group_id to filter events by group.
49c5cc58b1SGerd Hoffmann  *
50c5cc58b1SGerd Hoffmann  * Initialize the event iterator struct @iter,
51c5cc58b1SGerd Hoffmann  * using @group_id to filter for events in the group.
52c5cc58b1SGerd Hoffmann  */
53c5cc58b1SGerd Hoffmann void trace_event_iter_init_group(TraceEventIter *iter, size_t group_id);
54c5cc58b1SGerd Hoffmann 
55c5cc58b1SGerd Hoffmann /**
566a1b0f3aSDaniel P. Berrange  * trace_event_iter_next:
576a1b0f3aSDaniel P. Berrange  * @iter: the event iterator struct
586a1b0f3aSDaniel P. Berrange  *
596a1b0f3aSDaniel P. Berrange  * Get the next event, if any. When this returns NULL,
606a1b0f3aSDaniel P. Berrange  * the iterator should no longer be used.
616a1b0f3aSDaniel P. Berrange  *
626a1b0f3aSDaniel P. Berrange  * Returns: the next event, or NULL if no more events exist
636a1b0f3aSDaniel P. Berrange  */
646a1b0f3aSDaniel P. Berrange TraceEvent *trace_event_iter_next(TraceEventIter *iter);
656a1b0f3aSDaniel P. Berrange 
66b1bae816SLluís Vilanova 
67b1bae816SLluís Vilanova /**
68b1bae816SLluís Vilanova  * trace_event_name:
69b1bae816SLluís Vilanova  * @id: Event name.
70b1bae816SLluís Vilanova  *
71b1bae816SLluís Vilanova  * Search an event by its name.
72b1bae816SLluís Vilanova  *
73b1bae816SLluís Vilanova  * Returns: pointer to #TraceEvent or NULL if not found.
74b1bae816SLluís Vilanova  */
75b1bae816SLluís Vilanova TraceEvent *trace_event_name(const char *name);
76b1bae816SLluís Vilanova 
77b1bae816SLluís Vilanova /**
78b1bae816SLluís Vilanova  * trace_event_is_pattern:
79b1bae816SLluís Vilanova  *
80b1bae816SLluís Vilanova  * Whether the given string is an event name pattern.
81b1bae816SLluís Vilanova  */
82b1bae816SLluís Vilanova static bool trace_event_is_pattern(const char *str);
83b1bae816SLluís Vilanova 
84b1bae816SLluís Vilanova 
85b1bae816SLluís Vilanova /**
86b1bae816SLluís Vilanova  * trace_event_get_id:
87b1bae816SLluís Vilanova  *
88b1bae816SLluís Vilanova  * Get the identifier of an event.
89b1bae816SLluís Vilanova  */
90ef4c9fc8SDaniel P. Berrange static uint32_t trace_event_get_id(TraceEvent *ev);
91b1bae816SLluís Vilanova 
92b1bae816SLluís Vilanova /**
93b1bae816SLluís Vilanova  * trace_event_get_name:
94b1bae816SLluís Vilanova  *
95b1bae816SLluís Vilanova  * Get the name of an event.
96b1bae816SLluís Vilanova  */
97b1bae816SLluís Vilanova static const char * trace_event_get_name(TraceEvent *ev);
98b1bae816SLluís Vilanova 
99b1bae816SLluís Vilanova /**
100b1bae816SLluís Vilanova  * trace_event_get_state:
101ef4c9fc8SDaniel P. Berrange  * @id: Event identifier name.
102b1bae816SLluís Vilanova  *
103d87aa138SStefan Hajnoczi  * Get the tracing state of an event, both static and the QEMU dynamic state.
104b1bae816SLluís Vilanova  *
105b1bae816SLluís Vilanova  * If the event has the disabled property, the check will have no performance
106b1bae816SLluís Vilanova  * impact.
107b1bae816SLluís Vilanova  */
108b1bae816SLluís Vilanova #define trace_event_get_state(id)                       \
109585ec727SPaolo Bonzini     ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
110b1bae816SLluís Vilanova 
111b1bae816SLluís Vilanova /**
112d87aa138SStefan Hajnoczi  * trace_event_get_state_backends:
113d87aa138SStefan Hajnoczi  * @id: Event identifier name.
114d87aa138SStefan Hajnoczi  *
115d87aa138SStefan Hajnoczi  * Get the tracing state of an event, both static and dynamic state from all
116d87aa138SStefan Hajnoczi  * compiled-in backends.
117d87aa138SStefan Hajnoczi  *
118d87aa138SStefan Hajnoczi  * If the event has the disabled property, the check will have no performance
119d87aa138SStefan Hajnoczi  * impact.
120d87aa138SStefan Hajnoczi  *
121d87aa138SStefan Hajnoczi  * Returns: true if at least one backend has the event enabled and the event
122d87aa138SStefan Hajnoczi  * does not have the disabled property.
123d87aa138SStefan Hajnoczi  */
124d87aa138SStefan Hajnoczi #define trace_event_get_state_backends(id)              \
125d87aa138SStefan Hajnoczi     ((id ##_ENABLED) && id ##_BACKEND_DSTATE())
126d87aa138SStefan Hajnoczi 
127d87aa138SStefan Hajnoczi /**
128b1bae816SLluís Vilanova  * trace_event_get_state_static:
129b1bae816SLluís Vilanova  * @id: Event identifier.
130b1bae816SLluís Vilanova  *
131b1bae816SLluís Vilanova  * Get the static tracing state of an event.
132b1bae816SLluís Vilanova  *
133b1bae816SLluís Vilanova  * Use the define 'TRACE_${EVENT_NAME}_ENABLED' for compile-time checks (it will
134b1bae816SLluís Vilanova  * be set to 1 or 0 according to the presence of the disabled property).
135b1bae816SLluís Vilanova  */
136b1bae816SLluís Vilanova static bool trace_event_get_state_static(TraceEvent *ev);
137b1bae816SLluís Vilanova 
138b1bae816SLluís Vilanova /**
139b1bae816SLluís Vilanova  * trace_event_get_state_dynamic:
140b1bae816SLluís Vilanova  *
141b1bae816SLluís Vilanova  * Get the dynamic tracing state of an event.
14248151859SLluís Vilanova  *
14348151859SLluís Vilanova  * If the event has the 'vcpu' property, gets the OR'ed state of all vCPUs.
144b1bae816SLluís Vilanova  */
145b1bae816SLluís Vilanova static bool trace_event_get_state_dynamic(TraceEvent *ev);
146b1bae816SLluís Vilanova 
147b1bae816SLluís Vilanova /**
148b1bae816SLluís Vilanova  * trace_event_set_state_dynamic:
149b1bae816SLluís Vilanova  *
150b1bae816SLluís Vilanova  * Set the dynamic tracing state of an event.
151b1bae816SLluís Vilanova  *
15248151859SLluís Vilanova  * If the event has the 'vcpu' property, sets the state on all vCPUs.
15348151859SLluís Vilanova  *
154b1bae816SLluís Vilanova  * Pre-condition: trace_event_get_state_static(ev) == true
155b1bae816SLluís Vilanova  */
15648151859SLluís Vilanova void trace_event_set_state_dynamic(TraceEvent *ev, bool state);
15748151859SLluís Vilanova 
15848151859SLluís Vilanova /**
1595b808275SLluís Vilanova  * trace_init_backends:
160b1bae816SLluís Vilanova  *
161b1bae816SLluís Vilanova  * Initialize the tracing backend.
162b1bae816SLluís Vilanova  *
1635b808275SLluís Vilanova  * Returns: Whether the backends could be successfully initialized.
164e4858974SLluís  */
16541fc57e4SPaolo Bonzini bool trace_init_backends(void);
16645bd0b41SPaolo Bonzini 
16745bd0b41SPaolo Bonzini /**
16841fc57e4SPaolo Bonzini  * trace_init_file:
16941fc57e4SPaolo Bonzini  *
17041fc57e4SPaolo Bonzini  * Record the name of the output file for the tracing backend.
17141fc57e4SPaolo Bonzini  * Exits if no selected backend does not support specifying the
17292eecfffSPaolo Bonzini  * output file, and a file was specified with "-trace file=...".
17341fc57e4SPaolo Bonzini  */
17492eecfffSPaolo Bonzini void trace_init_file(void);
17541fc57e4SPaolo Bonzini 
17610578a25SPaolo Bonzini /**
177e9527dd3SPaolo Bonzini  * trace_list_events:
1786745c8a0SDoug Evans  * @f: Where to send output.
179e9527dd3SPaolo Bonzini  *
180e9527dd3SPaolo Bonzini  * List all available events.
181e9527dd3SPaolo Bonzini  */
1826745c8a0SDoug Evans void trace_list_events(FILE *f);
183e9527dd3SPaolo Bonzini 
184e9527dd3SPaolo Bonzini /**
18510578a25SPaolo Bonzini  * trace_enable_events:
18610578a25SPaolo Bonzini  * @line_buf: A string with a glob pattern of events to be enabled or,
18710578a25SPaolo Bonzini  *            if the string starts with '-', disabled.
18810578a25SPaolo Bonzini  *
18910578a25SPaolo Bonzini  * Enable or disable matching events.
19010578a25SPaolo Bonzini  */
19110578a25SPaolo Bonzini void trace_enable_events(const char *line_buf);
19210578a25SPaolo Bonzini 
193e9e0bb2aSDenis V. Lunev /**
194e9e0bb2aSDenis V. Lunev  * Definition of QEMU options describing trace subsystem configuration
195e9e0bb2aSDenis V. Lunev  */
196e9e0bb2aSDenis V. Lunev extern QemuOptsList qemu_trace_opts;
197e9e0bb2aSDenis V. Lunev 
198e9e0bb2aSDenis V. Lunev /**
199e9e0bb2aSDenis V. Lunev  * trace_opt_parse:
200*8b7b9c5cSPhilippe Mathieu-Daudé  * @optstr: A string argument of --trace command line argument
201e9e0bb2aSDenis V. Lunev  *
202e9e0bb2aSDenis V. Lunev  * Initialize tracing subsystem.
203e9e0bb2aSDenis V. Lunev  */
204*8b7b9c5cSPhilippe Mathieu-Daudé void trace_opt_parse(const char *optstr);
205b1bae816SLluís Vilanova 
206b7d48952SDaniel P. Berrange /**
207b7d48952SDaniel P. Berrange  * trace_get_vcpu_event_count:
208b7d48952SDaniel P. Berrange  *
209b7d48952SDaniel P. Berrange  * Return the number of known vcpu-specific events
210b7d48952SDaniel P. Berrange  */
211b7d48952SDaniel P. Berrange uint32_t trace_get_vcpu_event_count(void);
212b7d48952SDaniel P. Berrange 
21348151859SLluís Vilanova 
214a3227142SMichael S. Tsirkin #include "control-internal.h"
215b1bae816SLluís Vilanova 
216b1bae816SLluís Vilanova #endif /* TRACE__CONTROL_H */
217