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
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.