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