root/tools/perf/util/event.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. perf_sample__synth_ptr
  2. perf_synth__raw_data

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __PERF_RECORD_H
   3 #define __PERF_RECORD_H
   4 /*
   5  * The linux/stddef.h isn't need here, but is needed for __always_inline used
   6  * in files included from uapi/linux/perf_event.h such as
   7  * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
   8  * detected in at least musl libc, used in Alpine Linux. -acme
   9  */
  10 #include <stdio.h>
  11 #include <linux/stddef.h>
  12 #include <perf/event.h>
  13 #include <linux/types.h>
  14 
  15 #include "perf_regs.h"
  16 
  17 struct dso;
  18 struct machine;
  19 struct perf_event_attr;
  20 
  21 #ifdef __LP64__
  22 /*
  23  * /usr/include/inttypes.h uses just 'lu' for PRIu64, but we end up defining
  24  * __u64 as long long unsigned int, and then -Werror=format= kicks in and
  25  * complains of the mismatched types, so use these two special extra PRI
  26  * macros to overcome that.
  27  */
  28 #define PRI_lu64 "l" PRIu64
  29 #define PRI_lx64 "l" PRIx64
  30 #define PRI_ld64 "l" PRId64
  31 #else
  32 #define PRI_lu64 PRIu64
  33 #define PRI_lx64 PRIx64
  34 #define PRI_ld64 PRId64
  35 #endif
  36 
  37 #define PERF_SAMPLE_MASK                                \
  38         (PERF_SAMPLE_IP | PERF_SAMPLE_TID |             \
  39          PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |          \
  40         PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |        \
  41          PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |         \
  42          PERF_SAMPLE_IDENTIFIER)
  43 
  44 /* perf sample has 16 bits size limit */
  45 #define PERF_SAMPLE_MAX_SIZE (1 << 16)
  46 
  47 struct regs_dump {
  48         u64 abi;
  49         u64 mask;
  50         u64 *regs;
  51 
  52         /* Cached values/mask filled by first register access. */
  53         u64 cache_regs[PERF_REGS_MAX];
  54         u64 cache_mask;
  55 };
  56 
  57 struct stack_dump {
  58         u16 offset;
  59         u64 size;
  60         char *data;
  61 };
  62 
  63 struct sample_read_value {
  64         u64 value;
  65         u64 id;
  66 };
  67 
  68 struct sample_read {
  69         u64 time_enabled;
  70         u64 time_running;
  71         union {
  72                 struct {
  73                         u64 nr;
  74                         struct sample_read_value *values;
  75                 } group;
  76                 struct sample_read_value one;
  77         };
  78 };
  79 
  80 struct ip_callchain {
  81         u64 nr;
  82         u64 ips[0];
  83 };
  84 
  85 struct branch_stack;
  86 
  87 enum {
  88         PERF_IP_FLAG_BRANCH             = 1ULL << 0,
  89         PERF_IP_FLAG_CALL               = 1ULL << 1,
  90         PERF_IP_FLAG_RETURN             = 1ULL << 2,
  91         PERF_IP_FLAG_CONDITIONAL        = 1ULL << 3,
  92         PERF_IP_FLAG_SYSCALLRET         = 1ULL << 4,
  93         PERF_IP_FLAG_ASYNC              = 1ULL << 5,
  94         PERF_IP_FLAG_INTERRUPT          = 1ULL << 6,
  95         PERF_IP_FLAG_TX_ABORT           = 1ULL << 7,
  96         PERF_IP_FLAG_TRACE_BEGIN        = 1ULL << 8,
  97         PERF_IP_FLAG_TRACE_END          = 1ULL << 9,
  98         PERF_IP_FLAG_IN_TX              = 1ULL << 10,
  99 };
 100 
 101 #define PERF_IP_FLAG_CHARS "bcrosyiABEx"
 102 
 103 #define PERF_BRANCH_MASK                (\
 104         PERF_IP_FLAG_BRANCH             |\
 105         PERF_IP_FLAG_CALL               |\
 106         PERF_IP_FLAG_RETURN             |\
 107         PERF_IP_FLAG_CONDITIONAL        |\
 108         PERF_IP_FLAG_SYSCALLRET         |\
 109         PERF_IP_FLAG_ASYNC              |\
 110         PERF_IP_FLAG_INTERRUPT          |\
 111         PERF_IP_FLAG_TX_ABORT           |\
 112         PERF_IP_FLAG_TRACE_BEGIN        |\
 113         PERF_IP_FLAG_TRACE_END)
 114 
 115 #define MAX_INSN 16
 116 
 117 struct perf_sample {
 118         u64 ip;
 119         u32 pid, tid;
 120         u64 time;
 121         u64 addr;
 122         u64 id;
 123         u64 stream_id;
 124         u64 period;
 125         u64 weight;
 126         u64 transaction;
 127         u64 insn_cnt;
 128         u64 cyc_cnt;
 129         u32 cpu;
 130         u32 raw_size;
 131         u64 data_src;
 132         u64 phys_addr;
 133         u32 flags;
 134         u16 insn_len;
 135         u8  cpumode;
 136         u16 misc;
 137         char insn[MAX_INSN];
 138         void *raw_data;
 139         struct ip_callchain *callchain;
 140         struct branch_stack *branch_stack;
 141         struct regs_dump  user_regs;
 142         struct regs_dump  intr_regs;
 143         struct stack_dump user_stack;
 144         struct sample_read read;
 145 };
 146 
 147 #define PERF_MEM_DATA_SRC_NONE \
 148         (PERF_MEM_S(OP, NA) |\
 149          PERF_MEM_S(LVL, NA) |\
 150          PERF_MEM_S(SNOOP, NA) |\
 151          PERF_MEM_S(LOCK, NA) |\
 152          PERF_MEM_S(TLB, NA))
 153 
 154 /* Attribute type for custom synthesized events */
 155 #define PERF_TYPE_SYNTH         (INT_MAX + 1U)
 156 
 157 /* Attribute config for custom synthesized events */
 158 enum perf_synth_id {
 159         PERF_SYNTH_INTEL_PTWRITE,
 160         PERF_SYNTH_INTEL_MWAIT,
 161         PERF_SYNTH_INTEL_PWRE,
 162         PERF_SYNTH_INTEL_EXSTOP,
 163         PERF_SYNTH_INTEL_PWRX,
 164         PERF_SYNTH_INTEL_CBR,
 165 };
 166 
 167 /*
 168  * Raw data formats for synthesized events. Note that 4 bytes of padding are
 169  * present to match the 'size' member of PERF_SAMPLE_RAW data which is always
 170  * 8-byte aligned. That means we must dereference raw_data with an offset of 4.
 171  * Refer perf_sample__synth_ptr() and perf_synth__raw_data().  It also means the
 172  * structure sizes are 4 bytes bigger than the raw_size, refer
 173  * perf_synth__raw_size().
 174  */
 175 
 176 struct perf_synth_intel_ptwrite {
 177         u32 padding;
 178         union {
 179                 struct {
 180                         u32     ip              :  1,
 181                                 reserved        : 31;
 182                 };
 183                 u32     flags;
 184         };
 185         u64     payload;
 186 };
 187 
 188 struct perf_synth_intel_mwait {
 189         u32 padding;
 190         u32 reserved;
 191         union {
 192                 struct {
 193                         u64     hints           :  8,
 194                                 reserved1       : 24,
 195                                 extensions      :  2,
 196                                 reserved2       : 30;
 197                 };
 198                 u64     payload;
 199         };
 200 };
 201 
 202 struct perf_synth_intel_pwre {
 203         u32 padding;
 204         u32 reserved;
 205         union {
 206                 struct {
 207                         u64     reserved1       :  7,
 208                                 hw              :  1,
 209                                 subcstate       :  4,
 210                                 cstate          :  4,
 211                                 reserved2       : 48;
 212                 };
 213                 u64     payload;
 214         };
 215 };
 216 
 217 struct perf_synth_intel_exstop {
 218         u32 padding;
 219         union {
 220                 struct {
 221                         u32     ip              :  1,
 222                                 reserved        : 31;
 223                 };
 224                 u32     flags;
 225         };
 226 };
 227 
 228 struct perf_synth_intel_pwrx {
 229         u32 padding;
 230         u32 reserved;
 231         union {
 232                 struct {
 233                         u64     deepest_cstate  :  4,
 234                                 last_cstate     :  4,
 235                                 wake_reason     :  4,
 236                                 reserved1       : 52;
 237                 };
 238                 u64     payload;
 239         };
 240 };
 241 
 242 struct perf_synth_intel_cbr {
 243         u32 padding;
 244         union {
 245                 struct {
 246                         u32     cbr             :  8,
 247                                 reserved1       :  8,
 248                                 max_nonturbo    :  8,
 249                                 reserved2       :  8;
 250                 };
 251                 u32     flags;
 252         };
 253         u32 freq;
 254         u32 reserved3;
 255 };
 256 
 257 /*
 258  * raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get
 259  * 8-byte alignment.
 260  */
 261 static inline void *perf_sample__synth_ptr(struct perf_sample *sample)
 262 {
 263         return sample->raw_data - 4;
 264 }
 265 
 266 static inline void *perf_synth__raw_data(void *p)
 267 {
 268         return p + 4;
 269 }
 270 
 271 #define perf_synth__raw_size(d) (sizeof(d) - 4)
 272 
 273 #define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4)
 274 
 275 enum {
 276         PERF_STAT_ROUND_TYPE__INTERVAL  = 0,
 277         PERF_STAT_ROUND_TYPE__FINAL     = 1,
 278 };
 279 
 280 void perf_event__print_totals(void);
 281 
 282 struct perf_cpu_map;
 283 struct perf_record_stat_config;
 284 struct perf_stat_config;
 285 struct perf_tool;
 286 
 287 void perf_event__read_stat_config(struct perf_stat_config *config,
 288                                   struct perf_record_stat_config *event);
 289 
 290 int perf_event__process_comm(struct perf_tool *tool,
 291                              union perf_event *event,
 292                              struct perf_sample *sample,
 293                              struct machine *machine);
 294 int perf_event__process_lost(struct perf_tool *tool,
 295                              union perf_event *event,
 296                              struct perf_sample *sample,
 297                              struct machine *machine);
 298 int perf_event__process_lost_samples(struct perf_tool *tool,
 299                                      union perf_event *event,
 300                                      struct perf_sample *sample,
 301                                      struct machine *machine);
 302 int perf_event__process_aux(struct perf_tool *tool,
 303                             union perf_event *event,
 304                             struct perf_sample *sample,
 305                             struct machine *machine);
 306 int perf_event__process_itrace_start(struct perf_tool *tool,
 307                                      union perf_event *event,
 308                                      struct perf_sample *sample,
 309                                      struct machine *machine);
 310 int perf_event__process_switch(struct perf_tool *tool,
 311                                union perf_event *event,
 312                                struct perf_sample *sample,
 313                                struct machine *machine);
 314 int perf_event__process_namespaces(struct perf_tool *tool,
 315                                    union perf_event *event,
 316                                    struct perf_sample *sample,
 317                                    struct machine *machine);
 318 int perf_event__process_mmap(struct perf_tool *tool,
 319                              union perf_event *event,
 320                              struct perf_sample *sample,
 321                              struct machine *machine);
 322 int perf_event__process_mmap2(struct perf_tool *tool,
 323                              union perf_event *event,
 324                              struct perf_sample *sample,
 325                              struct machine *machine);
 326 int perf_event__process_fork(struct perf_tool *tool,
 327                              union perf_event *event,
 328                              struct perf_sample *sample,
 329                              struct machine *machine);
 330 int perf_event__process_exit(struct perf_tool *tool,
 331                              union perf_event *event,
 332                              struct perf_sample *sample,
 333                              struct machine *machine);
 334 int perf_event__process_ksymbol(struct perf_tool *tool,
 335                                 union perf_event *event,
 336                                 struct perf_sample *sample,
 337                                 struct machine *machine);
 338 int perf_event__process_bpf(struct perf_tool *tool,
 339                             union perf_event *event,
 340                             struct perf_sample *sample,
 341                             struct machine *machine);
 342 int perf_event__process(struct perf_tool *tool,
 343                         union perf_event *event,
 344                         struct perf_sample *sample,
 345                         struct machine *machine);
 346 
 347 struct addr_location;
 348 
 349 int machine__resolve(struct machine *machine, struct addr_location *al,
 350                      struct perf_sample *sample);
 351 
 352 void addr_location__put(struct addr_location *al);
 353 
 354 struct thread;
 355 
 356 bool is_bts_event(struct perf_event_attr *attr);
 357 bool sample_addr_correlates_sym(struct perf_event_attr *attr);
 358 void thread__resolve(struct thread *thread, struct addr_location *al,
 359                      struct perf_sample *sample);
 360 
 361 const char *perf_event__name(unsigned int id);
 362 
 363 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 364 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
 365 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
 366 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
 367 size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
 368 size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
 369 size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);
 370 size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);
 371 size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
 372 size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
 373 size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
 374 size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
 375 size_t perf_event__fprintf(union perf_event *event, FILE *fp);
 376 
 377 int kallsyms__get_function_start(const char *kallsyms_filename,
 378                                  const char *symbol_name, u64 *addr);
 379 
 380 void *cpu_map_data__alloc(struct perf_cpu_map *map, size_t *size, u16 *type, int *max);
 381 void  cpu_map_data__synthesize(struct perf_record_cpu_map_data *data, struct perf_cpu_map *map,
 382                                u16 type, int max);
 383 
 384 void event_attr_init(struct perf_event_attr *attr);
 385 
 386 int perf_event_paranoid(void);
 387 bool perf_event_paranoid_check(int max_level);
 388 
 389 extern int sysctl_perf_event_max_stack;
 390 extern int sysctl_perf_event_max_contexts_per_stack;
 391 extern unsigned int proc_map_timeout;
 392 
 393 #endif /* __PERF_RECORD_H */

/* [<][>][^][v][top][bottom][index][help] */