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