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