Root/tools/perf/util/trace-event.h

1#ifndef __PERF_TRACE_EVENTS_H
2#define __PERF_TRACE_EVENTS_H
3
4#include "parse-events.h"
5
6#define __unused __attribute__((unused))
7
8
9#ifndef PAGE_MASK
10#define PAGE_MASK (page_size - 1)
11#endif
12
13enum {
14    RINGBUF_TYPE_PADDING = 29,
15    RINGBUF_TYPE_TIME_EXTEND = 30,
16    RINGBUF_TYPE_TIME_STAMP = 31,
17};
18
19#ifndef TS_SHIFT
20#define TS_SHIFT 27
21#endif
22
23#define NSECS_PER_SEC 1000000000ULL
24#define NSECS_PER_USEC 1000ULL
25
26enum format_flags {
27    FIELD_IS_ARRAY = 1,
28    FIELD_IS_POINTER = 2,
29    FIELD_IS_SIGNED = 4,
30    FIELD_IS_STRING = 8,
31    FIELD_IS_DYNAMIC = 16,
32    FIELD_IS_FLAG = 32,
33    FIELD_IS_SYMBOLIC = 64,
34};
35
36struct format_field {
37    struct format_field *next;
38    char *type;
39    char *name;
40    int offset;
41    int size;
42    unsigned long flags;
43};
44
45struct format {
46    int nr_common;
47    int nr_fields;
48    struct format_field *common_fields;
49    struct format_field *fields;
50};
51
52struct print_arg_atom {
53    char *atom;
54};
55
56struct print_arg_string {
57    char *string;
58    int offset;
59};
60
61struct print_arg_field {
62    char *name;
63    struct format_field *field;
64};
65
66struct print_flag_sym {
67    struct print_flag_sym *next;
68    char *value;
69    char *str;
70};
71
72struct print_arg_typecast {
73    char *type;
74    struct print_arg *item;
75};
76
77struct print_arg_flags {
78    struct print_arg *field;
79    char *delim;
80    struct print_flag_sym *flags;
81};
82
83struct print_arg_symbol {
84    struct print_arg *field;
85    struct print_flag_sym *symbols;
86};
87
88struct print_arg;
89
90struct print_arg_op {
91    char *op;
92    int prio;
93    struct print_arg *left;
94    struct print_arg *right;
95};
96
97struct print_arg_func {
98    char *name;
99    struct print_arg *args;
100};
101
102enum print_arg_type {
103    PRINT_NULL,
104    PRINT_ATOM,
105    PRINT_FIELD,
106    PRINT_FLAGS,
107    PRINT_SYMBOL,
108    PRINT_TYPE,
109    PRINT_STRING,
110    PRINT_OP,
111};
112
113struct print_arg {
114    struct print_arg *next;
115    enum print_arg_type type;
116    union {
117        struct print_arg_atom atom;
118        struct print_arg_field field;
119        struct print_arg_typecast typecast;
120        struct print_arg_flags flags;
121        struct print_arg_symbol symbol;
122        struct print_arg_func func;
123        struct print_arg_string string;
124        struct print_arg_op op;
125    };
126};
127
128struct print_fmt {
129    char *format;
130    struct print_arg *args;
131};
132
133struct event {
134    struct event *next;
135    char *name;
136    int id;
137    int flags;
138    struct format format;
139    struct print_fmt print_fmt;
140    char *system;
141};
142
143enum {
144    EVENT_FL_ISFTRACE = 0x01,
145    EVENT_FL_ISPRINT = 0x02,
146    EVENT_FL_ISBPRINT = 0x04,
147    EVENT_FL_ISFUNC = 0x08,
148    EVENT_FL_ISFUNCENT = 0x10,
149    EVENT_FL_ISFUNCRET = 0x20,
150
151    EVENT_FL_FAILED = 0x80000000
152};
153
154struct record {
155    unsigned long long ts;
156    int size;
157    void *data;
158};
159
160struct record *trace_peek_data(int cpu);
161struct record *trace_read_data(int cpu);
162
163void parse_set_info(int nr_cpus, int long_sz);
164
165void trace_report(int fd);
166
167void *malloc_or_die(unsigned int size);
168
169void parse_cmdlines(char *file, int size);
170void parse_proc_kallsyms(char *file, unsigned int size);
171void parse_ftrace_printk(char *file, unsigned int size);
172
173void print_funcs(void);
174void print_printk(void);
175
176int parse_ftrace_file(char *buf, unsigned long size);
177int parse_event_file(char *buf, unsigned long size, char *sys);
178void print_event(int cpu, void *data, int size, unsigned long long nsecs,
179          char *comm);
180
181extern int file_bigendian;
182extern int host_bigendian;
183
184int bigendian(void);
185
186static inline unsigned short __data2host2(unsigned short data)
187{
188    unsigned short swap;
189
190    if (host_bigendian == file_bigendian)
191        return data;
192
193    swap = ((data & 0xffULL) << 8) |
194        ((data & (0xffULL << 8)) >> 8);
195
196    return swap;
197}
198
199static inline unsigned int __data2host4(unsigned int data)
200{
201    unsigned int swap;
202
203    if (host_bigendian == file_bigendian)
204        return data;
205
206    swap = ((data & 0xffULL) << 24) |
207        ((data & (0xffULL << 8)) << 8) |
208        ((data & (0xffULL << 16)) >> 8) |
209        ((data & (0xffULL << 24)) >> 24);
210
211    return swap;
212}
213
214static inline unsigned long long __data2host8(unsigned long long data)
215{
216    unsigned long long swap;
217
218    if (host_bigendian == file_bigendian)
219        return data;
220
221    swap = ((data & 0xffULL) << 56) |
222        ((data & (0xffULL << 8)) << 40) |
223        ((data & (0xffULL << 16)) << 24) |
224        ((data & (0xffULL << 24)) << 8) |
225        ((data & (0xffULL << 32)) >> 8) |
226        ((data & (0xffULL << 40)) >> 24) |
227        ((data & (0xffULL << 48)) >> 40) |
228        ((data & (0xffULL << 56)) >> 56);
229
230    return swap;
231}
232
233#define data2host2(ptr) __data2host2(*(unsigned short *)ptr)
234#define data2host4(ptr) __data2host4(*(unsigned int *)ptr)
235#define data2host8(ptr) __data2host8(*(unsigned long long *)ptr)
236
237extern int header_page_ts_offset;
238extern int header_page_ts_size;
239extern int header_page_size_offset;
240extern int header_page_size_size;
241extern int header_page_data_offset;
242extern int header_page_data_size;
243
244extern int latency_format;
245
246int parse_header_page(char *buf, unsigned long size);
247int trace_parse_common_type(void *data);
248int trace_parse_common_pid(void *data);
249int parse_common_pc(void *data);
250int parse_common_flags(void *data);
251int parse_common_lock_depth(void *data);
252struct event *trace_find_event(int id);
253struct event *trace_find_next_event(struct event *event);
254unsigned long long read_size(void *ptr, int size);
255unsigned long long
256raw_field_value(struct event *event, const char *name, void *data);
257void *raw_field_ptr(struct event *event, const char *name, void *data);
258unsigned long long eval_flag(const char *flag);
259
260int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events);
261
262/* taken from kernel/trace/trace.h */
263enum trace_flag_type {
264    TRACE_FLAG_IRQS_OFF = 0x01,
265    TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
266    TRACE_FLAG_NEED_RESCHED = 0x04,
267    TRACE_FLAG_HARDIRQ = 0x08,
268    TRACE_FLAG_SOFTIRQ = 0x10,
269};
270
271struct scripting_ops {
272    const char *name;
273    int (*start_script) (const char *script, int argc, const char **argv);
274    int (*stop_script) (void);
275    void (*process_event) (int cpu, void *data, int size,
276                   unsigned long long nsecs, char *comm);
277    int (*generate_script) (const char *outfile);
278};
279
280int script_spec_register(const char *spec, struct scripting_ops *ops);
281
282void setup_perl_scripting(void);
283void setup_python_scripting(void);
284
285struct scripting_context {
286    void *event_data;
287};
288
289int common_pc(struct scripting_context *context);
290int common_flags(struct scripting_context *context);
291int common_lock_depth(struct scripting_context *context);
292
293#endif /* __PERF_TRACE_EVENTS_H */
294

Archive Download this file



interactive