1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // These definitions are used for communication between the cpu-trace
6 // device driver and the kernel only.
7 
8 #pragma once
9 
10 #include <lib/zircon-internal/device/cpu-trace/cpu-perf.h>
11 
12 __BEGIN_CDECLS
13 
14 // MSRs
15 
16 #define IPM_MSR_MASK(len, shift) (((1ULL << (len)) - 1) << (shift))
17 
18 // Bits in the IA32_PERF_CAPABILITIES MSR.
19 
20 #define IA32_PERF_CAPABILITIES_LBR_FORMAT_SHIFT (0)
21 #define IA32_PERF_CAPABILITIES_LBR_FORMAT_LEN   (6)
22 #define IA32_PERF_CAPABILITIES_LBR_FORMAT_MASK \
23   IPM_MSR_MASK(IA32_PERF_CAPABILITIES_LBR_FORMAT_LEN, \
24                IA32_PERF_CAPABILITIES_LBR_FORMAT_SHIFT)
25 
26 #define IA32_PERF_CAPABILITIES_PEBS_TRAP_SHIFT (6)
27 #define IA32_PERF_CAPABILITIES_PEBS_TRAP_LEN   (1)
28 #define IA32_PERF_CAPABILITIES_PEBS_TRAP_MASK \
29   IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_TRAP_LEN, \
30                IA32_PERF_CAPABILITIES_PEBS_TRAP_SHIFT)
31 
32 #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_SHIFT (7)
33 #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_LEN   (1)
34 #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_MASK \
35   IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_LEN, \
36                IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_SHIFT)
37 
38 #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_SHIFT (8)
39 #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_LEN   (4)
40 #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_MASK \
41   IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_LEN, \
42                IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_SHIFT)
43 
44 #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_SHIFT (12)
45 #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_LEN   (1)
46 #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_MASK \
47   IPM_MSR_MASK(IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_LEN, \
48                IA32_PERF_CAPABILITIES_FREEZE_SHILE_SMM_SHIFT)
49 
50 // Bits in the IA32_PERFEVTSELx MSRs.
51 
52 #define IA32_PERFEVTSEL_EVENT_SELECT_SHIFT (0)
53 #define IA32_PERFEVTSEL_EVENT_SELECT_LEN   (8)
54 #define IA32_PERFEVTSEL_EVENT_SELECT_MASK \
55   IPM_MSR_MASK(IA32_PERFEVTSEL_EVENT_SELECT_LEN, IA32_PERFEVTSEL_EVENT_SELECT_SHIFT)
56 
57 #define IA32_PERFEVTSEL_UMASK_SHIFT (8)
58 #define IA32_PERFEVTSEL_UMASK_LEN   (8)
59 #define IA32_PERFEVTSEL_UMASK_MASK \
60   IPM_MSR_MASK(IA32_PERFEVTSEL_UMASK_LEN, IA32_PERFEVTSEL_UMASK_SHIFT)
61 
62 #define IA32_PERFEVTSEL_USR_SHIFT (16)
63 #define IA32_PERFEVTSEL_USR_LEN   (1)
64 #define IA32_PERFEVTSEL_USR_MASK \
65   IPM_MSR_MASK(IA32_PERFEVTSEL_USR_LEN, IA32_PERFEVTSEL_USR_SHIFT)
66 
67 #define IA32_PERFEVTSEL_OS_SHIFT (17)
68 #define IA32_PERFEVTSEL_OS_LEN   (1)
69 #define IA32_PERFEVTSEL_OS_MASK \
70   IPM_MSR_MASK(IA32_PERFEVTSEL_OS_LEN, IA32_PERFEVTSEL_OS_SHIFT)
71 
72 #define IA32_PERFEVTSEL_E_SHIFT (18)
73 #define IA32_PERFEVTSEL_E_LEN   (1)
74 #define IA32_PERFEVTSEL_E_MASK \
75   IPM_MSR_MASK(IA32_PERFEVTSEL_E_LEN, IA32_PERFEVTSEL_E_SHIFT)
76 
77 #define IA32_PERFEVTSEL_PC_SHIFT (19)
78 #define IA32_PERFEVTSEL_PC_LEN   (1)
79 #define IA32_PERFEVTSEL_PC_MASK \
80   IPM_MSR_MASK(IA32_PERFEVTSEL_PC_LEN, IA32_PERFEVTSEL_PC_SHIFT)
81 
82 #define IA32_PERFEVTSEL_INT_SHIFT (20)
83 #define IA32_PERFEVTSEL_INT_LEN   (1)
84 #define IA32_PERFEVTSEL_INT_MASK \
85   IPM_MSR_MASK(IA32_PERFEVTSEL_INT_LEN, IA32_PERFEVTSEL_INT_SHIFT)
86 
87 #define IA32_PERFEVTSEL_ANY_SHIFT (21)
88 #define IA32_PERFEVTSEL_ANY_LEN   (1)
89 #define IA32_PERFEVTSEL_ANY_MASK \
90   IPM_MSR_MASK(IA32_PERFEVTSEL_ANY_LEN, IA32_PERFEVTSEL_ANY_SHIFT)
91 
92 #define IA32_PERFEVTSEL_EN_SHIFT (22)
93 #define IA32_PERFEVTSEL_EN_LEN   (1)
94 #define IA32_PERFEVTSEL_EN_MASK \
95   IPM_MSR_MASK(IA32_PERFEVTSEL_EN_LEN, IA32_PERFEVTSEL_EN_SHIFT)
96 
97 #define IA32_PERFEVTSEL_INV_SHIFT (23)
98 #define IA32_PERFEVTSEL_INV_LEN   (1)
99 #define IA32_PERFEVTSEL_INV_MASK \
100   IPM_MSR_MASK(IA32_PERFEVTSEL_INV_LEN, IA32_PERFEVTSEL_INV_SHIFT)
101 
102 #define IA32_PERFEVTSEL_CMASK_SHIFT (24)
103 #define IA32_PERFEVTSEL_CMASK_LEN   (8)
104 #define IA32_PERFEVTSEL_CMASK_MASK \
105   IPM_MSR_MASK(IA32_PERFEVTSEL_CMASK_LEN, IA32_PERFEVTSEL_CMASK_SHIFT)
106 
107 // Bits in the IA32_FIXED_CTR_CTRL MSR.
108 
109 #define IA32_FIXED_CTR_CTRL_EN_SHIFT(ctr) (0 + (ctr) * 4)
110 #define IA32_FIXED_CTR_CTRL_EN_LEN        (2)
111 #define IA32_FIXED_CTR_CTRL_EN_MASK(ctr) \
112   IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_EN_LEN, IA32_FIXED_CTR_CTRL_EN_SHIFT(ctr))
113 
114 #define IA32_FIXED_CTR_CTRL_ANY_SHIFT(ctr) (2 + (ctr) * 4)
115 #define IA32_FIXED_CTR_CTRL_ANY_LEN        (1)
116 #define IA32_FIXED_CTR_CTRL_ANY_MASK(ctr) \
117   IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_ANY_LEN, IA32_FIXED_CTR_CTRL_ANY_SHIFT(ctr))
118 
119 #define IA32_FIXED_CTR_CTRL_PMI_SHIFT(ctr) (3 + (ctr) * 4)
120 #define IA32_FIXED_CTR_CTRL_PMI_LEN        (1)
121 #define IA32_FIXED_CTR_CTRL_PMI_MASK(ctr) \
122   IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_PMI_LEN, IA32_FIXED_CTR_CTRL_PMI_SHIFT(ctr))
123 
124 // The IA32_PERF_GLOBAL_CTRL MSR.
125 
126 #define IA32_PERF_GLOBAL_CTRL_PMC_EN_SHIFT(ctr) (ctr)
127 #define IA32_PERF_GLOBAL_CTRL_PMC_EN_LEN        (1)
128 #define IA32_PERF_GLOBAL_CTRL_PMC_EN_MASK(ctr) \
129   IPM_MSR_MASK(IA32_PERF_GLOBAL_CTRL_PMC_EN_LEN, IA32_PERF_GLOBAL_CTRL_PMC_EN_SHIFT(ctr))
130 
131 #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_SHIFT(ctr) (32 + (ctr))
132 #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_LEN        (1)
133 #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_MASK(ctr) \
134   IPM_MSR_MASK(IA32_PERF_GLOBAL_CTRL_FIXED_EN_LEN, IA32_PERF_GLOBAL_CTRL_FIXED_EN_SHIFT(ctr))
135 
136 // Bits in the IA32_PERF_GLOBAL_STATUS MSR.
137 // Note: Use these values for IA32_PERF_GLOBAL_STATUS_RESET and
138 // IA32_PERF_GLOBAL_STATUS_SET too.
139 
140 #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_SHIFT(ctr) (ctr)
141 #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_LEN        (1)
142 #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_MASK(ctr) \
143   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_PMC_OVF_LEN, IA32_PERF_GLOBAL_STATUS_PMC_OVF_SHIFT(ctr))
144 
145 #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_SHIFT(ctr) (32 + (ctr))
146 #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_LEN        (1)
147 #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_MASK(ctr) \
148   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_FIXED_OVF_LEN, IA32_PERF_GLOBAL_STATUS_FIXED_OVF_SHIFT(ctr))
149 
150 #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_SHIFT (55)
151 #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_LEN   (1)
152 #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_MASK \
153   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_LEN, IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_SHIFT)
154 
155 #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_SHIFT (58)
156 #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_LEN   (1)
157 #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_MASK \
158   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_LBR_FRZ_LEN, IA32_PERF_GLOBAL_STATUS_LBR_FRZ_SHIFT)
159 
160 #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_SHIFT (59)
161 #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_LEN   (1)
162 #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_MASK \
163   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_CTR_FRZ_LEN, IA32_PERF_GLOBAL_STATUS_CTR_FRZ_SHIFT)
164 
165 #define IA32_PERF_GLOBAL_STATUS_ASCI_SHIFT (60)
166 #define IA32_PERF_GLOBAL_STATUS_ASCI_LEN   (1)
167 #define IA32_PERF_GLOBAL_STATUS_ASCI_MASK \
168   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_ASCI_LEN, IA32_PERF_GLOBAL_STATUS_ASCI_SHIFT)
169 
170 #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_SHIFT (61)
171 #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_LEN   (1)
172 #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_MASK \
173   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_LEN, IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_SHIFT)
174 
175 #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_SHIFT (62)
176 #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_LEN   (1)
177 #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_MASK \
178   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_LEN, IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_SHIFT)
179 
180 #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_SHIFT (63)
181 #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_LEN   (1)
182 #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_MASK \
183   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_COND_CHGD_LEN, IA32_PERF_GLOBAL_STATUS_COND_CHGD_SHIFT)
184 
185 // Bits in the IA32_PERF_GLOBAL_INUSE MSR.
186 
187 #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_SHIFT(ctr) (ctr)
188 #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_LEN        (1)
189 #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_MASK(ctr) \
190   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_LEN, IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_SHIFT(ctr))
191 
192 #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_SHIFT(ctr) (32 + (ctr))
193 #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_LEN        (1)
194 #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_MASK(ctr) \
195   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_LEN, IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_SHIFT(ctr))
196 
197 #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_SHIFT (63)
198 #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_LEN   (1)
199 #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_MASK \
200   IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_PMI_LEN, IA32_PERF_GLOBAL_STATUS_INUSE_PMI_SHIFT)
201 
202 // Bits in the IA32_PERF_GLOBAL_OVF_CTRL MSR.
203 
204 #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_SHIFT(ctr) (0)
205 #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_LEN        (1)
206 #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_MASK(ctr) \
207   IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_LEN, IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_SHIFT(ctr))
208 
209 #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_SHIFT(ctr) (32 + (ctr))
210 #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_LEN   (1)
211 #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_MASK(ctr) \
212   IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_LEN, IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_SHIFT(ctr))
213 
214 #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_SHIFT (61)
215 #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_LEN   (1)
216 #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_MASK \
217   IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_LEN, IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_SHIFT)
218 
219 #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_SHIFT (62)
220 #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_LEN   (1)
221 #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_MASK \
222   IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_LEN, IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_SHIFT)
223 
224 #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_SHIFT (63)
225 #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_LEN   (1)
226 #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_MASK \
227   IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_LEN, IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_SHIFT)
228 
229 // Bits in the IA32_DEBUGCTL MSR.
230 
231 #define IA32_DEBUGCTL_LBR_SHIFT (0)
232 #define IA32_DEBUGCTL_LBR_LEN   (1)
233 #define IA32_DEBUGCTL_LBR_MASK \
234   IPM_MSR_MASK(IA32_DEBUGCTL_LBR_LEN, IA32_DEBUGCTL_LBR_SHIFT)
235 
236 #define IA32_DEBUGCTL_BTF_SHIFT (1)
237 #define IA32_DEBUGCTL_BTF_LEN   (1)
238 #define IA32_DEBUGCTL_BTF_MASK \
239   IPM_MSR_MASK(IA32_DEBUGCTL_BTF_LEN, IA32_DEBUGCTL_BTF_SHIFT)
240 
241 #define IA32_DEBUGCTL_TR_SHIFT (6)
242 #define IA32_DEBUGCTL_TR_LEN   (1)
243 #define IA32_DEBUGCTL_TR_MASK \
244   IPM_MSR_MASK(IA32_DEBUGCTL_TR_LEN, IA32_DEBUGCTL_TR_SHIFT)
245 
246 #define IA32_DEBUGCTL_BTS_SHIFT (7)
247 #define IA32_DEBUGCTL_BTS_LEN   (1)
248 #define IA32_DEBUGCTL_BTS_MASK \
249   IPM_MSR_MASK(IA32_DEBUGCTL_BTS_LEN, IA32_DEBUGCTL_BTS_SHIFT)
250 
251 #define IA32_DEBUGCTL_BTINT_SHIFT (8)
252 #define IA32_DEBUGCTL_BTINT_LEN   (1)
253 #define IA32_DEBUGCTL_BTINT_MASK \
254   IPM_MSR_MASK(IA32_DEBUGCTL_BTINT_LEN, IA32_DEBUGCTL_BTINT_SHIFT)
255 
256 #define IA32_DEBUGCTL_BTS_OFF_OS_SHIFT (9)
257 #define IA32_DEBUGCTL_BTS_OFF_OS_LEN   (1)
258 #define IA32_DEBUGCTL_BTS_OFF_OS_MASK \
259   IPM_MSR_MASK(IA32_DEBUGCTL_BTS_OFF_OS_LEN, IA32_DEBUGCTL_BTS_OFF_OS_SHIFT)
260 
261 #define IA32_DEBUGCTL_BTS_OFF_USR_SHIFT (10)
262 #define IA32_DEBUGCTL_BTS_OFF_USR_LEN   (1)
263 #define IA32_DEBUGCTL_BTS_OFF_USR_MASK \
264   IPM_MSR_MASK(IA32_DEBUGCTL_BTS_OFF_USR_LEN, IA32_DEBUGCTL_BTS_OFF_USR_SHIFT)
265 
266 #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_SHIFT (11)
267 #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_LEN   (1)
268 #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_MASK \
269   IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_LEN, IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_SHIFT)
270 
271 #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_SHIFT (12)
272 #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_LEN   (1)
273 #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_MASK \
274   IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_LEN, IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_SHIFT)
275 
276 #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_SHIFT (14)
277 #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_LEN   (1)
278 #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_MASK \
279   IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_WHILE_SMM_LEN, IA32_DEBUGCTL_FREEZE_WHILE_SMM_SHIFT)
280 
281 #define IA32_DEBUGCTL_RTM_SHIFT (15)
282 #define IA32_DEBUGCTL_RTM_LEN   (1)
283 #define IA32_DEBUGCTL_RTM_MASK \
284   IPM_MSR_MASK(IA32_DEBUGCTL_RTM_LEN, IA32_DEBUGCTL_RTM_SHIFT)
285 
286 // Bits in the IA32_LBR_INFO_* MSRs
287 
288 #define IA32_LBR_INFO_CYCLE_COUNT_SHIFT (0)
289 #define IA32_LBR_INFO_CYCLE_COUNT_LEN   (16)
290 #define IA32_LBR_INFO_CYCLE_COUNT_MASK \
291   IPM_MSR_MASK(IA32_LBR_INFO_CYCLE_COUNT_LEN, IA32_LBR_INFO_CYCLE_COUNT_SHIFT)
292 
293 #define IA32_LBR_INFO_TSX_ABORT_SHIFT (61)
294 #define IA32_LBR_INFO_TSX_ABORT_COUNT_LEN   (1)
295 #define IA32_LBR_INFO_TSX_ABORT_MASK \
296   IPM_MSR_MASK(IA32_LBR_INFO_TSX_ABORT_LEN, IA32_LBR_INFO_TSX_ABORT_SHIFT)
297 
298 #define IA32_LBR_INFO_IN_TSX_SHIFT (62)
299 #define IA32_LBR_INFO_IN_TSX_LEN   (1)
300 #define IA32_LBR_INFO_IN_TSX_MASK \
301   IPM_MSR_MASK(IA32_LBR_INFO_IN_TSX_LEN, IA32_LBR_INFO_IN_TSX_SHIFT)
302 
303 #define IA32_LBR_INFO_MISPRED_SHIFT (63)
304 #define IA32_LBR_INFO_MISPRED_LEN   (1)
305 #define IA32_LBR_INFO_MISPRED_MASK \
306   IPM_MSR_MASK(IA32_LBR_INFO_MISPRED_LEN, IA32_LBR_INFO_MISPRED_SHIFT)
307 
308 // Bits in the IA32_LBR_TOS MSR
309 
310 #define IA32_LBR_TOS_TOS_SHIFT (0)
311 #define IA32_LBR_TOS_TOS_LEN   (5)
312 #define IA32_LBR_TOS_TOS_MASK \
313   IPM_MSR_MASK(IA32_LBR_TOS_TOS_LEN, IA32_LBR_TOS_TOS_SHIFT)
314 
315 // maximum number of programmable counters
316 // These are all "events" in our parlance, but on Intel these are all
317 // counter events, so we use the more specific term "counter".
318 #define IPM_MAX_PROGRAMMABLE_COUNTERS 8
319 
320 // maximum number of fixed-use counters
321 // These are all "events" in our parlance, but on Intel these are all
322 // counter events, so we use the more specific term "counter".
323 #define IPM_MAX_FIXED_COUNTERS 3
324 
325 // misc events
326 // Some of these events are counters, but not all of them are, so we use
327 // the more generic term "events".
328 // See, e.g., skylake-misc-events.inc.
329 // This isn't the total number of events, it's just the maximum
330 // we can collect at one time.
331 #define IPM_MAX_MISC_EVENTS 16
332 
333 ///////////////////////////////////////////////////////////////////////////////
334 
335 // These structs are used for communication between the device driver
336 // and the kernel.
337 
338 // Properties of perf data collection on this system.
339 typedef struct {
340     // The H/W Performance Monitor version.
341     uint32_t pm_version;
342     // The number of fixed events.
343     uint32_t num_fixed_events;
344     // The number of programmable events.
345     uint32_t num_programmable_events;
346     // The number of misc events.
347     uint32_t num_misc_events;
348     // For fixed events that are counters, the width in bits.
349     uint32_t fixed_counter_width;
350     // For programmable events that are counters, the width in bits.
351     uint32_t programmable_counter_width;
352     // The PERF_CAPABILITIES MSR.
353     uint64_t perf_capabilities;
354     // The size of the LBR (Last Branch Record) stack.
355     // A value of zero means LBR is not supported. This may be zero even if
356     // LBR is supported by the chip because the device is not recognized as
357     // supporting it.
358     uint32_t lbr_stack_size;
359 } zx_x86_pmu_properties_t;
360 
361 // This is for passing buffer specs to the kernel.
362 typedef struct {
363     zx_handle_t vmo;
364 } zx_x86_pmu_buffer_t;
365 
366 // PMU configuration.
367 typedef struct {
368     // IA32_PERF_GLOBAL_CTRL
369     uint64_t global_ctrl;
370 
371     // IA32_FIXED_CTR_CTRL
372     uint64_t fixed_ctrl;
373 
374     // IA32_DEBUGCTL
375     uint64_t debug_ctrl;
376 
377     // The id of the timebase counter to use.
378     // A "timebase counter" is used to trigger collection of data from other
379     // events. In other words it sets the sample rate for those events.
380     // If zero, then no timebase is in use: Each event must trigger its own
381     // data collection. Otherwise the value is the id of the timebase counter
382     // to use, which must appear in one of |programmable_ids| or |fixed_ids|.
383     cpuperf_event_id_t timebase_id;
384 
385     // Ids of each event. These values are written to the trace buffer to
386     // identify the event.
387     // The used entries begin at index zero and are consecutive (no holes).
388     cpuperf_event_id_t fixed_ids[IPM_MAX_FIXED_COUNTERS];
389     cpuperf_event_id_t programmable_ids[IPM_MAX_PROGRAMMABLE_COUNTERS];
390     // Ids of other h/w events to collect data for.
391     cpuperf_event_id_t misc_ids[IPM_MAX_MISC_EVENTS];
392 
393     // Initial value of each counter.
394     // The "misc" counters currently do not support initial values.
395     uint64_t fixed_initial_value[IPM_MAX_FIXED_COUNTERS];
396     uint64_t programmable_initial_value[IPM_MAX_PROGRAMMABLE_COUNTERS];
397 
398     // Flags for each counter.
399     uint32_t fixed_flags[IPM_MAX_FIXED_COUNTERS];
400     uint32_t programmable_flags[IPM_MAX_PROGRAMMABLE_COUNTERS];
401     uint32_t misc_flags[IPM_MAX_MISC_EVENTS];
402 // Both of IPM_CONFIG_FLAG_{PC,TIMEBASE} cannot be set.
403 #define IPM_CONFIG_FLAG_MASK     0x7
404 // Collect aspace+pc values.
405 // Cannot be set with IPM_CONFIG_FLAG_TIMEBASE unless the counter is
406 // |timebase_id|.
407 #define IPM_CONFIG_FLAG_PC       (1u << 0)
408 // Collect this event's value when |timebase_id| counter's data is collected.
409 // While redundant, it is ok to set this for the |timebase_id| counter.
410 #define IPM_CONFIG_FLAG_TIMEBASE (1u << 1)
411 // Collect the available set of last branches.
412 // Branch data is emitted as CPUPERF_RECORD_LBR records.
413 // Cannot be set with IPM_CONFIG_FLAG_TIMEBASE unless the counter is
414 // |timebase_id|.
415 // This is only available when the underlying system supports it.
416 #define IPM_CONFIG_FLAG_LBR      (1u << 2)
417 
418     // IA32_PERFEVTSEL_*
419     uint64_t programmable_events[IPM_MAX_PROGRAMMABLE_COUNTERS];
420 } zx_x86_pmu_config_t;
421 
422 ///////////////////////////////////////////////////////////////////////////////
423 
424 // Flags for the events in Intel *-pm-events.inc.
425 // See for example Intel Volume 3, Table 19-3.
426 // "Non-Architectural Performance Events of the Processor Core Supported by
427 // Skylake Microarchitecture and Kaby Lake Microarchitecture"
428 
429 // Flags for non-architectural counters
430 // CounterMask values
431 #define IPM_REG_FLAG_CMSK_MASK 0xff
432 #define IPM_REG_FLAG_CMSK1   1
433 #define IPM_REG_FLAG_CMSK2   2
434 #define IPM_REG_FLAG_CMSK4   4
435 #define IPM_REG_FLAG_CMSK5   5
436 #define IPM_REG_FLAG_CMSK6   6
437 #define IPM_REG_FLAG_CMSK8   8
438 #define IPM_REG_FLAG_CMSK10 10
439 #define IPM_REG_FLAG_CMSK12 12
440 #define IPM_REG_FLAG_CMSK16 16
441 #define IPM_REG_FLAG_CMSK20 20
442 // AnyThread = 1 required
443 #define IPM_REG_FLAG_ANYT   0x100
444 // Invert = 1 required
445 #define IPM_REG_FLAG_INV    0x200
446 // Edge = 1 required
447 #define IPM_REG_FLAG_EDG    0x400
448 // Also supports PEBS and DataLA
449 #define IPM_REG_FLAG_PSDLA  0x800
450 // Also supports PEBS
451 #define IPM_REG_FLAG_PS     0x1000
452 
453 // Extra flags
454 
455 // Architectural event
456 #define IPM_REG_FLAG_ARCH 0x10000
457 
458 // Fixed counters
459 #define IPM_REG_FLAG_FIXED_MASK 0xf00000
460 #define IPM_REG_FLAG_FIXED0     0x100000
461 #define IPM_REG_FLAG_FIXED1     0x200000
462 #define IPM_REG_FLAG_FIXED2     0x300000
463 
464 // Flags for misc registers
465 
466 // The register consists of a set of fields (not a counter).
467 // Just print in hex.
468 #define IPM_MISC_REG_FLAG_FIELDS (1u << 0)
469 // The value uses a non-standard encoding.
470 // Just print in hex.
471 #define IPM_MISC_REG_FLAG_RAW (1u << 1)
472 
473 __END_CDECLS
474