Blame view

include/uapi/linux/perf_event.h 28 KB
607ca46e9   David Howells   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   Adrian Hunter   perf: Add a dummy...
112
  	PERF_COUNT_SW_DUMMY			= 9,
a43eec304   Alexei Starovoitov   bpf: introduce bp...
113
  	PERF_COUNT_SW_BPF_OUTPUT		= 10,
607ca46e9   David Howells   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   Andi Kleen   perf/core: Add we...
137
  	PERF_SAMPLE_WEIGHT			= 1U << 14,
d6be9ad6c   Stephane Eranian   perf: Add generic...
138
  	PERF_SAMPLE_DATA_SRC			= 1U << 15,
ff3d527ce   Adrian Hunter   perf: make events...
139
  	PERF_SAMPLE_IDENTIFIER			= 1U << 16,
fdfbbd07e   Andi Kleen   perf: Add generic...
140
  	PERF_SAMPLE_TRANSACTION			= 1U << 17,
60e2364e6   Stephane Eranian   perf: Add ability...
141
  	PERF_SAMPLE_REGS_INTR			= 1U << 18,
c3feedf2a   Andi Kleen   perf/core: Add we...
142

60e2364e6   Stephane Eranian   perf: Add ability...
143
  	PERF_SAMPLE_MAX = 1U << 19,		/* non-ABI */
607ca46e9   David Howells   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   Yan, Zheng   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   Peter Zijlstra   perf/x86/intel: E...
169
  	PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT	= 11, /* call/ret stack */
c9fdfa14c   Stephane Eranian   perf: add new PER...
170
  	PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT	= 12, /* indirect jumps */
c229bf9dc   Stephane Eranian   perf: Add PERF_SA...
171
  	PERF_SAMPLE_BRANCH_CALL_SHIFT		= 13, /* direct call */
2c44b1936   Peter Zijlstra   perf/x86/intel: E...
172

b16a5b52e   Andi Kleen   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   Yan, Zheng   perf/x86/intel: R...
175
176
  	PERF_SAMPLE_BRANCH_MAX_SHIFT		/* non-ABI */
  };
607ca46e9   David Howells   UAPI: (Scripted) ...
177
  enum perf_branch_sample_type {
27ac905b8   Yan, Zheng   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   Peter Zijlstra   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   Yan, Zheng   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   Peter Zijlstra   perf/x86/intel: E...
190
  	PERF_SAMPLE_BRANCH_CALL_STACK	= 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT,
c9fdfa14c   Stephane Eranian   perf: add new PER...
191
  	PERF_SAMPLE_BRANCH_IND_JUMP	= 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT,
c229bf9dc   Stephane Eranian   perf: Add PERF_SA...
192
  	PERF_SAMPLE_BRANCH_CALL		= 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT,
2c44b1936   Peter Zijlstra   perf/x86/intel: E...
193

b16a5b52e   Andi Kleen   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   Yan, Zheng   perf/x86/intel: R...
196
  	PERF_SAMPLE_BRANCH_MAX		= 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
607ca46e9   David Howells   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   Andi Kleen   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   David Howells   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   Stephane Eranian   perf: Add ability...
269
  #define PERF_ATTR_SIZE_VER4	104	/* add: sample_regs_intr */
1a5941312   Alexander Shishkin   perf: Add wakeup ...
270
  #define PERF_ATTR_SIZE_VER5	112	/* add: aux_watermark */
607ca46e9   David Howells   UAPI: (Scripted) ...
271
272
273
  
  /*
   * Hardware event_id to monitor via a performance monitoring event:
97c79a38c   Arnaldo Carvalho de Melo   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   David Howells   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   Stephane Eranian   perf: Add attr->m...
337
  				mmap2          :  1, /* include mmap with inode data     */
82b897782   Adrian Hunter   perf: Differentia...
338
  				comm_exec      :  1, /* flag comm events that are due to an exec */
34f439278   Peter Zijlstra   perf: Add per eve...
339
  				use_clockid    :  1, /* use @clockid for time fields */
45ac1403f   Adrian Hunter   perf: Add PERF_RE...
340
  				context_switch :  1, /* context switch data */
9ecda41ac   Wang Nan   perf/core: Add ::...
341
342
  				write_backward :  1, /* Write ring buffer from end to beginning */
  				__reserved_1   : 36;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Add per eve...
370
  	__s32	clockid;
60e2364e6   Stephane Eranian   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   Alexander Shishkin   perf: Add wakeup ...
380
381
382
383
384
  
  	/*
  	 * Wakeup watermark for AUX area
  	 */
  	__u32	aux_watermark;
97c79a38c   Arnaldo Carvalho de Melo   perf core: Per ev...
385
386
  	__u16	sample_max_stack;
  	__u16	__reserved_2;	/* align to __u64 */
607ca46e9   David Howells   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   Vince Weaver   perf: Fix UAPI ex...
401
  #define PERF_EVENT_IOC_ID		_IOR('$', 7, __u64 *)
2541517c3   Alexei Starovoitov   tracing, perf: Im...
402
  #define PERF_EVENT_IOC_SET_BPF		_IOW('$', 8, __u32)
86e7972f6   Wang Nan   perf/ring_buffer:...
403
  #define PERF_EVENT_IOC_PAUSE_OUTPUT	_IOW('$', 9, __u32)
607ca46e9   David Howells   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   Andy Lutomirski   perf: Fix typos i...
419
  	 *   u32 seq, time_mult, time_shift, index, width;
607ca46e9   David Howells   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   Andy Lutomirski   perf: Fix typos i...
438
  	 *     index = pc->index;
607ca46e9   David Howells   UAPI: (Scripted) ...
439
  	 *     count = pc->offset;
b438b1ab3   Andy Lutomirski   perf: Fix typos i...
440
  	 *     if (pc->cap_user_rdpmc && index) {
607ca46e9   David Howells   UAPI: (Scripted) ...
441
  	 *       width = pc->pmc_width;
b438b1ab3   Andy Lutomirski   perf: Fix typos i...
442
  	 *       pmc = rdpmc(index - 1);
607ca46e9   David Howells   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   Adrian Hunter   perf: Fix broken ...
458
  		struct {
fa7315871   Peter Zijlstra   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   Adrian Hunter   perf: Fix broken ...
466
  		};
607ca46e9   David Howells   UAPI: (Scripted) ...
467
468
469
  	};
  
  	/*
b438b1ab3   Andy Lutomirski   perf: Fix typos i...
470
  	 * If cap_user_rdpmc this field provides the bit-width of the value
607ca46e9   David Howells   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   Adrian Hunter   perf/x86: Fix tim...
488
  	 *   rem = cyc & (((u64)1 << time_shift) - 1);
607ca46e9   David Howells   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   Andy Lutomirski   perf: Fix typos i...
494
  	 * enabled and possible running (if index), improving the scaling:
607ca46e9   David Howells   UAPI: (Scripted) ...
495
496
  	 *
  	 *   enabled += delta;
b438b1ab3   Andy Lutomirski   perf: Fix typos i...
497
  	 *   if (index)
607ca46e9   David Howells   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   Adrian Hunter   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   Adrian Hunter   perf/x86: Fix tim...
519
  	 *   rem  = cyc & (((u64)1 << time_shift) - 1);
c73deb6ae   Adrian Hunter   perf/x86: Add abi...
520
521
522
523
  	 *   timestamp = time_zero + quot * time_mult +
  	 *               ((rem * time_mult) >> time_shift);
  	 */
  	__u64	time_zero;
fa7315871   Peter Zijlstra   perf: Fix capabil...
524
  	__u32	size;			/* Header size up to __reserved[] fields. */
607ca46e9   David Howells   UAPI: (Scripted) ...
525
526
527
528
  
  		/*
  		 * Hole for extension of the self monitor capabilities
  		 */
fa7315871   Peter Zijlstra   perf: Fix capabil...
529
  	__u8	__reserved[118*8+4];	/* align to 1k. */
607ca46e9   David Howells   UAPI: (Scripted) ...
530
531
532
533
  
  	/*
  	 * Control data for the mmap() data buffer.
  	 *
bf378d341   Peter Zijlstra   perf: Fix perf ri...
534
535
  	 * User-space reading the @data_head value should issue an smp_rmb(),
  	 * after reading this value.
607ca46e9   David Howells   UAPI: (Scripted) ...
536
537
  	 *
  	 * When the mapping is PROT_WRITE the @data_tail value should be
bf378d341   Peter Zijlstra   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   Alexander Shishkin   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   David Howells   UAPI: (Scripted) ...
546
547
548
  	 */
  	__u64   data_head;		/* head in the data section */
  	__u64	data_tail;		/* user-space written tail */
e8c6deac6   Alexander Shishkin   perf: Add data_{o...
549
550
  	__u64	data_offset;		/* where the buffer starts */
  	__u64	data_size;		/* data buffer size */
45bfb2e50   Peter Zijlstra   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   David Howells   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   Adrian Hunter   perf: Differentia...
576
  /*
930e6fcd2   Kan Liang   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   Adrian Hunter   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   Adrian Hunter   perf: Add PERF_RE...
583
   * Ditto PERF_RECORD_MISC_SWITCH_OUT.
82b897782   Adrian Hunter   perf: Differentia...
584
   */
2fe85427e   Stephane Eranian   perf: Add PERF_RE...
585
  #define PERF_RECORD_MISC_MMAP_DATA		(1 << 13)
82b897782   Adrian Hunter   perf: Differentia...
586
  #define PERF_RECORD_MISC_COMM_EXEC		(1 << 13)
45ac1403f   Adrian Hunter   perf: Add PERF_RE...
587
  #define PERF_RECORD_MISC_SWITCH_OUT		(1 << 13)
607ca46e9   David Howells   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   Adrian Hunter   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   David Howells   UAPI: (Scripted) ...
616
  	 *
a5cdd40c9   Peter Zijlstra   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   Adrian Hunter   perf: make events...
623
  	 *	{ u64			id;	  } && PERF_SAMPLE_IDENTIFIER
a5cdd40c9   Peter Zijlstra   perf: Update perf...
624
  	 * } && perf_event_attr::sample_id_all
ff3d527ce   Adrian Hunter   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   Peter Zijlstra   perf: Update perf...
629
630
631
  	 */
  
  	/*
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update ABI ...
643
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
653
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
664
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
675
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
686
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
698
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   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   Peter Zijlstra   perf: Update perf...
709
  	 * 	struct sample_id		sample_id;
607ca46e9   David Howells   UAPI: (Scripted) ...
710
711
712
713
714
715
716
717
  	 * };
  	 */
  	PERF_RECORD_READ			= 8,
  
  	/*
  	 * struct {
  	 *	struct perf_event_header	header;
  	 *
ff3d527ce   Adrian Hunter   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   David Howells   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   Vince Weaver   perf: Missing fie...
753
754
  	 *	{ u64                   nr;
  	 *        { u64 from, to, flags } lbr[nr];} && PERF_SAMPLE_BRANCH_STACK
607ca46e9   David Howells   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   Andi Kleen   perf/core: Add we...
762
763
  	 *
  	 *	{ u64			weight;   } && PERF_SAMPLE_WEIGHT
a5cdd40c9   Peter Zijlstra   perf: Update perf...
764
  	 *	{ u64			data_src; } && PERF_SAMPLE_DATA_SRC
189b84fb5   Vince Weaver   perf: Document th...
765
  	 *	{ u64			transaction; } && PERF_SAMPLE_TRANSACTION
60e2364e6   Stephane Eranian   perf: Add ability...
766
767
  	 *	{ u64			abi; # enum perf_sample_regs_abi
  	 *	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
607ca46e9   David Howells   UAPI: (Scripted) ...
768
769
770
  	 * };
  	 */
  	PERF_RECORD_SAMPLE			= 9,
13d7a2410   Stephane Eranian   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   Peter Zijlstra   perf: Pass protec...
786
  	 *	u32				prot, flags;
13d7a2410   Stephane Eranian   perf: Add attr->m...
787
788
789
790
791
  	 *	char				filename[];
  	 * 	struct sample_id		sample_id;
  	 * };
  	 */
  	PERF_RECORD_MMAP2			= 10,
68db7e98c   Alexander Shishkin   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   Alexander Shishkin   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   Kan Liang   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   Adrian Hunter   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   David Howells   UAPI: (Scripted) ...
851
852
853
854
  	PERF_RECORD_MAX,			/* non-ABI */
  };
  
  #define PERF_MAX_STACK_DEPTH		127
c85b03349   Arnaldo Carvalho de Melo   perf core: Separa...
855
  #define PERF_MAX_CONTEXTS_PER_STACK	  8
607ca46e9   David Howells   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   Alexander Shishkin   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   Alexander Shishkin   perf: Support ove...
872
  #define PERF_AUX_FLAG_OVERWRITE		0x02	/* snapshot from overwrite mode */
68db7e98c   Alexander Shishkin   perf: Add AUX record
873

643fd0b9f   Peter Zijlstra   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   David Howells   UAPI: (Scripted) ...
878

d6be9ad6c   Stephane Eranian   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   Stephane Eranian   perf: Fix comment...
905
906
  #define PERF_MEM_LVL_L2		0x20  /* L2 */
  #define PERF_MEM_LVL_L3		0x40  /* L3 */
d6be9ad6c   Stephane Eranian   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   Mike Frysinger   uapi: convert u64...
940
  	(((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT)
d6be9ad6c   Stephane Eranian   perf: Add generic...
941

274481de6   Vince Weaver   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   Andi Kleen   perf: Add cycles ...
955
   *    cycles: cycles from last branch (or 0 if not supported)
274481de6   Vince Weaver   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   Andi Kleen   perf: Add cycles ...
964
965
  		cycles:16,  /* cycle count to last branch */
  		reserved:44;
274481de6   Vince Weaver   perf: Export stru...
966
  };
607ca46e9   David Howells   UAPI: (Scripted) ...
967
  #endif /* _UAPI_LINUX_PERF_EVENT_H */