Blame view
include/uapi/linux/perf_event.h
28 KB
607ca46e9 UAPI: (Scripted) ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
/* * Performance events: * * Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de> * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra * * Data type definitions, declarations, prototypes. * * Started by: Thomas Gleixner and Ingo Molnar * * For licencing details see kernel-base/COPYING */ #ifndef _UAPI_LINUX_PERF_EVENT_H #define _UAPI_LINUX_PERF_EVENT_H #include <linux/types.h> #include <linux/ioctl.h> #include <asm/byteorder.h> /* * User-space ABI bits: */ /* * attr.type */ enum perf_type_id { PERF_TYPE_HARDWARE = 0, PERF_TYPE_SOFTWARE = 1, PERF_TYPE_TRACEPOINT = 2, PERF_TYPE_HW_CACHE = 3, PERF_TYPE_RAW = 4, PERF_TYPE_BREAKPOINT = 5, PERF_TYPE_MAX, /* non-ABI */ }; /* * Generalized performance event event_id types, used by the * attr.event_id parameter of the sys_perf_event_open() * syscall: */ enum perf_hw_id { /* * Common hardware events, generalized by the kernel: */ PERF_COUNT_HW_CPU_CYCLES = 0, PERF_COUNT_HW_INSTRUCTIONS = 1, PERF_COUNT_HW_CACHE_REFERENCES = 2, PERF_COUNT_HW_CACHE_MISSES = 3, PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, PERF_COUNT_HW_BRANCH_MISSES = 5, PERF_COUNT_HW_BUS_CYCLES = 6, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, PERF_COUNT_HW_REF_CPU_CYCLES = 9, PERF_COUNT_HW_MAX, /* non-ABI */ }; /* * Generalized hardware cache events: * * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x * { read, write, prefetch } x * { accesses, misses } */ enum perf_hw_cache_id { PERF_COUNT_HW_CACHE_L1D = 0, PERF_COUNT_HW_CACHE_L1I = 1, PERF_COUNT_HW_CACHE_LL = 2, PERF_COUNT_HW_CACHE_DTLB = 3, PERF_COUNT_HW_CACHE_ITLB = 4, PERF_COUNT_HW_CACHE_BPU = 5, PERF_COUNT_HW_CACHE_NODE = 6, PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ }; enum perf_hw_cache_op_id { PERF_COUNT_HW_CACHE_OP_READ = 0, PERF_COUNT_HW_CACHE_OP_WRITE = 1, PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ }; enum perf_hw_cache_op_result_id { PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, PERF_COUNT_HW_CACHE_RESULT_MISS = 1, PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ }; /* * Special "software" events provided by the kernel, even if the hardware * does not support performance events. These events measure various * physical and sw events of the kernel (and allow the profiling of them as * well): */ enum perf_sw_ids { PERF_COUNT_SW_CPU_CLOCK = 0, PERF_COUNT_SW_TASK_CLOCK = 1, PERF_COUNT_SW_PAGE_FAULTS = 2, PERF_COUNT_SW_CONTEXT_SWITCHES = 3, PERF_COUNT_SW_CPU_MIGRATIONS = 4, PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, PERF_COUNT_SW_EMULATION_FAULTS = 8, |
fa0097ee6 perf: Add a dummy... |
112 |
PERF_COUNT_SW_DUMMY = 9, |
a43eec304 bpf: introduce bp... |
113 |
PERF_COUNT_SW_BPF_OUTPUT = 10, |
607ca46e9 UAPI: (Scripted) ... |
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
PERF_COUNT_SW_MAX, /* non-ABI */ }; /* * Bits that can be set in attr.sample_type to request information * in the overflow packets. */ enum perf_event_sample_format { PERF_SAMPLE_IP = 1U << 0, PERF_SAMPLE_TID = 1U << 1, PERF_SAMPLE_TIME = 1U << 2, PERF_SAMPLE_ADDR = 1U << 3, PERF_SAMPLE_READ = 1U << 4, PERF_SAMPLE_CALLCHAIN = 1U << 5, PERF_SAMPLE_ID = 1U << 6, PERF_SAMPLE_CPU = 1U << 7, PERF_SAMPLE_PERIOD = 1U << 8, PERF_SAMPLE_STREAM_ID = 1U << 9, PERF_SAMPLE_RAW = 1U << 10, PERF_SAMPLE_BRANCH_STACK = 1U << 11, PERF_SAMPLE_REGS_USER = 1U << 12, PERF_SAMPLE_STACK_USER = 1U << 13, |
c3feedf2a perf/core: Add we... |
137 |
PERF_SAMPLE_WEIGHT = 1U << 14, |
d6be9ad6c perf: Add generic... |
138 |
PERF_SAMPLE_DATA_SRC = 1U << 15, |
ff3d527ce perf: make events... |
139 |
PERF_SAMPLE_IDENTIFIER = 1U << 16, |
fdfbbd07e perf: Add generic... |
140 |
PERF_SAMPLE_TRANSACTION = 1U << 17, |
60e2364e6 perf: Add ability... |
141 |
PERF_SAMPLE_REGS_INTR = 1U << 18, |
c3feedf2a perf/core: Add we... |
142 |
|
60e2364e6 perf: Add ability... |
143 |
PERF_SAMPLE_MAX = 1U << 19, /* non-ABI */ |
607ca46e9 UAPI: (Scripted) ... |
144 145 146 147 148 149 150 151 152 153 154 155 |
}; /* * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set * * If the user does not pass priv level information via branch_sample_type, * the kernel uses the event's priv level. Branch and event priv levels do * not have to match. Branch priv level is checked for permissions. * * The branch types can be combined, however BRANCH_ANY covers all types * of branches and therefore it supersedes all the other types. */ |
27ac905b8 perf/x86/intel: R... |
156 157 158 159 160 161 162 163 164 165 166 167 168 |
enum perf_branch_sample_type_shift { PERF_SAMPLE_BRANCH_USER_SHIFT = 0, /* user branches */ PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, /* kernel branches */ PERF_SAMPLE_BRANCH_HV_SHIFT = 2, /* hypervisor branches */ PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, /* any branch types */ PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, /* any call branch */ PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, /* any return branch */ PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, /* indirect calls */ PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, /* transaction aborts */ PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, /* in transaction */ PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ |
2c44b1936 perf/x86/intel: E... |
169 |
PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ |
c9fdfa14c perf: add new PER... |
170 |
PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ |
c229bf9dc perf: Add PERF_SA... |
171 |
PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ |
2c44b1936 perf/x86/intel: E... |
172 |
|
b16a5b52e perf/x86: Add opt... |
173 174 |
PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, /* no flags */ PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, /* no cycles */ |
27ac905b8 perf/x86/intel: R... |
175 176 |
PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ }; |
607ca46e9 UAPI: (Scripted) ... |
177 |
enum perf_branch_sample_type { |
27ac905b8 perf/x86/intel: R... |
178 179 180 181 182 |
PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT, PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT, PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, |
2c44b1936 perf/x86/intel: E... |
183 184 185 186 |
PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, |
27ac905b8 perf/x86/intel: R... |
187 188 189 |
PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, |
2c44b1936 perf/x86/intel: E... |
190 |
PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, |
c9fdfa14c perf: add new PER... |
191 |
PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, |
c229bf9dc perf: Add PERF_SA... |
192 |
PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, |
2c44b1936 perf/x86/intel: E... |
193 |
|
b16a5b52e perf/x86: Add opt... |
194 195 |
PERF_SAMPLE_BRANCH_NO_FLAGS = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT, PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT, |
27ac905b8 perf/x86/intel: R... |
196 |
PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, |
607ca46e9 UAPI: (Scripted) ... |
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
}; #define PERF_SAMPLE_BRANCH_PLM_ALL \ (PERF_SAMPLE_BRANCH_USER|\ PERF_SAMPLE_BRANCH_KERNEL|\ PERF_SAMPLE_BRANCH_HV) /* * Values to determine ABI of the registers dump. */ enum perf_sample_regs_abi { PERF_SAMPLE_REGS_ABI_NONE = 0, PERF_SAMPLE_REGS_ABI_32 = 1, PERF_SAMPLE_REGS_ABI_64 = 2, }; /* |
fdfbbd07e perf: Add generic... |
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
* Values for the memory transaction event qualifier, mostly for * abort events. Multiple bits can be set. */ enum { PERF_TXN_ELISION = (1 << 0), /* From elision */ PERF_TXN_TRANSACTION = (1 << 1), /* From transaction */ PERF_TXN_SYNC = (1 << 2), /* Instruction is related */ PERF_TXN_ASYNC = (1 << 3), /* Instruction not related */ PERF_TXN_RETRY = (1 << 4), /* Retry possible */ PERF_TXN_CONFLICT = (1 << 5), /* Conflict abort */ PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */ PERF_TXN_CAPACITY_READ = (1 << 7), /* Capacity read abort */ PERF_TXN_MAX = (1 << 8), /* non-ABI */ /* bits 32..63 are reserved for the abort code */ PERF_TXN_ABORT_MASK = (0xffffffffULL << 32), PERF_TXN_ABORT_SHIFT = 32, }; /* |
607ca46e9 UAPI: (Scripted) ... |
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
* The format of the data returned by read() on a perf event fd, * as specified by attr.read_format: * * struct read_format { * { u64 value; * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING * { u64 id; } && PERF_FORMAT_ID * } && !PERF_FORMAT_GROUP * * { u64 nr; * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING * { u64 value; * { u64 id; } && PERF_FORMAT_ID * } cntr[nr]; * } && PERF_FORMAT_GROUP * }; */ enum perf_event_read_format { PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, PERF_FORMAT_ID = 1U << 2, PERF_FORMAT_GROUP = 1U << 3, PERF_FORMAT_MAX = 1U << 4, /* non-ABI */ }; #define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ #define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ #define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ #define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ /* add: sample_stack_user */ |
60e2364e6 perf: Add ability... |
269 |
#define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ |
1a5941312 perf: Add wakeup ... |
270 |
#define PERF_ATTR_SIZE_VER5 112 /* add: aux_watermark */ |
607ca46e9 UAPI: (Scripted) ... |
271 272 273 |
/* * Hardware event_id to monitor via a performance monitoring event: |
97c79a38c perf core: Per ev... |
274 275 276 |
* * @sample_max_stack: Max number of frame pointers in a callchain, * should be < /proc/sys/kernel/perf_event_max_stack |
607ca46e9 UAPI: (Scripted) ... |
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
*/ struct perf_event_attr { /* * Major type: hardware/software/tracepoint/etc. */ __u32 type; /* * Size of the attr structure, for fwd/bwd compat. */ __u32 size; /* * Type specific configuration information. */ __u64 config; union { __u64 sample_period; __u64 sample_freq; }; __u64 sample_type; __u64 read_format; __u64 disabled : 1, /* off by default */ inherit : 1, /* children inherit it */ pinned : 1, /* must always be on PMU */ exclusive : 1, /* only group on PMU */ exclude_user : 1, /* don't count user */ exclude_kernel : 1, /* ditto kernel */ exclude_hv : 1, /* ditto hypervisor */ exclude_idle : 1, /* don't count when idle */ mmap : 1, /* include mmap data */ comm : 1, /* include comm data */ freq : 1, /* use freq, not period */ inherit_stat : 1, /* per task counts */ enable_on_exec : 1, /* next exec enables */ task : 1, /* trace fork/exit */ watermark : 1, /* wakeup_watermark */ /* * precise_ip: * * 0 - SAMPLE_IP can have arbitrary skid * 1 - SAMPLE_IP must have constant skid * 2 - SAMPLE_IP requested to have 0 skid * 3 - SAMPLE_IP must have 0 skid * * See also PERF_RECORD_MISC_EXACT_IP */ precise_ip : 2, /* skid constraint */ mmap_data : 1, /* non-exec mmap data */ sample_id_all : 1, /* sample_type all events */ exclude_host : 1, /* don't count in host */ exclude_guest : 1, /* don't count in guest */ exclude_callchain_kernel : 1, /* exclude kernel callchains */ exclude_callchain_user : 1, /* exclude user callchains */ |
13d7a2410 perf: Add attr->m... |
337 |
mmap2 : 1, /* include mmap with inode data */ |
82b897782 perf: Differentia... |
338 |
comm_exec : 1, /* flag comm events that are due to an exec */ |
34f439278 perf: Add per eve... |
339 |
use_clockid : 1, /* use @clockid for time fields */ |
45ac1403f perf: Add PERF_RE... |
340 |
context_switch : 1, /* context switch data */ |
9ecda41ac perf/core: Add ::... |
341 342 |
write_backward : 1, /* Write ring buffer from end to beginning */ __reserved_1 : 36; |
607ca46e9 UAPI: (Scripted) ... |
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 |
union { __u32 wakeup_events; /* wakeup every n events */ __u32 wakeup_watermark; /* bytes before wakeup */ }; __u32 bp_type; union { __u64 bp_addr; __u64 config1; /* extension of config */ }; union { __u64 bp_len; __u64 config2; /* extension of config1 */ }; __u64 branch_sample_type; /* enum perf_branch_sample_type */ /* * Defines set of user regs to dump on samples. * See asm/perf_regs.h for details. */ __u64 sample_regs_user; /* * Defines size of the user stack to dump on samples. */ __u32 sample_stack_user; |
34f439278 perf: Add per eve... |
370 |
__s32 clockid; |
60e2364e6 perf: Add ability... |
371 372 373 374 375 376 377 378 379 |
/* * Defines set of regs to dump for each sample * state captured on: * - precise = 0: PMU interrupt * - precise > 0: sampled instruction * * See asm/perf_regs.h for details. */ __u64 sample_regs_intr; |
1a5941312 perf: Add wakeup ... |
380 381 382 383 384 |
/* * Wakeup watermark for AUX area */ __u32 aux_watermark; |
97c79a38c perf core: Per ev... |
385 386 |
__u16 sample_max_stack; __u16 __reserved_2; /* align to __u64 */ |
607ca46e9 UAPI: (Scripted) ... |
387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
}; #define perf_flags(attr) (*(&(attr)->read_format + 1)) /* * Ioctls that can be done on a perf event fd: */ #define PERF_EVENT_IOC_ENABLE _IO ('$', 0) #define PERF_EVENT_IOC_DISABLE _IO ('$', 1) #define PERF_EVENT_IOC_REFRESH _IO ('$', 2) #define PERF_EVENT_IOC_RESET _IO ('$', 3) #define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) #define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) #define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) |
a8e0108ca perf: Fix UAPI ex... |
401 |
#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) |
2541517c3 tracing, perf: Im... |
402 |
#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) |
86e7972f6 perf/ring_buffer:... |
403 |
#define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) |
607ca46e9 UAPI: (Scripted) ... |
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
enum perf_event_ioc_flags { PERF_IOC_FLAG_GROUP = 1U << 0, }; /* * Structure of the page that can be mapped via mmap */ struct perf_event_mmap_page { __u32 version; /* version number of this structure */ __u32 compat_version; /* lowest version this is compat with */ /* * Bits needed to read the hw events in user-space. * |
b438b1ab3 perf: Fix typos i... |
419 |
* u32 seq, time_mult, time_shift, index, width; |
607ca46e9 UAPI: (Scripted) ... |
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 |
* u64 count, enabled, running; * u64 cyc, time_offset; * s64 pmc = 0; * * do { * seq = pc->lock; * barrier() * * enabled = pc->time_enabled; * running = pc->time_running; * * if (pc->cap_usr_time && enabled != running) { * cyc = rdtsc(); * time_offset = pc->time_offset; * time_mult = pc->time_mult; * time_shift = pc->time_shift; * } * |
b438b1ab3 perf: Fix typos i... |
438 |
* index = pc->index; |
607ca46e9 UAPI: (Scripted) ... |
439 |
* count = pc->offset; |
b438b1ab3 perf: Fix typos i... |
440 |
* if (pc->cap_user_rdpmc && index) { |
607ca46e9 UAPI: (Scripted) ... |
441 |
* width = pc->pmc_width; |
b438b1ab3 perf: Fix typos i... |
442 |
* pmc = rdpmc(index - 1); |
607ca46e9 UAPI: (Scripted) ... |
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 |
* } * * barrier(); * } while (pc->lock != seq); * * NOTE: for obvious reason this only works on self-monitoring * processes. */ __u32 lock; /* seqlock for synchronization */ __u32 index; /* hardware event identifier */ __s64 offset; /* add to hardware event value */ __u64 time_enabled; /* time event active */ __u64 time_running; /* time event on cpu */ union { __u64 capabilities; |
860f085b7 perf: Fix broken ... |
458 |
struct { |
fa7315871 perf: Fix capabil... |
459 460 461 462 463 464 465 |
__u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ cap_user_time : 1, /* The time_* fields are used */ cap_user_time_zero : 1, /* The time_zero field is used */ cap_____res : 59; |
860f085b7 perf: Fix broken ... |
466 |
}; |
607ca46e9 UAPI: (Scripted) ... |
467 468 469 |
}; /* |
b438b1ab3 perf: Fix typos i... |
470 |
* If cap_user_rdpmc this field provides the bit-width of the value |
607ca46e9 UAPI: (Scripted) ... |
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 |
* read using the rdpmc() or equivalent instruction. This can be used * to sign extend the result like: * * pmc <<= 64 - width; * pmc >>= 64 - width; // signed shift right * count += pmc; */ __u16 pmc_width; /* * If cap_usr_time the below fields can be used to compute the time * delta since time_enabled (in ns) using rdtsc or similar. * * u64 quot, rem; * u64 delta; * * quot = (cyc >> time_shift); |
b9511cd76 perf/x86: Fix tim... |
488 |
* rem = cyc & (((u64)1 << time_shift) - 1); |
607ca46e9 UAPI: (Scripted) ... |
489 490 491 492 493 |
* delta = time_offset + quot * time_mult + * ((rem * time_mult) >> time_shift); * * Where time_offset,time_mult,time_shift and cyc are read in the * seqcount loop described above. This delta can then be added to |
b438b1ab3 perf: Fix typos i... |
494 |
* enabled and possible running (if index), improving the scaling: |
607ca46e9 UAPI: (Scripted) ... |
495 496 |
* * enabled += delta; |
b438b1ab3 perf: Fix typos i... |
497 |
* if (index) |
607ca46e9 UAPI: (Scripted) ... |
498 499 500 501 502 503 504 505 506 |
* running += delta; * * quot = count / running; * rem = count % running; * count = quot * enabled + (rem * enabled) / running; */ __u16 time_shift; __u32 time_mult; __u64 time_offset; |
c73deb6ae perf/x86: Add abi... |
507 508 509 510 511 512 513 514 515 516 517 518 |
/* * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated * from sample timestamps. * * time = timestamp - time_zero; * quot = time / time_mult; * rem = time % time_mult; * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; * * And vice versa: * * quot = cyc >> time_shift; |
b9511cd76 perf/x86: Fix tim... |
519 |
* rem = cyc & (((u64)1 << time_shift) - 1); |
c73deb6ae perf/x86: Add abi... |
520 521 522 523 |
* timestamp = time_zero + quot * time_mult + * ((rem * time_mult) >> time_shift); */ __u64 time_zero; |
fa7315871 perf: Fix capabil... |
524 |
__u32 size; /* Header size up to __reserved[] fields. */ |
607ca46e9 UAPI: (Scripted) ... |
525 526 527 528 |
/* * Hole for extension of the self monitor capabilities */ |
fa7315871 perf: Fix capabil... |
529 |
__u8 __reserved[118*8+4]; /* align to 1k. */ |
607ca46e9 UAPI: (Scripted) ... |
530 531 532 533 |
/* * Control data for the mmap() data buffer. * |
bf378d341 perf: Fix perf ri... |
534 535 |
* User-space reading the @data_head value should issue an smp_rmb(), * after reading this value. |
607ca46e9 UAPI: (Scripted) ... |
536 537 |
* * When the mapping is PROT_WRITE the @data_tail value should be |
bf378d341 perf: Fix perf ri... |
538 539 540 541 542 |
* written by userspace to reflect the last read data, after issueing * an smp_mb() to separate the data read from the ->data_tail store. * In this case the kernel will not over-write unread data. * * See perf_output_put_handle() for the data ordering. |
e8c6deac6 perf: Add data_{o... |
543 544 545 |
* * data_{offset,size} indicate the location and size of the perf record * buffer within the mmapped area. |
607ca46e9 UAPI: (Scripted) ... |
546 547 548 |
*/ __u64 data_head; /* head in the data section */ __u64 data_tail; /* user-space written tail */ |
e8c6deac6 perf: Add data_{o... |
549 550 |
__u64 data_offset; /* where the buffer starts */ __u64 data_size; /* data buffer size */ |
45bfb2e50 perf: Add AUX are... |
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 |
/* * AUX area is defined by aux_{offset,size} fields that should be set * by the userspace, so that * * aux_offset >= data_offset + data_size * * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. * * Ring buffer pointers aux_{head,tail} have the same semantics as * data_{head,tail} and same ordering rules apply. */ __u64 aux_head; __u64 aux_tail; __u64 aux_offset; __u64 aux_size; |
607ca46e9 UAPI: (Scripted) ... |
567 568 569 570 571 572 573 574 575 |
}; #define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) #define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) #define PERF_RECORD_MISC_KERNEL (1 << 0) #define PERF_RECORD_MISC_USER (2 << 0) #define PERF_RECORD_MISC_HYPERVISOR (3 << 0) #define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) #define PERF_RECORD_MISC_GUEST_USER (5 << 0) |
82b897782 perf: Differentia... |
576 |
/* |
930e6fcd2 perf tools: Add t... |
577 578 579 580 |
* Indicates that /proc/PID/maps parsing are truncated by time out. */ #define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) /* |
82b897782 perf: Differentia... |
581 582 |
* PERF_RECORD_MISC_MMAP_DATA and PERF_RECORD_MISC_COMM_EXEC are used on * different events so can reuse the same bit position. |
45ac1403f perf: Add PERF_RE... |
583 |
* Ditto PERF_RECORD_MISC_SWITCH_OUT. |
82b897782 perf: Differentia... |
584 |
*/ |
2fe85427e perf: Add PERF_RE... |
585 |
#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) |
82b897782 perf: Differentia... |
586 |
#define PERF_RECORD_MISC_COMM_EXEC (1 << 13) |
45ac1403f perf: Add PERF_RE... |
587 |
#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) |
607ca46e9 UAPI: (Scripted) ... |
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 |
/* * Indicates that the content of PERF_SAMPLE_IP points to * the actual instruction that triggered the event. See also * perf_event_attr::precise_ip. */ #define PERF_RECORD_MISC_EXACT_IP (1 << 14) /* * Reserve the last bit to indicate some extended misc field */ #define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) struct perf_event_header { __u32 type; __u16 misc; __u16 size; }; enum perf_event_type { /* * If perf_event_attr.sample_id_all is set then all event types will * have the sample_type selected fields related to where/when |
ff3d527ce perf: make events... |
610 611 612 613 614 615 |
* (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed * just after the perf_event_header and the fields already present for * the existing fields, i.e. at the end of the payload. That way a newer * perf.data file will be supported by older perf tools, with these new * optional fields being ignored. |
607ca46e9 UAPI: (Scripted) ... |
616 |
* |
a5cdd40c9 perf: Update perf... |
617 618 619 620 621 622 |
* struct sample_id { * { u32 pid, tid; } && PERF_SAMPLE_TID * { u64 time; } && PERF_SAMPLE_TIME * { u64 id; } && PERF_SAMPLE_ID * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID * { u32 cpu, res; } && PERF_SAMPLE_CPU |
ff3d527ce perf: make events... |
623 |
* { u64 id; } && PERF_SAMPLE_IDENTIFIER |
a5cdd40c9 perf: Update perf... |
624 |
* } && perf_event_attr::sample_id_all |
ff3d527ce perf: make events... |
625 626 627 628 |
* * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed * relative to header.size. |
a5cdd40c9 perf: Update perf... |
629 630 631 |
*/ /* |
607ca46e9 UAPI: (Scripted) ... |
632 633 634 635 636 637 638 639 640 641 642 |
* The MMAP events record the PROT_EXEC mappings so that we can * correlate userspace IPs to code. They have the following structure: * * struct { * struct perf_event_header header; * * u32 pid, tid; * u64 addr; * u64 len; * u64 pgoff; * char filename[]; |
c5ecceefd perf: Update ABI ... |
643 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
644 645 646 647 648 649 650 651 652 |
* }; */ PERF_RECORD_MMAP = 1, /* * struct { * struct perf_event_header header; * u64 id; * u64 lost; |
a5cdd40c9 perf: Update perf... |
653 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
654 655 656 657 658 659 660 661 662 663 |
* }; */ PERF_RECORD_LOST = 2, /* * struct { * struct perf_event_header header; * * u32 pid, tid; * char comm[]; |
a5cdd40c9 perf: Update perf... |
664 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
665 666 667 668 669 670 671 672 673 674 |
* }; */ PERF_RECORD_COMM = 3, /* * struct { * struct perf_event_header header; * u32 pid, ppid; * u32 tid, ptid; * u64 time; |
a5cdd40c9 perf: Update perf... |
675 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
676 677 678 679 680 681 682 683 684 685 |
* }; */ PERF_RECORD_EXIT = 4, /* * struct { * struct perf_event_header header; * u64 time; * u64 id; * u64 stream_id; |
a5cdd40c9 perf: Update perf... |
686 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
687 688 689 690 691 692 693 694 695 696 697 |
* }; */ PERF_RECORD_THROTTLE = 5, PERF_RECORD_UNTHROTTLE = 6, /* * struct { * struct perf_event_header header; * u32 pid, ppid; * u32 tid, ptid; * u64 time; |
a5cdd40c9 perf: Update perf... |
698 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
699 700 701 702 703 704 705 706 707 708 |
* }; */ PERF_RECORD_FORK = 7, /* * struct { * struct perf_event_header header; * u32 pid, tid; * * struct read_format values; |
a5cdd40c9 perf: Update perf... |
709 |
* struct sample_id sample_id; |
607ca46e9 UAPI: (Scripted) ... |
710 711 712 713 714 715 716 717 |
* }; */ PERF_RECORD_READ = 8, /* * struct { * struct perf_event_header header; * |
ff3d527ce perf: make events... |
718 719 720 721 722 723 724 |
* # * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position * # is fixed relative to header. * # * * { u64 id; } && PERF_SAMPLE_IDENTIFIER |
607ca46e9 UAPI: (Scripted) ... |
725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 |
* { u64 ip; } && PERF_SAMPLE_IP * { u32 pid, tid; } && PERF_SAMPLE_TID * { u64 time; } && PERF_SAMPLE_TIME * { u64 addr; } && PERF_SAMPLE_ADDR * { u64 id; } && PERF_SAMPLE_ID * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID * { u32 cpu, res; } && PERF_SAMPLE_CPU * { u64 period; } && PERF_SAMPLE_PERIOD * * { struct read_format values; } && PERF_SAMPLE_READ * * { u64 nr, * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN * * # * # The RAW record below is opaque data wrt the ABI * # * # That is, the ABI doesn't make any promises wrt to * # the stability of its content, it may vary depending * # on event, hardware, kernel version and phase of * # the moon. * # * # In other words, PERF_SAMPLE_RAW contents are not an ABI. * # * * { u32 size; * char data[size];}&& PERF_SAMPLE_RAW * |
b878e7fb2 perf: Missing fie... |
753 754 |
* { u64 nr; * { u64 from, to, flags } lbr[nr];} && PERF_SAMPLE_BRANCH_STACK |
607ca46e9 UAPI: (Scripted) ... |
755 756 757 758 759 760 761 |
* * { u64 abi; # enum perf_sample_regs_abi * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER * * { u64 size; * char data[size]; * u64 dyn_size; } && PERF_SAMPLE_STACK_USER |
c3feedf2a perf/core: Add we... |
762 763 |
* * { u64 weight; } && PERF_SAMPLE_WEIGHT |
a5cdd40c9 perf: Update perf... |
764 |
* { u64 data_src; } && PERF_SAMPLE_DATA_SRC |
189b84fb5 perf: Document th... |
765 |
* { u64 transaction; } && PERF_SAMPLE_TRANSACTION |
60e2364e6 perf: Add ability... |
766 767 |
* { u64 abi; # enum perf_sample_regs_abi * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR |
607ca46e9 UAPI: (Scripted) ... |
768 769 770 |
* }; */ PERF_RECORD_SAMPLE = 9, |
13d7a2410 perf: Add attr->m... |
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 |
/* * The MMAP2 records are an augmented version of MMAP, they add * maj, min, ino numbers to be used to uniquely identify each mapping * * struct { * struct perf_event_header header; * * u32 pid, tid; * u64 addr; * u64 len; * u64 pgoff; * u32 maj; * u32 min; * u64 ino; * u64 ino_generation; |
f972eb63b perf: Pass protec... |
786 |
* u32 prot, flags; |
13d7a2410 perf: Add attr->m... |
787 788 789 790 791 |
* char filename[]; * struct sample_id sample_id; * }; */ PERF_RECORD_MMAP2 = 10, |
68db7e98c perf: Add AUX record |
792 793 794 795 796 797 798 799 800 801 802 803 804 |
/* * Records that new data landed in the AUX buffer part. * * struct { * struct perf_event_header header; * * u64 aux_offset; * u64 aux_size; * u64 flags; * struct sample_id sample_id; * }; */ PERF_RECORD_AUX = 11, |
ec0d7729b perf: Add ITRACE_... |
805 806 807 808 809 810 811 812 813 814 |
/* * Indicates that instruction trace has started * * struct { * struct perf_event_header header; * u32 pid; * u32 tid; * }; */ PERF_RECORD_ITRACE_START = 12, |
f38b0dbb4 perf/x86/intel: I... |
815 816 817 818 819 820 821 822 823 824 825 |
/* * Records the dropped/lost sample number. * * struct { * struct perf_event_header header; * * u64 lost; * struct sample_id sample_id; * }; */ PERF_RECORD_LOST_SAMPLES = 13, |
45ac1403f perf: Add PERF_RE... |
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 |
/* * Records a context switch in or out (flagged by * PERF_RECORD_MISC_SWITCH_OUT). See also * PERF_RECORD_SWITCH_CPU_WIDE. * * struct { * struct perf_event_header header; * struct sample_id sample_id; * }; */ PERF_RECORD_SWITCH = 14, /* * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and * next_prev_tid that are the next (switching out) or previous * (switching in) pid/tid. * * struct { * struct perf_event_header header; * u32 next_prev_pid; * u32 next_prev_tid; * struct sample_id sample_id; * }; */ PERF_RECORD_SWITCH_CPU_WIDE = 15, |
607ca46e9 UAPI: (Scripted) ... |
851 852 853 854 |
PERF_RECORD_MAX, /* non-ABI */ }; #define PERF_MAX_STACK_DEPTH 127 |
c85b03349 perf core: Separa... |
855 |
#define PERF_MAX_CONTEXTS_PER_STACK 8 |
607ca46e9 UAPI: (Scripted) ... |
856 857 858 859 860 861 862 863 864 865 866 867 |
enum perf_callchain_context { PERF_CONTEXT_HV = (__u64)-32, PERF_CONTEXT_KERNEL = (__u64)-128, PERF_CONTEXT_USER = (__u64)-512, PERF_CONTEXT_GUEST = (__u64)-2048, PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, PERF_CONTEXT_GUEST_USER = (__u64)-2560, PERF_CONTEXT_MAX = (__u64)-4095, }; |
68db7e98c perf: Add AUX record |
868 869 870 871 |
/** * PERF_RECORD_AUX::flags bits */ #define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ |
2023a0d28 perf: Support ove... |
872 |
#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ |
68db7e98c perf: Add AUX record |
873 |
|
643fd0b9f perf: Fix perf_ev... |
874 875 876 877 |
#define PERF_FLAG_FD_NO_GROUP (1UL << 0) #define PERF_FLAG_FD_OUTPUT (1UL << 1) #define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ #define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ |
607ca46e9 UAPI: (Scripted) ... |
878 |
|
d6be9ad6c perf: Add generic... |
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 |
union perf_mem_data_src { __u64 val; struct { __u64 mem_op:5, /* type of opcode */ mem_lvl:14, /* memory hierarchy level */ mem_snoop:5, /* snoop mode */ mem_lock:2, /* lock instr */ mem_dtlb:7, /* tlb access */ mem_rsvd:31; }; }; /* type of opcode (load/store/prefetch,code) */ #define PERF_MEM_OP_NA 0x01 /* not available */ #define PERF_MEM_OP_LOAD 0x02 /* load instruction */ #define PERF_MEM_OP_STORE 0x04 /* store instruction */ #define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ #define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ #define PERF_MEM_OP_SHIFT 0 /* memory hierarchy (memory level, hit or miss) */ #define PERF_MEM_LVL_NA 0x01 /* not available */ #define PERF_MEM_LVL_HIT 0x02 /* hit level */ #define PERF_MEM_LVL_MISS 0x04 /* miss level */ #define PERF_MEM_LVL_L1 0x08 /* L1 */ #define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ |
cc2f5a8ad perf: Fix comment... |
905 906 |
#define PERF_MEM_LVL_L2 0x20 /* L2 */ #define PERF_MEM_LVL_L3 0x40 /* L3 */ |
d6be9ad6c perf: Add generic... |
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 |
#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ #define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ #define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ #define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ #define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ #define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ #define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ #define PERF_MEM_LVL_SHIFT 5 /* snoop mode */ #define PERF_MEM_SNOOP_NA 0x01 /* not available */ #define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ #define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ #define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ #define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ #define PERF_MEM_SNOOP_SHIFT 19 /* locked instruction */ #define PERF_MEM_LOCK_NA 0x01 /* not available */ #define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ #define PERF_MEM_LOCK_SHIFT 24 /* TLB access */ #define PERF_MEM_TLB_NA 0x01 /* not available */ #define PERF_MEM_TLB_HIT 0x02 /* hit level */ #define PERF_MEM_TLB_MISS 0x04 /* miss level */ #define PERF_MEM_TLB_L1 0x08 /* L1 */ #define PERF_MEM_TLB_L2 0x10 /* L2 */ #define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ #define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ #define PERF_MEM_TLB_SHIFT 26 #define PERF_MEM_S(a, s) \ |
0d9dfc23f uapi: convert u64... |
940 |
(((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) |
d6be9ad6c perf: Add generic... |
941 |
|
274481de6 perf: Export stru... |
942 943 944 945 946 947 948 949 950 951 952 953 954 |
/* * single taken branch record layout: * * from: source instruction (may not always be a branch insn) * to: branch target * mispred: branch target was mispredicted * predicted: branch target was predicted * * support for mispred, predicted is optional. In case it * is not supported mispred = predicted = 0. * * in_tx: running in a hardware transaction * abort: aborting a hardware transaction |
71ef3c6b9 perf: Add cycles ... |
955 |
* cycles: cycles from last branch (or 0 if not supported) |
274481de6 perf: Export stru... |
956 957 958 959 960 961 962 963 |
*/ struct perf_branch_entry { __u64 from; __u64 to; __u64 mispred:1, /* target mispredicted */ predicted:1,/* target predicted */ in_tx:1, /* in transaction */ abort:1, /* transaction abort */ |
71ef3c6b9 perf: Add cycles ... |
964 965 |
cycles:16, /* cycle count to last branch */ reserved:44; |
274481de6 perf: Export stru... |
966 |
}; |
607ca46e9 UAPI: (Scripted) ... |
967 |
#endif /* _UAPI_LINUX_PERF_EVENT_H */ |