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