1#ifndef __PERF_TRACE_EVENTS_H
2#define __PERF_TRACE_EVENTS_H
3
4#include <stdbool.h>
5#include "parse-events.h"
6#include "session.h"
7
8/* ANDROID_CHANGE_BEGIN */
9#if !defined(__BIONIC__) && !defined(__APPLE__)
10#define __unused __attribute__((unused))
11#endif
12/* ANDROID_CHANGE_END */
13
14
15#ifndef PAGE_MASK
16#define PAGE_MASK (page_size - 1)
17#endif
18
19enum {
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
32enum 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
42struct 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
51struct format {
52	int			nr_common;
53	int			nr_fields;
54	struct format_field	*common_fields;
55	struct format_field	*fields;
56};
57
58struct print_arg_atom {
59	char			*atom;
60};
61
62struct print_arg_string {
63	char			*string;
64	int			offset;
65};
66
67struct print_arg_field {
68	char			*name;
69	struct format_field	*field;
70};
71
72struct print_flag_sym {
73	struct print_flag_sym	*next;
74	char			*value;
75	char			*str;
76};
77
78struct print_arg_typecast {
79	char 			*type;
80	struct print_arg	*item;
81};
82
83struct print_arg_flags {
84	struct print_arg	*field;
85	char			*delim;
86	struct print_flag_sym	*flags;
87};
88
89struct print_arg_symbol {
90	struct print_arg	*field;
91	struct print_flag_sym	*symbols;
92};
93
94struct print_arg;
95
96struct print_arg_op {
97	char			*op;
98	int			prio;
99	struct print_arg	*left;
100	struct print_arg	*right;
101};
102
103struct print_arg_func {
104	char			*name;
105	struct print_arg	*args;
106};
107
108enum 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
119struct 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
134struct print_fmt {
135	char			*format;
136	struct print_arg	*args;
137};
138
139struct 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
149enum {
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
160struct record {
161	unsigned long long ts;
162	int size;
163	void *data;
164};
165
166struct record *trace_peek_data(int cpu);
167struct record *trace_read_data(int cpu);
168
169void parse_set_info(int nr_cpus, int long_sz);
170
171ssize_t trace_report(int fd, bool repipe);
172
173void *malloc_or_die(unsigned int size);
174
175void parse_cmdlines(char *file, int size);
176void parse_proc_kallsyms(char *file, unsigned int size);
177void parse_ftrace_printk(char *file, unsigned int size);
178
179void print_funcs(void);
180void print_printk(void);
181
182int parse_ftrace_file(char *buf, unsigned long size);
183int parse_event_file(char *buf, unsigned long size, char *sys);
184void print_trace_event(int cpu, void *data, int size);
185
186extern int file_bigendian;
187extern int host_bigendian;
188
189int bigendian(void);
190
191static 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
204static 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
219static 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
247extern int header_page_ts_offset;
248extern int header_page_ts_size;
249extern int header_page_size_offset;
250extern int header_page_size_size;
251extern int header_page_data_offset;
252extern int header_page_data_size;
253
254extern bool latency_format;
255
256int trace_parse_common_type(void *data);
257int trace_parse_common_pid(void *data);
258int parse_common_pc(void *data);
259int parse_common_flags(void *data);
260int parse_common_lock_depth(void *data);
261struct event *trace_find_event(int id);
262struct event *trace_find_next_event(struct event *event);
263unsigned long long read_size(void *ptr, int size);
264unsigned long long
265raw_field_value(struct event *event, const char *name, void *data);
266void *raw_field_ptr(struct event *event, const char *name, void *data);
267unsigned long long eval_flag(const char *flag);
268
269int read_tracing_data(int fd, struct list_head *pattrs);
270ssize_t read_tracing_data_size(int fd, struct list_head *pattrs);
271
272/* taken from kernel/trace/trace.h */
273enum trace_flag_type {
274	TRACE_FLAG_IRQS_OFF		= 0x01,
275	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
276	TRACE_FLAG_NEED_RESCHED		= 0x04,
277	TRACE_FLAG_HARDIRQ		= 0x08,
278	TRACE_FLAG_SOFTIRQ		= 0x10,
279};
280
281struct scripting_ops {
282	const char *name;
283	int (*start_script) (const char *script, int argc, const char **argv);
284	int (*stop_script) (void);
285	void (*process_event) (union perf_event *event,
286			       struct perf_sample *sample,
287			       struct perf_evsel *evsel,
288			       struct perf_session *session,
289			       struct thread *thread);
290	int (*generate_script) (const char *outfile);
291};
292
293int script_spec_register(const char *spec, struct scripting_ops *ops);
294
295void setup_perl_scripting(void);
296void setup_python_scripting(void);
297
298struct scripting_context {
299	void *event_data;
300};
301
302int common_pc(struct scripting_context *context);
303int common_flags(struct scripting_context *context);
304int common_lock_depth(struct scripting_context *context);
305
306#endif /* __PERF_TRACE_EVENTS_H */
307