0001
0002 #ifndef _ASM_X86_PERF_EVENT_H
0003 #define _ASM_X86_PERF_EVENT_H
0004
0005 #include <linux/static_call.h>
0006
0007
0008
0009
0010
0011 #define INTEL_PMC_MAX_GENERIC 32
0012 #define INTEL_PMC_MAX_FIXED 16
0013 #define INTEL_PMC_IDX_FIXED 32
0014
0015 #define X86_PMC_IDX_MAX 64
0016
0017 #define MSR_ARCH_PERFMON_PERFCTR0 0xc1
0018 #define MSR_ARCH_PERFMON_PERFCTR1 0xc2
0019
0020 #define MSR_ARCH_PERFMON_EVENTSEL0 0x186
0021 #define MSR_ARCH_PERFMON_EVENTSEL1 0x187
0022
0023 #define ARCH_PERFMON_EVENTSEL_EVENT 0x000000FFULL
0024 #define ARCH_PERFMON_EVENTSEL_UMASK 0x0000FF00ULL
0025 #define ARCH_PERFMON_EVENTSEL_USR (1ULL << 16)
0026 #define ARCH_PERFMON_EVENTSEL_OS (1ULL << 17)
0027 #define ARCH_PERFMON_EVENTSEL_EDGE (1ULL << 18)
0028 #define ARCH_PERFMON_EVENTSEL_PIN_CONTROL (1ULL << 19)
0029 #define ARCH_PERFMON_EVENTSEL_INT (1ULL << 20)
0030 #define ARCH_PERFMON_EVENTSEL_ANY (1ULL << 21)
0031 #define ARCH_PERFMON_EVENTSEL_ENABLE (1ULL << 22)
0032 #define ARCH_PERFMON_EVENTSEL_INV (1ULL << 23)
0033 #define ARCH_PERFMON_EVENTSEL_CMASK 0xFF000000ULL
0034
0035 #define HSW_IN_TX (1ULL << 32)
0036 #define HSW_IN_TX_CHECKPOINTED (1ULL << 33)
0037 #define ICL_EVENTSEL_ADAPTIVE (1ULL << 34)
0038 #define ICL_FIXED_0_ADAPTIVE (1ULL << 32)
0039
0040 #define AMD64_EVENTSEL_INT_CORE_ENABLE (1ULL << 36)
0041 #define AMD64_EVENTSEL_GUESTONLY (1ULL << 40)
0042 #define AMD64_EVENTSEL_HOSTONLY (1ULL << 41)
0043
0044 #define AMD64_EVENTSEL_INT_CORE_SEL_SHIFT 37
0045 #define AMD64_EVENTSEL_INT_CORE_SEL_MASK \
0046 (0xFULL << AMD64_EVENTSEL_INT_CORE_SEL_SHIFT)
0047
0048 #define AMD64_EVENTSEL_EVENT \
0049 (ARCH_PERFMON_EVENTSEL_EVENT | (0x0FULL << 32))
0050 #define INTEL_ARCH_EVENT_MASK \
0051 (ARCH_PERFMON_EVENTSEL_UMASK | ARCH_PERFMON_EVENTSEL_EVENT)
0052
0053 #define AMD64_L3_SLICE_SHIFT 48
0054 #define AMD64_L3_SLICE_MASK \
0055 (0xFULL << AMD64_L3_SLICE_SHIFT)
0056 #define AMD64_L3_SLICEID_MASK \
0057 (0x7ULL << AMD64_L3_SLICE_SHIFT)
0058
0059 #define AMD64_L3_THREAD_SHIFT 56
0060 #define AMD64_L3_THREAD_MASK \
0061 (0xFFULL << AMD64_L3_THREAD_SHIFT)
0062 #define AMD64_L3_F19H_THREAD_MASK \
0063 (0x3ULL << AMD64_L3_THREAD_SHIFT)
0064
0065 #define AMD64_L3_EN_ALL_CORES BIT_ULL(47)
0066 #define AMD64_L3_EN_ALL_SLICES BIT_ULL(46)
0067
0068 #define AMD64_L3_COREID_SHIFT 42
0069 #define AMD64_L3_COREID_MASK \
0070 (0x7ULL << AMD64_L3_COREID_SHIFT)
0071
0072 #define X86_RAW_EVENT_MASK \
0073 (ARCH_PERFMON_EVENTSEL_EVENT | \
0074 ARCH_PERFMON_EVENTSEL_UMASK | \
0075 ARCH_PERFMON_EVENTSEL_EDGE | \
0076 ARCH_PERFMON_EVENTSEL_INV | \
0077 ARCH_PERFMON_EVENTSEL_CMASK)
0078 #define X86_ALL_EVENT_FLAGS \
0079 (ARCH_PERFMON_EVENTSEL_EDGE | \
0080 ARCH_PERFMON_EVENTSEL_INV | \
0081 ARCH_PERFMON_EVENTSEL_CMASK | \
0082 ARCH_PERFMON_EVENTSEL_ANY | \
0083 ARCH_PERFMON_EVENTSEL_PIN_CONTROL | \
0084 HSW_IN_TX | \
0085 HSW_IN_TX_CHECKPOINTED)
0086 #define AMD64_RAW_EVENT_MASK \
0087 (X86_RAW_EVENT_MASK | \
0088 AMD64_EVENTSEL_EVENT)
0089 #define AMD64_RAW_EVENT_MASK_NB \
0090 (AMD64_EVENTSEL_EVENT | \
0091 ARCH_PERFMON_EVENTSEL_UMASK)
0092
0093 #define AMD64_PERFMON_V2_EVENTSEL_EVENT_NB \
0094 (AMD64_EVENTSEL_EVENT | \
0095 GENMASK_ULL(37, 36))
0096
0097 #define AMD64_PERFMON_V2_EVENTSEL_UMASK_NB \
0098 (ARCH_PERFMON_EVENTSEL_UMASK | \
0099 GENMASK_ULL(27, 24))
0100
0101 #define AMD64_PERFMON_V2_RAW_EVENT_MASK_NB \
0102 (AMD64_PERFMON_V2_EVENTSEL_EVENT_NB | \
0103 AMD64_PERFMON_V2_EVENTSEL_UMASK_NB)
0104
0105 #define AMD64_NUM_COUNTERS 4
0106 #define AMD64_NUM_COUNTERS_CORE 6
0107 #define AMD64_NUM_COUNTERS_NB 4
0108
0109 #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c
0110 #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8)
0111 #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX 0
0112 #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT \
0113 (1 << (ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX))
0114
0115 #define ARCH_PERFMON_BRANCH_MISSES_RETIRED 6
0116 #define ARCH_PERFMON_EVENTS_COUNT 7
0117
0118 #define PEBS_DATACFG_MEMINFO BIT_ULL(0)
0119 #define PEBS_DATACFG_GP BIT_ULL(1)
0120 #define PEBS_DATACFG_XMMS BIT_ULL(2)
0121 #define PEBS_DATACFG_LBRS BIT_ULL(3)
0122 #define PEBS_DATACFG_LBR_SHIFT 24
0123
0124
0125
0126
0127
0128 union cpuid10_eax {
0129 struct {
0130 unsigned int version_id:8;
0131 unsigned int num_counters:8;
0132 unsigned int bit_width:8;
0133 unsigned int mask_length:8;
0134 } split;
0135 unsigned int full;
0136 };
0137
0138 union cpuid10_ebx {
0139 struct {
0140 unsigned int no_unhalted_core_cycles:1;
0141 unsigned int no_instructions_retired:1;
0142 unsigned int no_unhalted_reference_cycles:1;
0143 unsigned int no_llc_reference:1;
0144 unsigned int no_llc_misses:1;
0145 unsigned int no_branch_instruction_retired:1;
0146 unsigned int no_branch_misses_retired:1;
0147 } split;
0148 unsigned int full;
0149 };
0150
0151 union cpuid10_edx {
0152 struct {
0153 unsigned int num_counters_fixed:5;
0154 unsigned int bit_width_fixed:8;
0155 unsigned int reserved1:2;
0156 unsigned int anythread_deprecated:1;
0157 unsigned int reserved2:16;
0158 } split;
0159 unsigned int full;
0160 };
0161
0162
0163
0164
0165 union cpuid28_eax {
0166 struct {
0167
0168 unsigned int lbr_depth_mask:8;
0169 unsigned int reserved:22;
0170
0171 unsigned int lbr_deep_c_reset:1;
0172
0173 unsigned int lbr_lip:1;
0174 } split;
0175 unsigned int full;
0176 };
0177
0178 union cpuid28_ebx {
0179 struct {
0180
0181 unsigned int lbr_cpl:1;
0182
0183 unsigned int lbr_filter:1;
0184
0185 unsigned int lbr_call_stack:1;
0186 } split;
0187 unsigned int full;
0188 };
0189
0190 union cpuid28_ecx {
0191 struct {
0192
0193 unsigned int lbr_mispred:1;
0194
0195 unsigned int lbr_timed_lbr:1;
0196
0197 unsigned int lbr_br_type:1;
0198 } split;
0199 unsigned int full;
0200 };
0201
0202
0203
0204
0205
0206 union cpuid_0x80000022_ebx {
0207 struct {
0208
0209 unsigned int num_core_pmc:4;
0210 unsigned int reserved:6;
0211
0212 unsigned int num_df_pmc:6;
0213 } split;
0214 unsigned int full;
0215 };
0216
0217 struct x86_pmu_capability {
0218 int version;
0219 int num_counters_gp;
0220 int num_counters_fixed;
0221 int bit_width_gp;
0222 int bit_width_fixed;
0223 unsigned int events_mask;
0224 int events_mask_len;
0225 unsigned int pebs_ept :1;
0226 };
0227
0228
0229
0230
0231
0232
0233 #define INTEL_PMC_FIXED_RDPMC_BASE (1 << 30)
0234 #define INTEL_PMC_FIXED_RDPMC_METRICS (1 << 29)
0235
0236
0237
0238
0239 #define MSR_ARCH_PERFMON_FIXED_CTR_CTRL 0x38d
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258 #define MSR_ARCH_PERFMON_FIXED_CTR0 0x309
0259 #define INTEL_PMC_IDX_FIXED_INSTRUCTIONS (INTEL_PMC_IDX_FIXED + 0)
0260
0261
0262 #define MSR_ARCH_PERFMON_FIXED_CTR1 0x30a
0263 #define INTEL_PMC_IDX_FIXED_CPU_CYCLES (INTEL_PMC_IDX_FIXED + 1)
0264
0265
0266 #define MSR_ARCH_PERFMON_FIXED_CTR2 0x30b
0267 #define INTEL_PMC_IDX_FIXED_REF_CYCLES (INTEL_PMC_IDX_FIXED + 2)
0268 #define INTEL_PMC_MSK_FIXED_REF_CYCLES (1ULL << INTEL_PMC_IDX_FIXED_REF_CYCLES)
0269
0270
0271 #define MSR_ARCH_PERFMON_FIXED_CTR3 0x30c
0272 #define INTEL_PMC_IDX_FIXED_SLOTS (INTEL_PMC_IDX_FIXED + 3)
0273 #define INTEL_PMC_MSK_FIXED_SLOTS (1ULL << INTEL_PMC_IDX_FIXED_SLOTS)
0274
0275 static inline bool use_fixed_pseudo_encoding(u64 code)
0276 {
0277 return !(code & 0xff);
0278 }
0279
0280
0281
0282
0283
0284
0285
0286
0287 #define INTEL_PMC_IDX_FIXED_BTS (INTEL_PMC_IDX_FIXED + 15)
0288
0289
0290
0291
0292
0293
0294
0295 #define INTEL_PMC_IDX_METRIC_BASE (INTEL_PMC_IDX_FIXED + 16)
0296 #define INTEL_PMC_IDX_TD_RETIRING (INTEL_PMC_IDX_METRIC_BASE + 0)
0297 #define INTEL_PMC_IDX_TD_BAD_SPEC (INTEL_PMC_IDX_METRIC_BASE + 1)
0298 #define INTEL_PMC_IDX_TD_FE_BOUND (INTEL_PMC_IDX_METRIC_BASE + 2)
0299 #define INTEL_PMC_IDX_TD_BE_BOUND (INTEL_PMC_IDX_METRIC_BASE + 3)
0300 #define INTEL_PMC_IDX_TD_HEAVY_OPS (INTEL_PMC_IDX_METRIC_BASE + 4)
0301 #define INTEL_PMC_IDX_TD_BR_MISPREDICT (INTEL_PMC_IDX_METRIC_BASE + 5)
0302 #define INTEL_PMC_IDX_TD_FETCH_LAT (INTEL_PMC_IDX_METRIC_BASE + 6)
0303 #define INTEL_PMC_IDX_TD_MEM_BOUND (INTEL_PMC_IDX_METRIC_BASE + 7)
0304 #define INTEL_PMC_IDX_METRIC_END INTEL_PMC_IDX_TD_MEM_BOUND
0305 #define INTEL_PMC_MSK_TOPDOWN ((0xffull << INTEL_PMC_IDX_METRIC_BASE) | \
0306 INTEL_PMC_MSK_FIXED_SLOTS)
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317 #define INTEL_TD_SLOTS 0x0400
0318
0319 #define INTEL_TD_METRIC_RETIRING 0x8000
0320 #define INTEL_TD_METRIC_BAD_SPEC 0x8100
0321 #define INTEL_TD_METRIC_FE_BOUND 0x8200
0322 #define INTEL_TD_METRIC_BE_BOUND 0x8300
0323
0324 #define INTEL_TD_METRIC_HEAVY_OPS 0x8400
0325 #define INTEL_TD_METRIC_BR_MISPREDICT 0x8500
0326 #define INTEL_TD_METRIC_FETCH_LAT 0x8600
0327 #define INTEL_TD_METRIC_MEM_BOUND 0x8700
0328
0329 #define INTEL_TD_METRIC_MAX INTEL_TD_METRIC_MEM_BOUND
0330 #define INTEL_TD_METRIC_NUM 8
0331
0332 static inline bool is_metric_idx(int idx)
0333 {
0334 return (unsigned)(idx - INTEL_PMC_IDX_METRIC_BASE) < INTEL_TD_METRIC_NUM;
0335 }
0336
0337 static inline bool is_topdown_idx(int idx)
0338 {
0339 return is_metric_idx(idx) || idx == INTEL_PMC_IDX_FIXED_SLOTS;
0340 }
0341
0342 #define INTEL_PMC_OTHER_TOPDOWN_BITS(bit) \
0343 (~(0x1ull << bit) & INTEL_PMC_MSK_TOPDOWN)
0344
0345 #define GLOBAL_STATUS_COND_CHG BIT_ULL(63)
0346 #define GLOBAL_STATUS_BUFFER_OVF_BIT 62
0347 #define GLOBAL_STATUS_BUFFER_OVF BIT_ULL(GLOBAL_STATUS_BUFFER_OVF_BIT)
0348 #define GLOBAL_STATUS_UNC_OVF BIT_ULL(61)
0349 #define GLOBAL_STATUS_ASIF BIT_ULL(60)
0350 #define GLOBAL_STATUS_COUNTERS_FROZEN BIT_ULL(59)
0351 #define GLOBAL_STATUS_LBRS_FROZEN_BIT 58
0352 #define GLOBAL_STATUS_LBRS_FROZEN BIT_ULL(GLOBAL_STATUS_LBRS_FROZEN_BIT)
0353 #define GLOBAL_STATUS_TRACE_TOPAPMI_BIT 55
0354 #define GLOBAL_STATUS_TRACE_TOPAPMI BIT_ULL(GLOBAL_STATUS_TRACE_TOPAPMI_BIT)
0355 #define GLOBAL_STATUS_PERF_METRICS_OVF_BIT 48
0356
0357 #define GLOBAL_CTRL_EN_PERF_METRICS 48
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 #define INTEL_PMC_IDX_FIXED_VLBR (GLOBAL_STATUS_LBRS_FROZEN_BIT)
0370
0371
0372
0373
0374
0375 #define INTEL_FIXED_VLBR_EVENT 0x1b00
0376
0377
0378
0379
0380
0381 struct pebs_basic {
0382 u64 format_size;
0383 u64 ip;
0384 u64 applicable_counters;
0385 u64 tsc;
0386 };
0387
0388 struct pebs_meminfo {
0389 u64 address;
0390 u64 aux;
0391 u64 latency;
0392 u64 tsx_tuning;
0393 };
0394
0395 struct pebs_gprs {
0396 u64 flags, ip, ax, cx, dx, bx, sp, bp, si, di;
0397 u64 r8, r9, r10, r11, r12, r13, r14, r15;
0398 };
0399
0400 struct pebs_xmm {
0401 u64 xmm[16*2];
0402 };
0403
0404
0405
0406
0407 #define EXT_PERFMON_DEBUG_FEATURES 0x80000022
0408
0409
0410
0411
0412
0413 #define IBS_CPUID_FEATURES 0x8000001b
0414
0415
0416
0417
0418
0419 #define IBS_CAPS_AVAIL (1U<<0)
0420 #define IBS_CAPS_FETCHSAM (1U<<1)
0421 #define IBS_CAPS_OPSAM (1U<<2)
0422 #define IBS_CAPS_RDWROPCNT (1U<<3)
0423 #define IBS_CAPS_OPCNT (1U<<4)
0424 #define IBS_CAPS_BRNTRGT (1U<<5)
0425 #define IBS_CAPS_OPCNTEXT (1U<<6)
0426 #define IBS_CAPS_RIPINVALIDCHK (1U<<7)
0427 #define IBS_CAPS_OPBRNFUSE (1U<<8)
0428 #define IBS_CAPS_FETCHCTLEXTD (1U<<9)
0429 #define IBS_CAPS_OPDATA4 (1U<<10)
0430 #define IBS_CAPS_ZEN4 (1U<<11)
0431
0432 #define IBS_CAPS_DEFAULT (IBS_CAPS_AVAIL \
0433 | IBS_CAPS_FETCHSAM \
0434 | IBS_CAPS_OPSAM)
0435
0436
0437
0438
0439 #define IBSCTL 0x1cc
0440 #define IBSCTL_LVT_OFFSET_VALID (1ULL<<8)
0441 #define IBSCTL_LVT_OFFSET_MASK 0x0F
0442
0443
0444 #define IBS_FETCH_L3MISSONLY (1ULL<<59)
0445 #define IBS_FETCH_RAND_EN (1ULL<<57)
0446 #define IBS_FETCH_VAL (1ULL<<49)
0447 #define IBS_FETCH_ENABLE (1ULL<<48)
0448 #define IBS_FETCH_CNT 0xFFFF0000ULL
0449 #define IBS_FETCH_MAX_CNT 0x0000FFFFULL
0450
0451
0452
0453
0454
0455
0456 #define IBS_OP_CUR_CNT (0xFFF80ULL<<32)
0457 #define IBS_OP_CUR_CNT_RAND (0x0007FULL<<32)
0458 #define IBS_OP_CNT_CTL (1ULL<<19)
0459 #define IBS_OP_VAL (1ULL<<18)
0460 #define IBS_OP_ENABLE (1ULL<<17)
0461 #define IBS_OP_L3MISSONLY (1ULL<<16)
0462 #define IBS_OP_MAX_CNT 0x0000FFFFULL
0463 #define IBS_OP_MAX_CNT_EXT 0x007FFFFFULL
0464 #define IBS_OP_MAX_CNT_EXT_MASK (0x7FULL<<20)
0465 #define IBS_RIP_INVALID (1ULL<<38)
0466
0467 #ifdef CONFIG_X86_LOCAL_APIC
0468 extern u32 get_ibs_caps(void);
0469 #else
0470 static inline u32 get_ibs_caps(void) { return 0; }
0471 #endif
0472
0473 #ifdef CONFIG_PERF_EVENTS
0474 extern void perf_events_lapic_init(void);
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485 #define PERF_EFLAGS_EXACT (1UL << 3)
0486 #define PERF_EFLAGS_VM (1UL << 5)
0487
0488 struct pt_regs;
0489 struct x86_perf_regs {
0490 struct pt_regs regs;
0491 u64 *xmm_regs;
0492 };
0493
0494 extern unsigned long perf_instruction_pointer(struct pt_regs *regs);
0495 extern unsigned long perf_misc_flags(struct pt_regs *regs);
0496 #define perf_misc_flags(regs) perf_misc_flags(regs)
0497
0498 #include <asm/stacktrace.h>
0499
0500
0501
0502
0503
0504 #define perf_arch_fetch_caller_regs(regs, __ip) { \
0505 (regs)->ip = (__ip); \
0506 (regs)->sp = (unsigned long)__builtin_frame_address(0); \
0507 (regs)->cs = __KERNEL_CS; \
0508 regs->flags = 0; \
0509 }
0510
0511 struct perf_guest_switch_msr {
0512 unsigned msr;
0513 u64 host, guest;
0514 };
0515
0516 struct x86_pmu_lbr {
0517 unsigned int nr;
0518 unsigned int from;
0519 unsigned int to;
0520 unsigned int info;
0521 };
0522
0523 extern void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap);
0524 extern u64 perf_get_hw_event_config(int hw_event);
0525 extern void perf_check_microcode(void);
0526 extern void perf_clear_dirty_counters(void);
0527 extern int x86_perf_rdpmc_index(struct perf_event *event);
0528 #else
0529 static inline void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap)
0530 {
0531 memset(cap, 0, sizeof(*cap));
0532 }
0533
0534 static inline u64 perf_get_hw_event_config(int hw_event)
0535 {
0536 return 0;
0537 }
0538
0539 static inline void perf_events_lapic_init(void) { }
0540 static inline void perf_check_microcode(void) { }
0541 #endif
0542
0543 #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL)
0544 extern struct perf_guest_switch_msr *perf_guest_get_msrs(int *nr, void *data);
0545 extern int x86_perf_get_lbr(struct x86_pmu_lbr *lbr);
0546 #else
0547 struct perf_guest_switch_msr *perf_guest_get_msrs(int *nr, void *data);
0548 static inline int x86_perf_get_lbr(struct x86_pmu_lbr *lbr)
0549 {
0550 return -1;
0551 }
0552 #endif
0553
0554 #ifdef CONFIG_CPU_SUP_INTEL
0555 extern void intel_pt_handle_vmx(int on);
0556 #else
0557 static inline void intel_pt_handle_vmx(int on)
0558 {
0559
0560 }
0561 #endif
0562
0563 #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD)
0564 extern void amd_pmu_enable_virt(void);
0565 extern void amd_pmu_disable_virt(void);
0566
0567 #if defined(CONFIG_PERF_EVENTS_AMD_BRS)
0568
0569 #define PERF_NEEDS_LOPWR_CB 1
0570
0571
0572
0573
0574
0575
0576 extern void perf_amd_brs_lopwr_cb(bool lopwr_in);
0577
0578 DECLARE_STATIC_CALL(perf_lopwr_cb, perf_amd_brs_lopwr_cb);
0579
0580 static inline void perf_lopwr_cb(bool lopwr_in)
0581 {
0582 static_call_mod(perf_lopwr_cb)(lopwr_in);
0583 }
0584
0585 #endif
0586
0587 #else
0588 static inline void amd_pmu_enable_virt(void) { }
0589 static inline void amd_pmu_disable_virt(void) { }
0590 #endif
0591
0592 #define arch_perf_out_copy_user copy_from_user_nmi
0593
0594 #endif