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 14 enum { 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 27 enum 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 37 struct 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 46 struct format { 47 int nr_common; 48 int nr_fields; 49 struct format_field *common_fields; 50 struct format_field *fields; 51 }; 52 53 struct print_arg_atom { 54 char *atom; 55 }; 56 57 struct print_arg_string { 58 char *string; 59 int offset; 60 }; 61 62 struct print_arg_field { 63 char *name; 64 struct format_field *field; 65 }; 66 67 struct print_flag_sym { 68 struct print_flag_sym *next; 69 char *value; 70 char *str; 71 }; 72 73 struct print_arg_typecast { 74 char *type; 75 struct print_arg *item; 76 }; 77 78 struct print_arg_flags { 79 struct print_arg *field; 80 char *delim; 81 struct print_flag_sym *flags; 82 }; 83 84 struct print_arg_symbol { 85 struct print_arg *field; 86 struct print_flag_sym *symbols; 87 }; 88 89 struct print_arg; 90 91 struct print_arg_op { 92 char *op; 93 int prio; 94 struct print_arg *left; 95 struct print_arg *right; 96 }; 97 98 struct print_arg_func { 99 char *name; 100 struct print_arg *args; 101 }; 102 103 enum 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 114 struct 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 129 struct print_fmt { 130 char *format; 131 struct print_arg *args; 132 }; 133 134 struct 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 144 enum { 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 155 struct record { 156 unsigned long long ts; 157 int size; 158 void *data; 159 }; 160 161 struct record *trace_peek_data(int cpu); 162 struct record *trace_read_data(int cpu); 163 164 void parse_set_info(int nr_cpus, int long_sz); 165 166 ssize_t trace_report(int fd, bool repipe); 167 168 void *malloc_or_die(unsigned int size); 169 170 void parse_cmdlines(char *file, int size); 171 void parse_proc_kallsyms(char *file, unsigned int size); 172 void parse_ftrace_printk(char *file, unsigned int size); 173 174 void print_funcs(void); 175 void print_printk(void); 176 177 int parse_ftrace_file(char *buf, unsigned long size); 178 int parse_event_file(char *buf, unsigned long size, char *sys); 179 void print_event(int cpu, void *data, int size, unsigned long long nsecs, 180 char *comm); 181 182 extern int file_bigendian; 183 extern int host_bigendian; 184 185 int bigendian(void); 186 187 static 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 200 static 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 215 static 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 243 extern int header_page_ts_offset; 244 extern int header_page_ts_size; 245 extern int header_page_size_offset; 246 extern int header_page_size_size; 247 extern int header_page_data_offset; 248 extern int header_page_data_size; 249 250 extern bool latency_format; 251 252 int trace_parse_common_type(void *data); 253 int trace_parse_common_pid(void *data); 254 int parse_common_pc(void *data); 255 int parse_common_flags(void *data); 256 int parse_common_lock_depth(void *data); 257 struct event *trace_find_event(int id); 258 struct event *trace_find_next_event(struct event *event); 259 unsigned long long read_size(void *ptr, int size); 260 unsigned long long 261 raw_field_value(struct event *event, const char *name, void *data); 262 void *raw_field_ptr(struct event *event, const char *name, void *data); 263 unsigned long long eval_flag(const char *flag); 264 265 int read_tracing_data(int fd, struct list_head *pattrs); 266 ssize_t read_tracing_data_size(int fd, struct list_head *pattrs); 267 268 /* taken from kernel/trace/trace.h */ 269 enum trace_flag_type { 270 TRACE_FLAG_IRQS_OFF = 0x01, 271 TRACE_FLAG_IRQS_NOSUPPORT = 0x02, 272 TRACE_FLAG_NEED_RESCHED = 0x04, 273 TRACE_FLAG_HARDIRQ = 0x08, 274 TRACE_FLAG_SOFTIRQ = 0x10, 275 }; 276 277 struct scripting_ops { 278 const char *name; 279 int (*start_script) (const char *script, int argc, const char **argv); 280 int (*stop_script) (void); 281 void (*process_event) (int cpu, void *data, int size, 282 unsigned long long nsecs, char *comm); 283 int (*generate_script) (const char *outfile); 284 }; 285 286 int script_spec_register(const char *spec, struct scripting_ops *ops); 287 288 void setup_perl_scripting(void); 289 void setup_python_scripting(void); 290 291 struct scripting_context { 292 void *event_data; 293 }; 294 295 int common_pc(struct scripting_context *context); 296 int common_flags(struct scripting_context *context); 297 int common_lock_depth(struct scripting_context *context); 298 299 #endif /* __PERF_TRACE_EVENTS_H */ 300