1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Performance events:
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *    Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *    Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *    Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Data type definitions, declarations, prototypes.
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *    Started by: Thomas Gleixner and Ingo Molnar
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * For licencing details see kernel-base/COPYING
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef _UAPI_LINUX_PERF_EVENT_H
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _UAPI_LINUX_PERF_EVENT_H
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/types.h>
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/ioctl.h>
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <asm/byteorder.h>
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * User-space ABI bits:
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * attr.type
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_type_id {
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_HARDWARE			= 0,
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_SOFTWARE			= 1,
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_TRACEPOINT			= 2,
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_HW_CACHE			= 3,
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_RAW				= 4,
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_BREAKPOINT			= 5,
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_TYPE_MAX,				/* non-ABI */
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Generalized performance event event_id types, used by the
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * attr.event_id parameter of the sys_perf_event_open()
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * syscall:
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_hw_id {
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Common hardware events, generalized by the kernel:
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CPU_CYCLES		= 0,
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_INSTRUCTIONS		= 1,
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_REFERENCES		= 2,
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_MISSES		= 3,
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_BRANCH_INSTRUCTIONS	= 4,
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_BRANCH_MISSES		= 5,
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_BUS_CYCLES		= 6,
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND	= 7,
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_STALLED_CYCLES_BACKEND	= 8,
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_REF_CPU_CYCLES		= 9,
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_MAX,			/* non-ABI */
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Generalized hardware cache events:
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *       { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *       { read, write, prefetch } x
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *       { accesses, misses }
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_hw_cache_id {
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_L1D			= 0,
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_L1I			= 1,
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_LL			= 2,
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_DTLB		= 3,
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_ITLB		= 4,
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_BPU			= 5,
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_NODE		= 6,
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_MAX,		/* non-ABI */
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_hw_cache_op_id {
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_OP_READ		= 0,
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_OP_WRITE		= 1,
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_OP_PREFETCH		= 2,
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_OP_MAX,		/* non-ABI */
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_hw_cache_op_result_id {
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_RESULT_ACCESS	= 0,
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_RESULT_MISS		= 1,
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_HW_CACHE_RESULT_MAX,		/* non-ABI */
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Special "software" events provided by the kernel, even if the hardware
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * does not support performance events. These events measure various
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * physical and sw events of the kernel (and allow the profiling of them as
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * well):
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_sw_ids {
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_CPU_CLOCK			= 0,
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_TASK_CLOCK		= 1,
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_PAGE_FAULTS		= 2,
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_CONTEXT_SWITCHES		= 3,
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_CPU_MIGRATIONS		= 4,
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_PAGE_FAULTS_MIN		= 5,
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_PAGE_FAULTS_MAJ		= 6,
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_ALIGNMENT_FAULTS		= 7,
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_EMULATION_FAULTS		= 8,
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_DUMMY			= 9,
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_COUNT_SW_MAX,			/* non-ABI */
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Bits that can be set in attr.sample_type to request information
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * in the overflow packets.
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_event_sample_format {
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_IP				= 1U << 0,
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_TID				= 1U << 1,
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_TIME			= 1U << 2,
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_ADDR			= 1U << 3,
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_READ			= 1U << 4,
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_CALLCHAIN			= 1U << 5,
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_ID				= 1U << 6,
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_CPU				= 1U << 7,
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_PERIOD			= 1U << 8,
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_STREAM_ID			= 1U << 9,
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_RAW				= 1U << 10,
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_STACK		= 1U << 11,
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_REGS_USER			= 1U << 12,
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_STACK_USER			= 1U << 13,
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_WEIGHT			= 1U << 14,
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_DATA_SRC			= 1U << 15,
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_IDENTIFIER			= 1U << 16,
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_MAX = 1U << 17,		/* non-ABI */
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * If the user does not pass priv level information via branch_sample_type,
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * the kernel uses the event's priv level. Branch and event priv levels do
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * not have to match. Branch priv level is checked for permissions.
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * The branch types can be combined, however BRANCH_ANY covers all types
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * of branches and therefore it supersedes all the other types.
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_branch_sample_type {
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_USER		= 1U << 0, /* user branches */
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_KERNEL	= 1U << 1, /* kernel branches */
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_HV		= 1U << 2, /* hypervisor branches */
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_ANY		= 1U << 3, /* any branch types */
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_ANY_CALL	= 1U << 4, /* any call branch */
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_ANY_RETURN	= 1U << 5, /* any return branch */
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_IND_CALL	= 1U << 6, /* indirect calls */
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_ABORT_TX	= 1U << 7, /* transaction aborts */
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_IN_TX	= 1U << 8, /* in transaction */
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_NO_TX	= 1U << 9, /* not in transaction */
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_BRANCH_MAX		= 1U << 10, /* non-ABI */
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_SAMPLE_BRANCH_PLM_ALL \
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	(PERF_SAMPLE_BRANCH_USER|\
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 PERF_SAMPLE_BRANCH_KERNEL|\
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 PERF_SAMPLE_BRANCH_HV)
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Values to determine ABI of the registers dump.
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_sample_regs_abi {
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_REGS_ABI_NONE	= 0,
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_REGS_ABI_32		= 1,
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_SAMPLE_REGS_ABI_64		= 2,
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * The format of the data returned by read() on a perf event fd,
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * as specified by attr.read_format:
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * struct read_format {
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	{ u64		value;
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		id;           } && PERF_FORMAT_ID
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	} && !PERF_FORMAT_GROUP
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	{ u64		nr;
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  { u64		value;
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	    { u64	id;           } && PERF_FORMAT_ID
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	  }		cntr[nr];
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	} && PERF_FORMAT_GROUP
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * };
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_event_read_format {
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_FORMAT_TOTAL_TIME_ENABLED		= 1U << 0,
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_FORMAT_TOTAL_TIME_RUNNING		= 1U << 1,
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_FORMAT_ID				= 1U << 2,
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_FORMAT_GROUP			= 1U << 3,
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_FORMAT_MAX = 1U << 4,		/* non-ABI */
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_ATTR_SIZE_VER0	64	/* sizeof first published struct */
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_ATTR_SIZE_VER1	72	/* add: config2 */
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_ATTR_SIZE_VER2	80	/* add: branch_sample_type */
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_ATTR_SIZE_VER3	96	/* add: sample_regs_user */
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					/* add: sample_stack_user */
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Hardware event_id to monitor via a performance monitoring event:
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_event_attr {
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Major type: hardware/software/tracepoint/etc.
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32			type;
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Size of the attr structure, for fwd/bwd compat.
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32			size;
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Type specific configuration information.
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64			config;
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		sample_period;
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		sample_freq;
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64			sample_type;
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64			read_format;
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64			disabled       :  1, /* off by default        */
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				inherit	       :  1, /* children inherit it   */
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				pinned	       :  1, /* must always be on PMU */
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclusive      :  1, /* only group on PMU     */
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_user   :  1, /* don't count user      */
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_kernel :  1, /* ditto kernel          */
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_hv     :  1, /* ditto hypervisor      */
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_idle   :  1, /* don't count when idle */
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				mmap           :  1, /* include mmap data     */
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				comm	       :  1, /* include comm data     */
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				freq           :  1, /* use freq, not period  */
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				inherit_stat   :  1, /* per task counts       */
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				enable_on_exec :  1, /* next exec enables     */
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				task           :  1, /* trace fork/exit       */
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				watermark      :  1, /* wakeup_watermark      */
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				/*
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 * precise_ip:
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *  0 - SAMPLE_IP can have arbitrary skid
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *  1 - SAMPLE_IP must have constant skid
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *  2 - SAMPLE_IP requested to have 0 skid
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *  3 - SAMPLE_IP must have 0 skid
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 *  See also PERF_RECORD_MISC_EXACT_IP
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 */
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				precise_ip     :  2, /* skid constraint       */
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				mmap_data      :  1, /* non-exec mmap data    */
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				sample_id_all  :  1, /* sample_type all events */
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_host   :  1, /* don't count in host   */
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_guest  :  1, /* don't count in guest  */
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_callchain_kernel : 1, /* exclude kernel callchains */
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				exclude_callchain_user   : 1, /* exclude user callchains */
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				mmap2          :  1, /* include mmap with inode data     */
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				__reserved_1   : 40;
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u32		wakeup_events;	  /* wakeup every n events */
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u32		wakeup_watermark; /* bytes before wakeup   */
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32			bp_type;
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		bp_addr;
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		config1; /* extension of config */
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		bp_len;
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64		config2; /* extension of config1 */
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	branch_sample_type; /* enum perf_branch_sample_type */
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Defines set of user regs to dump on samples.
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * See asm/perf_regs.h for details.
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	sample_regs_user;
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Defines size of the user stack to dump on samples.
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	sample_stack_user;
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* Align to u64. */
312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	__reserved_2;
313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define perf_flags(attr)	(*(&(attr)->read_format + 1))
316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Ioctls that can be done on a perf event fd:
319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_ENABLE		_IO ('$', 0)
321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_DISABLE		_IO ('$', 1)
322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_REFRESH		_IO ('$', 2)
323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_RESET		_IO ('$', 3)
324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_PERIOD		_IOW('$', 4, __u64)
325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_SET_OUTPUT	_IO ('$', 5)
326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_SET_FILTER	_IOW('$', 6, char *)
327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_EVENT_IOC_ID		_IOR('$', 7, __u64 *)
328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_event_ioc_flags {
330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_IOC_FLAG_GROUP		= 1U << 0,
331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Structure of the page that can be mapped via mmap
335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_event_mmap_page {
337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	version;		/* version number of this structure */
338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	compat_version;		/* lowest version this is compat with */
339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Bits needed to read the hw events in user-space.
342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   u32 seq, time_mult, time_shift, idx, width;
344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   u64 count, enabled, running;
345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   u64 cyc, time_offset;
346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   s64 pmc = 0;
347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   do {
349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     seq = pc->lock;
350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     barrier()
351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     enabled = pc->time_enabled;
353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     running = pc->time_running;
354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     if (pc->cap_usr_time && enabled != running) {
356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       cyc = rdtsc();
357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       time_offset = pc->time_offset;
358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       time_mult   = pc->time_mult;
359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       time_shift  = pc->time_shift;
360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     }
361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     idx = pc->index;
363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     count = pc->offset;
364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     if (pc->cap_usr_rdpmc && idx) {
365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       width = pc->pmc_width;
366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       pmc = rdpmc(idx - 1);
367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     }
368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     barrier();
370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   } while (pc->lock != seq);
371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * NOTE: for obvious reason this only works on self-monitoring
373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *       processes.
374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	lock;			/* seqlock for synchronization */
376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	index;			/* hardware event identifier */
377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__s64	offset;			/* add to hardware event value */
378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	time_enabled;		/* time event active */
379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	time_running;		/* time event on cpu */
380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64	capabilities;
382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct {
383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			__u64	cap_bit0		: 1, /* Always 0, deprecated, see commit 860f085b74e9 */
384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				cap_bit0_is_deprecated	: 1, /* Always 1, signals that bit 0 is zero */
385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				cap_user_rdpmc		: 1, /* The RDPMC instruction can be used to read counts */
387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				cap_user_time		: 1, /* The time_* fields are used */
388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				cap_user_time_zero	: 1, /* The time_zero field is used */
389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				cap_____res		: 59;
390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		};
391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * If cap_usr_rdpmc this field provides the bit-width of the value
395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * read using the rdpmc() or equivalent instruction. This can be used
396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * to sign extend the result like:
397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   pmc <<= 64 - width;
399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   pmc >>= 64 - width; // signed shift right
400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   count += pmc;
401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u16	pmc_width;
403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * If cap_usr_time the below fields can be used to compute the time
406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * delta since time_enabled (in ns) using rdtsc or similar.
407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   u64 quot, rem;
409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   u64 delta;
410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   quot = (cyc >> time_shift);
412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   rem = cyc & ((1 << time_shift) - 1);
413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   delta = time_offset + quot * time_mult +
414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *              ((rem * time_mult) >> time_shift);
415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Where time_offset,time_mult,time_shift and cyc are read in the
417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * seqcount loop described above. This delta can then be added to
418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * enabled and possible running (if idx), improving the scaling:
419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   enabled += delta;
421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   if (idx)
422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *     running += delta;
423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   quot = count / running;
425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   rem  = count % running;
426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   count = quot * enabled + (rem * enabled) / running;
427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u16	time_shift;
429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	time_mult;
430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	time_offset;
431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated
433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * from sample timestamps.
434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   time = timestamp - time_zero;
436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   quot = time / time_mult;
437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   rem  = time % time_mult;
438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   cyc = (quot << time_shift) + (rem << time_shift) / time_mult;
439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * And vice versa:
441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   quot = cyc >> time_shift;
443e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   rem  = cyc & ((1 << time_shift) - 1);
444e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *   timestamp = time_zero + quot * time_mult +
445e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *               ((rem * time_mult) >> time_shift);
446e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
447e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	time_zero;
448e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	size;			/* Header size up to __reserved[] fields. */
449e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
450e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		/*
451e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 * Hole for extension of the self monitor capabilities
452e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 */
453e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
454e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u8	__reserved[118*8+4];	/* align to 1k. */
455e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
456e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
457e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Control data for the mmap() data buffer.
458e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
459e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * User-space reading the @data_head value should issue an smp_rmb(),
460e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * after reading this value.
461e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
462e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * When the mapping is PROT_WRITE the @data_tail value should be
463e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * written by userspace to reflect the last read data, after issueing
464e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * an smp_mb() to separate the data read from the ->data_tail store.
465e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * In this case the kernel will not over-write unread data.
466e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
467e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * See perf_output_put_handle() for the data ordering.
468e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
469e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64   data_head;		/* head in the data section */
470e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	data_tail;		/* user-space written tail */
471e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
472e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
473e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_CPUMODE_MASK		(7 << 0)
474e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_CPUMODE_UNKNOWN	(0 << 0)
475e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_KERNEL			(1 << 0)
476e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_USER			(2 << 0)
477e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_HYPERVISOR		(3 << 0)
478e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_GUEST_KERNEL		(4 << 0)
479e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_GUEST_USER		(5 << 0)
480e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
481e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_MMAP_DATA		(1 << 13)
482e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
483e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Indicates that the content of PERF_SAMPLE_IP points to
484e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * the actual instruction that triggered the event. See also
485e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * perf_event_attr::precise_ip.
486e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
487e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_EXACT_IP		(1 << 14)
488e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
489e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Reserve the last bit to indicate some extended misc field
490e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
491e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_RECORD_MISC_EXT_RESERVED		(1 << 15)
492e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
493e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_event_header {
494e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u32	type;
495e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u16	misc;
496e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u16	size;
497e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
498e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
499e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_event_type {
500e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
501e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
502e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * If perf_event_attr.sample_id_all is set then all event types will
503e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * have the sample_type selected fields related to where/when
504e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU,
505e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed
506e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * just after the perf_event_header and the fields already present for
507e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * the existing fields, i.e. at the end of the payload. That way a newer
508e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * perf.data file will be supported by older perf tools, with these new
509e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * optional fields being ignored.
510e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
511e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct sample_id {
512e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u32			pid, tid; } && PERF_SAMPLE_TID
513e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u64			time;     } && PERF_SAMPLE_TIME
514e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u64			id;       } && PERF_SAMPLE_ID
515e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u64			stream_id;} && PERF_SAMPLE_STREAM_ID
516e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u32			cpu, res; } && PERF_SAMPLE_CPU
517e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			id;	  } && PERF_SAMPLE_IDENTIFIER
518e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * } && perf_event_attr::sample_id_all
519e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
520e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID.  The
521e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed
522e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * relative to header.size.
523e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
524e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
525e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
526e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * The MMAP events record the PROT_EXEC mappings so that we can
527e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * correlate userspace IPs to code. They have the following structure:
528e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
529e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
530e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
531e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
532e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, tid;
533e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				addr;
534e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				len;
535e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				pgoff;
536e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	char				filename[];
537e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
538e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
539e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
540e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_MMAP			= 1,
541e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
542e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
543e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
544e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
545e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				id;
546e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				lost;
547e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
548e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
549e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
550e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_LOST			= 2,
551e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
552e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
553e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
554e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
555e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
556e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, tid;
557e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	char				comm[];
558e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
559e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
560e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
561e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_COMM			= 3,
562e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
563e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
564e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
565e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
566e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, ppid;
567e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				tid, ptid;
568e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				time;
569e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
570e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
571e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
572e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_EXIT			= 4,
573e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
574e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
575e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
576e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
577e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				time;
578e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				id;
579e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				stream_id;
580e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
581e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
582e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
583e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_THROTTLE			= 5,
584e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_UNTHROTTLE			= 6,
585e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
586e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
587e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
588e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
589e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, ppid;
590e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				tid, ptid;
591e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				time;
592e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
593e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
594e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
595e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_FORK			= 7,
596e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
597e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
598e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
599e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
600e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, tid;
601e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
602e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct read_format		values;
603e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
604e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
605e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
606e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_READ			= 8,
607e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
608e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
609e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
610e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
611e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
612e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
613e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID.
614e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# The advantage of PERF_SAMPLE_IDENTIFIER is that its position
615e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# is fixed relative to header.
616e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
617e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
618e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			id;	  } && PERF_SAMPLE_IDENTIFIER
619e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			ip;	  } && PERF_SAMPLE_IP
620e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u32			pid, tid; } && PERF_SAMPLE_TID
621e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			time;     } && PERF_SAMPLE_TIME
622e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			addr;     } && PERF_SAMPLE_ADDR
623e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			id;	  } && PERF_SAMPLE_ID
624e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			stream_id;} && PERF_SAMPLE_STREAM_ID
625e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u32			cpu, res; } && PERF_SAMPLE_CPU
626e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			period;   } && PERF_SAMPLE_PERIOD
627e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
628e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ struct read_format	values;	  } && PERF_SAMPLE_READ
629e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
630e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			nr,
631e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	  u64			ips[nr];  } && PERF_SAMPLE_CALLCHAIN
632e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
633e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
634e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# The RAW record below is opaque data wrt the ABI
635e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
636e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# That is, the ABI doesn't make any promises wrt to
637e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# the stability of its content, it may vary depending
638e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# on event, hardware, kernel version and phase of
639e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# the moon.
640e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
641e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	# In other words, PERF_SAMPLE_RAW contents are not an ABI.
642e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	#
643e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
644e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u32			size;
645e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	  char                  data[size];}&& PERF_SAMPLE_RAW
646e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
647e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64                   nr;
648e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *        { u64 from, to, flags } lbr[nr];} && PERF_SAMPLE_BRANCH_STACK
649e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
650e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u64			abi; # enum perf_sample_regs_abi
651e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER
652e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
653e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	{ u64			size;
654e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	  char			data[size];
655e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	  u64			dyn_size; } && PERF_SAMPLE_STACK_USER
656e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
657e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			weight;   } && PERF_SAMPLE_WEIGHT
658e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	{ u64			data_src; } && PERF_SAMPLE_DATA_SRC
659e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
660e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
661e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_SAMPLE			= 9,
662e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
663e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
664e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * The MMAP2 records are an augmented version of MMAP, they add
665e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * maj, min, ino numbers to be used to uniquely identify each mapping
666e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
667e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * struct {
668e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	struct perf_event_header	header;
669e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
670e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				pid, tid;
671e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				addr;
672e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				len;
673e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				pgoff;
674e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				maj;
675e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u32				min;
676e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				ino;
677e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	u64				ino_generation;
678e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *	char				filename[];
679e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * 	struct sample_id		sample_id;
680e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * };
681e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
682e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_MMAP2			= 10,
683e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
684e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_RECORD_MAX,			/* non-ABI */
685e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
686e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
687e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MAX_STACK_DEPTH		127
688e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
689e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_callchain_context {
690e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_HV			= (__u64)-32,
691e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_KERNEL		= (__u64)-128,
692e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_USER		= (__u64)-512,
693e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
694e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_GUEST		= (__u64)-2048,
695e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_GUEST_KERNEL	= (__u64)-2176,
696e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_GUEST_USER		= (__u64)-2560,
697e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
698e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_CONTEXT_MAX		= (__u64)-4095,
699e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
700e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
701e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_FLAG_FD_NO_GROUP		(1U << 0)
702e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_FLAG_FD_OUTPUT		(1U << 1)
703e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_FLAG_PID_CGROUP		(1U << 2) /* pid=cgroup id, per-cpu mode only */
704e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
705e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengunion perf_mem_data_src {
706e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64 val;
707e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct {
708e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__u64   mem_op:5,	/* type of opcode */
709e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			mem_lvl:14,	/* memory hierarchy level */
710e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			mem_snoop:5,	/* snoop mode */
711e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			mem_lock:2,	/* lock instr */
712e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			mem_dtlb:7,	/* tlb access */
713e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			mem_rsvd:31;
714e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
715e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
716e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
717e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* type of opcode (load/store/prefetch,code) */
718e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_NA		0x01 /* not available */
719e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_LOAD	0x02 /* load instruction */
720e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_STORE	0x04 /* store instruction */
721e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_PFETCH	0x08 /* prefetch */
722e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_EXEC	0x10 /* code (execution) */
723e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_OP_SHIFT	0
724e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
725e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* memory hierarchy (memory level, hit or miss) */
726e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_NA		0x01  /* not available */
727e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_HIT	0x02  /* hit level */
728e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_MISS	0x04  /* miss level  */
729e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_L1		0x08  /* L1 */
730e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_LFB	0x10  /* Line Fill Buffer */
731e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_L2		0x20  /* L2 */
732e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_L3		0x40  /* L3 */
733e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_LOC_RAM	0x80  /* Local DRAM */
734e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_REM_RAM1	0x100 /* Remote DRAM (1 hop) */
735e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_REM_RAM2	0x200 /* Remote DRAM (2 hops) */
736e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_REM_CCE1	0x400 /* Remote Cache (1 hop) */
737e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_REM_CCE2	0x800 /* Remote Cache (2 hops) */
738e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_IO		0x1000 /* I/O memory */
739e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_UNC	0x2000 /* Uncached memory */
740e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LVL_SHIFT	5
741e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
742e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* snoop mode */
743e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_NA	0x01 /* not available */
744e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_NONE	0x02 /* no snoop */
745e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_HIT	0x04 /* snoop hit */
746e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_MISS	0x08 /* snoop miss */
747e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_HITM	0x10 /* snoop hit modified */
748e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_SNOOP_SHIFT	19
749e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
750e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* locked instruction */
751e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LOCK_NA	0x01 /* not available */
752e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LOCK_LOCKED	0x02 /* locked transaction */
753e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_LOCK_SHIFT	24
754e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
755e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* TLB access */
756e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_NA		0x01 /* not available */
757e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_HIT	0x02 /* hit level */
758e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_MISS	0x04 /* miss level */
759e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_L1		0x08 /* L1 */
760e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_L2		0x10 /* L2 */
761e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_WK		0x20 /* Hardware Walker*/
762e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_OS		0x40 /* OS fault handler */
763e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_TLB_SHIFT	26
764e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
765e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_MEM_S(a, s) \
766e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	(((u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT)
767e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
768e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
769e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * single taken branch record layout:
770e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
771e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *      from: source instruction (may not always be a branch insn)
772e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *        to: branch target
773e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   mispred: branch target was mispredicted
774e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * predicted: branch target was predicted
775e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
776e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * support for mispred, predicted is optional. In case it
777e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * is not supported mispred = predicted = 0.
778e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
779e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     in_tx: running in a hardware transaction
780e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *     abort: aborting a hardware transaction
781e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
782e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_branch_entry {
783e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	from;
784e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	to;
785e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__u64	mispred:1,  /* target mispredicted */
786e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		predicted:1,/* target predicted */
787e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		in_tx:1,    /* in transaction */
788e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		abort:1,    /* transaction abort */
789e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		reserved:60;
790e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
791e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
792e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* _UAPI_LINUX_PERF_EVENT_H */
793