Home | History | Annotate | Download | only in util
      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 
     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 ssize_t read_tracing_data_size(int fd, struct list_head *pattrs);
    271 
    272 /* taken from kernel/trace/trace.h */
    273 enum 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 
    281 struct 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 
    293 int script_spec_register(const char *spec, struct scripting_ops *ops);
    294 
    295 void setup_perl_scripting(void);
    296 void setup_python_scripting(void);
    297 
    298 struct scripting_context {
    299 	void *event_data;
    300 };
    301 
    302 int common_pc(struct scripting_context *context);
    303 int common_flags(struct scripting_context *context);
    304 int common_lock_depth(struct scripting_context *context);
    305 
    306 #endif /* __PERF_TRACE_EVENTS_H */
    307