linux/tools/perf/util/trace-event.h
<<
>>
Prefs
   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#define __unused __attribute__((unused))
   9
  10
  11#ifndef PAGE_MASK
  12#define PAGE_MASK (page_size - 1)
  13#endif
  14
  15enum {
  16        RINGBUF_TYPE_PADDING            = 29,
  17        RINGBUF_TYPE_TIME_EXTEND        = 30,
  18        RINGBUF_TYPE_TIME_STAMP         = 31,
  19};
  20
  21#ifndef TS_SHIFT
  22#define TS_SHIFT                27
  23#endif
  24
  25#define NSECS_PER_SEC           1000000000ULL
  26#define NSECS_PER_USEC          1000ULL
  27
  28enum format_flags {
  29        FIELD_IS_ARRAY          = 1,
  30        FIELD_IS_POINTER        = 2,
  31        FIELD_IS_SIGNED         = 4,
  32        FIELD_IS_STRING         = 8,
  33        FIELD_IS_DYNAMIC        = 16,
  34        FIELD_IS_FLAG           = 32,
  35        FIELD_IS_SYMBOLIC       = 64,
  36};
  37
  38struct format_field {
  39        struct format_field     *next;
  40        char                    *type;
  41        char                    *name;
  42        int                     offset;
  43        int                     size;
  44        unsigned long           flags;
  45};
  46
  47struct format {
  48        int                     nr_common;
  49        int                     nr_fields;
  50        struct format_field     *common_fields;
  51        struct format_field     *fields;
  52};
  53
  54struct print_arg_atom {
  55        char                    *atom;
  56};
  57
  58struct print_arg_string {
  59        char                    *string;
  60        int                     offset;
  61};
  62
  63struct print_arg_field {
  64        char                    *name;
  65        struct format_field     *field;
  66};
  67
  68struct print_flag_sym {
  69        struct print_flag_sym   *next;
  70        char                    *value;
  71        char                    *str;
  72};
  73
  74struct print_arg_typecast {
  75        char                    *type;
  76        struct print_arg        *item;
  77};
  78
  79struct print_arg_flags {
  80        struct print_arg        *field;
  81        char                    *delim;
  82        struct print_flag_sym   *flags;
  83};
  84
  85struct print_arg_symbol {
  86        struct print_arg        *field;
  87        struct print_flag_sym   *symbols;
  88};
  89
  90struct print_arg;
  91
  92struct print_arg_op {
  93        char                    *op;
  94        int                     prio;
  95        struct print_arg        *left;
  96        struct print_arg        *right;
  97};
  98
  99struct print_arg_func {
 100        char                    *name;
 101        struct print_arg        *args;
 102};
 103
 104enum print_arg_type {
 105        PRINT_NULL,
 106        PRINT_ATOM,
 107        PRINT_FIELD,
 108        PRINT_FLAGS,
 109        PRINT_SYMBOL,
 110        PRINT_TYPE,
 111        PRINT_STRING,
 112        PRINT_OP,
 113};
 114
 115struct print_arg {
 116        struct print_arg                *next;
 117        enum print_arg_type             type;
 118        union {
 119                struct print_arg_atom           atom;
 120                struct print_arg_field          field;
 121                struct print_arg_typecast       typecast;
 122                struct print_arg_flags          flags;
 123                struct print_arg_symbol         symbol;
 124                struct print_arg_func           func;
 125                struct print_arg_string         string;
 126                struct print_arg_op             op;
 127        };
 128};
 129
 130struct print_fmt {
 131        char                    *format;
 132        struct print_arg        *args;
 133};
 134
 135struct event {
 136        struct event            *next;
 137        char                    *name;
 138        int                     id;
 139        int                     flags;
 140        struct format           format;
 141        struct print_fmt        print_fmt;
 142        char                    *system;
 143};
 144
 145enum {
 146        EVENT_FL_ISFTRACE       = 0x01,
 147        EVENT_FL_ISPRINT        = 0x02,
 148        EVENT_FL_ISBPRINT       = 0x04,
 149        EVENT_FL_ISFUNC         = 0x08,
 150        EVENT_FL_ISFUNCENT      = 0x10,
 151        EVENT_FL_ISFUNCRET      = 0x20,
 152
 153        EVENT_FL_FAILED         = 0x80000000
 154};
 155
 156struct record {
 157        unsigned long long ts;
 158        int size;
 159        void *data;
 160};
 161
 162struct record *trace_peek_data(int cpu);
 163struct record *trace_read_data(int cpu);
 164
 165void parse_set_info(int nr_cpus, int long_sz);
 166
 167ssize_t trace_report(int fd, bool repipe);
 168
 169void *malloc_or_die(unsigned int size);
 170
 171void parse_cmdlines(char *file, int size);
 172void parse_proc_kallsyms(char *file, unsigned int size);
 173void parse_ftrace_printk(char *file, unsigned int size);
 174
 175void print_funcs(void);
 176void print_printk(void);
 177
 178int parse_ftrace_file(char *buf, unsigned long size);
 179int parse_event_file(char *buf, unsigned long size, char *sys);
 180void print_trace_event(int cpu, void *data, int size);
 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 list_head *pattrs);
 266ssize_t read_tracing_data_size(int fd, struct list_head *pattrs);
 267
 268/* taken from kernel/trace/trace.h */
 269enum 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
 277struct 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) (union perf_event *event,
 282                               struct perf_sample *sample,
 283                               struct perf_evsel *evsel,
 284                               struct perf_session *session,
 285                               struct thread *thread);
 286        int (*generate_script) (const char *outfile);
 287};
 288
 289int script_spec_register(const char *spec, struct scripting_ops *ops);
 290
 291void setup_perl_scripting(void);
 292void setup_python_scripting(void);
 293
 294struct scripting_context {
 295        void *event_data;
 296};
 297
 298int common_pc(struct scripting_context *context);
 299int common_flags(struct scripting_context *context);
 300int common_lock_depth(struct scripting_context *context);
 301
 302#endif /* __PERF_TRACE_EVENTS_H */
 303