Home | History | Annotate | Download | only in kernel
      1 // Copied from kernel sources. See COPYING for license details.
      2 
      3 #ifndef PERF_INTERNALS_H_
      4 #define PERF_INTERNALS_H_
      5 
      6 #include <linux/limits.h>
      7 #include <stddef.h>  // For NULL
      8 #include <stdint.h>
      9 #include <sys/types.h>  // For pid_t
     10 
     11 #include "perf_event.h"
     12 
     13 namespace quipper {
     14 
     15 // These typedefs are from tools/perf/util/types.h in the kernel.
     16 typedef uint64_t u64;
     17 typedef int64_t s64;
     18 typedef unsigned int u32;
     19 typedef signed int s32;
     20 typedef unsigned short u16;
     21 typedef signed short s16;
     22 typedef unsigned char u8;
     23 typedef signed char s8;
     24 
     25 // The first 64 bits of the perf header, used as a perf data file ID tag.
     26 const uint64_t kPerfMagic = 0x32454c4946524550LL;  // "PERFILE2" little-endian
     27 
     28 // These data structures have been copied from the kernel. See files under
     29 // tools/perf/util.
     30 
     31 //
     32 // From tools/perf/util/header.h
     33 //
     34 
     35 enum {
     36   HEADER_RESERVED = 0, /* always cleared */
     37   HEADER_FIRST_FEATURE = 1,
     38   HEADER_TRACING_DATA = 1,
     39   HEADER_BUILD_ID,
     40 
     41   HEADER_HOSTNAME,
     42   HEADER_OSRELEASE,
     43   HEADER_VERSION,
     44   HEADER_ARCH,
     45   HEADER_NRCPUS,
     46   HEADER_CPUDESC,
     47   HEADER_CPUID,
     48   HEADER_TOTAL_MEM,
     49   HEADER_CMDLINE,
     50   HEADER_EVENT_DESC,
     51   HEADER_CPU_TOPOLOGY,
     52   HEADER_NUMA_TOPOLOGY,
     53   HEADER_BRANCH_STACK,
     54   HEADER_PMU_MAPPINGS,
     55   HEADER_GROUP_DESC,
     56   HEADER_LAST_FEATURE,
     57   HEADER_FEAT_BITS = 256,
     58 };
     59 
     60 struct perf_file_section {
     61   u64 offset;
     62   u64 size;
     63 };
     64 
     65 struct perf_file_attr {
     66   struct perf_event_attr attr;
     67   struct perf_file_section ids;
     68 };
     69 
     70 #define BITS_PER_BYTE 8
     71 #define DIV_ROUND_UP(n, d) (((n) + (d)-1) / (d))
     72 #define BITS_TO_LONGS(nr) \
     73   DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
     74 
     75 #define DECLARE_BITMAP(name, bits) \
     76   unsigned long name[BITS_TO_LONGS(bits)]
     77 
     78 struct perf_file_header {
     79   u64 magic;
     80   u64 size;
     81   u64 attr_size;
     82   struct perf_file_section attrs;
     83   struct perf_file_section data;
     84   struct perf_file_section event_types;
     85   DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
     86 };
     87 
     88 #undef BITS_PER_BYTE
     89 #undef DIV_ROUND_UP
     90 #undef BITS_TO_LONGS
     91 #undef DECLARE_BITMAP
     92 
     93 struct perf_pipe_file_header {
     94   u64 magic;
     95   u64 size;
     96 };
     97 
     98 //
     99 // From tools/perf/util/event.h
    100 //
    101 
    102 struct mmap_event {
    103   struct perf_event_header header;
    104   u32 pid, tid;
    105   u64 start;
    106   u64 len;
    107   u64 pgoff;
    108   char filename[PATH_MAX];
    109 };
    110 
    111 struct mmap2_event {
    112   struct perf_event_header header;
    113   u32 pid, tid;
    114   u64 start;
    115   u64 len;
    116   u64 pgoff;
    117   u32 maj;
    118   u32 min;
    119   u64 ino;
    120   u64 ino_generation;
    121   u32 prot;
    122   u32 flags;
    123   char filename[PATH_MAX];
    124 };
    125 
    126 struct comm_event {
    127   struct perf_event_header header;
    128   u32 pid, tid;
    129   char comm[16];
    130 };
    131 
    132 struct fork_event {
    133   struct perf_event_header header;
    134   u32 pid, ppid;
    135   u32 tid, ptid;
    136   u64 time;
    137 };
    138 
    139 struct lost_event {
    140   struct perf_event_header header;
    141   u64 id;
    142   u64 lost;
    143 };
    144 
    145 /*
    146  * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
    147  */
    148 struct read_event {
    149   struct perf_event_header header;
    150   u32 pid, tid;
    151   u64 value;
    152   u64 time_enabled;
    153   u64 time_running;
    154   u64 id;
    155 };
    156 
    157 struct throttle_event {
    158   struct perf_event_header header;
    159   u64 time;
    160   u64 id;
    161   u64 stream_id;
    162 };
    163 
    164 #define PERF_SAMPLE_MASK                                                    \
    165   (PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \
    166    PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | PERF_SAMPLE_CPU |               \
    167    PERF_SAMPLE_PERIOD | PERF_SAMPLE_IDENTIFIER)
    168 
    169 /* perf sample has 16 bits size limit */
    170 #define PERF_SAMPLE_MAX_SIZE (1 << 16)
    171 
    172 struct sample_event {
    173   struct perf_event_header header;
    174   u64 array[];
    175 };
    176 
    177 #if 0
    178 // PERF_REGS_MAX is arch-dependent, so this is not a useful struct as-is.
    179 struct regs_dump {
    180   u64 abi;
    181   u64 mask;
    182   u64 *regs;
    183 
    184   /* Cached values/mask filled by first register access. */
    185   u64 cache_regs[PERF_REGS_MAX];
    186   u64 cache_mask;
    187 };
    188 #endif
    189 
    190 struct stack_dump {
    191   u16 offset;
    192   u64 size;
    193   char *data;
    194 };
    195 
    196 struct sample_read_value {
    197   u64 value;
    198   u64 id;
    199 };
    200 
    201 struct sample_read {
    202   u64 time_enabled;
    203   u64 time_running;
    204   struct {
    205     struct {
    206       u64 nr;
    207       struct sample_read_value *values;
    208     } group;
    209     struct sample_read_value one;
    210   };
    211 };
    212 
    213 struct ip_callchain {
    214   u64 nr;
    215   u64 ips[0];
    216 };
    217 
    218 struct branch_flags {
    219   u64 mispred : 1;
    220   u64 predicted : 1;
    221   u64 in_tx : 1;
    222   u64 abort : 1;
    223   u64 reserved : 60;
    224 };
    225 
    226 struct branch_entry {
    227   u64 from;
    228   u64 to;
    229   struct branch_flags flags;
    230 };
    231 
    232 struct branch_stack {
    233   u64 nr;
    234   struct branch_entry entries[0];
    235 };
    236 
    237 // All the possible fields of a perf sample.  This is not an actual data
    238 // structure found in raw perf data, as each field may or may not be present in
    239 // the data.
    240 struct perf_sample {
    241   u64 ip;
    242   u32 pid, tid;
    243   u64 time;
    244   u64 addr;
    245   u64 id;
    246   u64 stream_id;
    247   u64 period;
    248   u64 weight;
    249   u64 transaction;
    250   u32 cpu;
    251   u32 raw_size;
    252   u64 data_src;
    253   u32 flags;
    254   u16 insn_len;
    255   void *raw_data;
    256   struct ip_callchain *callchain;
    257   struct branch_stack *branch_stack;
    258   // struct regs_dump  user_regs;  // See struct regs_dump above.
    259   struct stack_dump user_stack;
    260   struct sample_read read;
    261 
    262   perf_sample() : raw_data(NULL), callchain(NULL), branch_stack(NULL) {
    263     read.group.values = NULL;
    264   }
    265   ~perf_sample() {
    266     delete[] callchain;
    267     delete[] branch_stack;
    268     delete[] reinterpret_cast<char *>(raw_data);
    269     delete[] read.group.values;
    270   }
    271 };
    272 
    273 // Taken from tools/perf/util/include/linux/kernel.h
    274 #define ALIGN(x, a) __ALIGN_MASK(x, (decltype(x))(a)-1)
    275 #define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
    276 
    277 // If this is changed, kBuildIDArraySize in perf_reader.h must also be changed.
    278 #define BUILD_ID_SIZE 20
    279 
    280 struct build_id_event {
    281   struct perf_event_header header;
    282   pid_t pid;
    283   u8 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))];
    284   char filename[];
    285 };
    286 
    287 #undef ALIGN
    288 #undef __ALIGN_MASK
    289 #undef BUILD_ID_SIZE
    290 
    291 enum perf_user_event_type {
    292   /* above any possible kernel type */
    293   PERF_RECORD_USER_TYPE_START = 64,
    294   PERF_RECORD_HEADER_ATTR = 64,
    295   PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */
    296   PERF_RECORD_HEADER_TRACING_DATA = 66,
    297   PERF_RECORD_HEADER_BUILD_ID = 67,
    298   PERF_RECORD_FINISHED_ROUND = 68,
    299   PERF_RECORD_ID_INDEX = 69,
    300   PERF_RECORD_AUXTRACE_INFO = 70,
    301   PERF_RECORD_AUXTRACE = 71,
    302   PERF_RECORD_AUXTRACE_ERROR = 72,
    303   PERF_RECORD_THREAD_MAP = 73,
    304   PERF_RECORD_CPU_MAP = 74,
    305   PERF_RECORD_STAT_CONFIG = 75,
    306   PERF_RECORD_STAT = 76,
    307   PERF_RECORD_STAT_ROUND = 77,
    308   PERF_RECORD_EVENT_UPDATE = 78,
    309   PERF_RECORD_TIME_CONV = 79,
    310   PERF_RECORD_HEADER_FEATURE = 80,
    311   PERF_RECORD_HEADER_MAX = 81,
    312 };
    313 
    314 struct attr_event {
    315   struct perf_event_header header;
    316   struct perf_event_attr attr;
    317   u64 id[];
    318 };
    319 
    320 #define MAX_EVENT_NAME 64
    321 
    322 struct perf_trace_event_type {
    323   u64 event_id;
    324   char name[MAX_EVENT_NAME];
    325 };
    326 
    327 #undef MAX_EVENT_NAME
    328 
    329 struct event_type_event {
    330   struct perf_event_header header;
    331   struct perf_trace_event_type event_type;
    332 };
    333 
    334 struct tracing_data_event {
    335   struct perf_event_header header;
    336   u32 size;
    337 };
    338 
    339 struct auxtrace_event {
    340   struct perf_event_header header;
    341   u64 size;
    342   u64 offset;
    343   u64 reference;
    344   u32 idx;
    345   u32 tid;
    346   u32 cpu;
    347   u32 reserved__; /* For alignment */
    348 };
    349 
    350 struct aux_event {
    351   struct perf_event_header header;
    352   u64 aux_offset;
    353   u64 aux_size;
    354   u64 flags;
    355 };
    356 
    357 union perf_event {
    358   struct perf_event_header header;
    359   struct mmap_event mmap;
    360   struct mmap2_event mmap2;
    361   struct comm_event comm;
    362   struct fork_event fork;
    363   struct lost_event lost;
    364   struct read_event read;
    365   struct throttle_event throttle;
    366   struct sample_event sample;
    367   struct attr_event attr;
    368   struct event_type_event event_type;
    369   struct tracing_data_event tracing_data;
    370   struct build_id_event build_id;
    371   struct auxtrace_event auxtrace;
    372   struct aux_event aux;
    373 };
    374 
    375 typedef perf_event event_t;
    376 
    377 }  // namespace quipper
    378 
    379 #endif /*PERF_INTERNALS_H_*/
    380