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