1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _PERF_UTIL_TRACE_EVENT_H |
3 | #define _PERF_UTIL_TRACE_EVENT_H |
4 | |
5 | #include <stdbool.h> |
6 | #include <stdio.h> |
7 | #include <sys/types.h> |
8 | #include <linux/types.h> |
9 | |
10 | struct evlist; |
11 | struct machine; |
12 | struct perf_sample; |
13 | union perf_event; |
14 | struct perf_tool; |
15 | struct thread; |
16 | struct tep_plugin_list; |
17 | struct evsel; |
18 | struct tep_format_field; |
19 | |
20 | struct trace_event { |
21 | struct tep_handle *pevent; |
22 | struct tep_plugin_list *plugin_list; |
23 | }; |
24 | |
25 | /* Computes a version number comparable with LIBTRACEEVENT_VERSION from Makefile.config. */ |
26 | #define MAKE_LIBTRACEEVENT_VERSION(a, b, c) ((a)*255*255+(b)*255+(c)) |
27 | |
28 | typedef char *(tep_func_resolver_t)(void *priv, |
29 | unsigned long long *addrp, char **modp); |
30 | |
31 | bool have_tracepoints(struct list_head *evlist); |
32 | |
33 | int trace_event__init(struct trace_event *t); |
34 | void trace_event__cleanup(struct trace_event *t); |
35 | int trace_event__register_resolver(struct machine *machine, |
36 | tep_func_resolver_t *func); |
37 | struct tep_event* |
38 | trace_event__tp_format(const char *sys, const char *name); |
39 | |
40 | struct tep_event *trace_event__tp_format_id(int id); |
41 | |
42 | void event_format__fprintf(struct tep_event *event, |
43 | int cpu, void *data, int size, FILE *fp); |
44 | |
45 | void event_format__print(struct tep_event *event, |
46 | int cpu, void *data, int size); |
47 | |
48 | int parse_ftrace_file(struct tep_handle *pevent, char *buf, unsigned long size); |
49 | int parse_event_file(struct tep_handle *pevent, |
50 | char *buf, unsigned long size, char *sys); |
51 | |
52 | unsigned long long |
53 | raw_field_value(struct tep_event *event, const char *name, void *data); |
54 | |
55 | const char *parse_task_states(struct tep_format_field *state_field); |
56 | |
57 | void parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); |
58 | void parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); |
59 | void parse_saved_cmdline(struct tep_handle *pevent, char *file, unsigned int size); |
60 | |
61 | ssize_t trace_report(int fd, struct trace_event *tevent, bool repipe); |
62 | |
63 | unsigned long long read_size(struct tep_event *event, void *ptr, int size); |
64 | unsigned long long eval_flag(const char *flag); |
65 | |
66 | int read_tracing_data(int fd, struct list_head *pattrs); |
67 | |
68 | /* |
69 | * Return the tracepoint name in the format "subsystem:event_name", |
70 | * callers should free the returned string. |
71 | */ |
72 | char *tracepoint_id_to_name(u64 config); |
73 | |
74 | struct tracing_data { |
75 | /* size is only valid if temp is 'true' */ |
76 | ssize_t size; |
77 | bool temp; |
78 | char temp_file[50]; |
79 | }; |
80 | |
81 | struct tracing_data *tracing_data_get(struct list_head *pattrs, |
82 | int fd, bool temp); |
83 | int tracing_data_put(struct tracing_data *tdata); |
84 | |
85 | |
86 | struct addr_location; |
87 | |
88 | struct perf_session; |
89 | struct perf_stat_config; |
90 | |
91 | struct scripting_ops { |
92 | const char *name; |
93 | const char *dirname; /* For script path .../scripts/<dirname>/... */ |
94 | int (*start_script)(const char *script, int argc, const char **argv, |
95 | struct perf_session *session); |
96 | int (*flush_script) (void); |
97 | int (*stop_script) (void); |
98 | void (*process_event) (union perf_event *event, |
99 | struct perf_sample *sample, |
100 | struct evsel *evsel, |
101 | struct addr_location *al, |
102 | struct addr_location *addr_al); |
103 | void (*process_switch)(union perf_event *event, |
104 | struct perf_sample *sample, |
105 | struct machine *machine); |
106 | void (*process_auxtrace_error)(struct perf_session *session, |
107 | union perf_event *event); |
108 | void (*process_stat)(struct perf_stat_config *config, |
109 | struct evsel *evsel, u64 tstamp); |
110 | void (*process_stat_interval)(u64 tstamp); |
111 | void (*process_throttle)(union perf_event *event, |
112 | struct perf_sample *sample, |
113 | struct machine *machine); |
114 | int (*generate_script) (struct tep_handle *pevent, const char *outfile); |
115 | }; |
116 | |
117 | extern unsigned int scripting_max_stack; |
118 | |
119 | int script_spec_register(const char *spec, struct scripting_ops *ops); |
120 | |
121 | void script_fetch_insn(struct perf_sample *sample, struct thread *thread, |
122 | struct machine *machine); |
123 | |
124 | void setup_perl_scripting(void); |
125 | void setup_python_scripting(void); |
126 | |
127 | struct scripting_context { |
128 | struct tep_handle *pevent; |
129 | void *event_data; |
130 | union perf_event *event; |
131 | struct perf_sample *sample; |
132 | struct evsel *evsel; |
133 | struct addr_location *al; |
134 | struct addr_location *addr_al; |
135 | struct perf_session *session; |
136 | }; |
137 | |
138 | void scripting_context__update(struct scripting_context *scripting_context, |
139 | union perf_event *event, |
140 | struct perf_sample *sample, |
141 | struct evsel *evsel, |
142 | struct addr_location *al, |
143 | struct addr_location *addr_al); |
144 | |
145 | int common_pc(struct scripting_context *context); |
146 | int common_flags(struct scripting_context *context); |
147 | int common_lock_depth(struct scripting_context *context); |
148 | |
149 | #define SAMPLE_FLAGS_BUF_SIZE 64 |
150 | int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz); |
151 | |
152 | #if defined(LIBTRACEEVENT_VERSION) && LIBTRACEEVENT_VERSION >= MAKE_LIBTRACEEVENT_VERSION(1, 5, 0) |
153 | #include <traceevent/event-parse.h> |
154 | |
155 | static inline bool tep_field_is_relative(unsigned long flags) |
156 | { |
157 | return (flags & TEP_FIELD_IS_RELATIVE) != 0; |
158 | } |
159 | #else |
160 | #include <linux/compiler.h> |
161 | |
162 | static inline bool tep_field_is_relative(unsigned long flags __maybe_unused) |
163 | { |
164 | return false; |
165 | } |
166 | #endif |
167 | |
168 | #endif /* _PERF_UTIL_TRACE_EVENT_H */ |
169 | |