| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // These definitions are used for communication between the cpu-trace |
| // device driver and the kernel only. |
| |
| #pragma once |
| |
| #include <lib/zircon-internal/device/cpu-trace/perf-mon.h> |
| #include <lib/zircon-internal/device/cpu-trace/common-pm.h> |
| |
| // MSRs |
| |
| #define IPM_MSR_MASK(len, shift) (((1ULL << (len)) - 1) << (shift)) |
| |
| // Bits in the IA32_PERF_CAPABILITIES MSR. |
| |
| #define IA32_PERF_CAPABILITIES_LBR_FORMAT_SHIFT (0) |
| #define IA32_PERF_CAPABILITIES_LBR_FORMAT_LEN (6) |
| #define IA32_PERF_CAPABILITIES_LBR_FORMAT_MASK \ |
| IPM_MSR_MASK(IA32_PERF_CAPABILITIES_LBR_FORMAT_LEN, IA32_PERF_CAPABILITIES_LBR_FORMAT_SHIFT) |
| |
| #define IA32_PERF_CAPABILITIES_PEBS_TRAP_SHIFT (6) |
| #define IA32_PERF_CAPABILITIES_PEBS_TRAP_LEN (1) |
| #define IA32_PERF_CAPABILITIES_PEBS_TRAP_MASK \ |
| IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_TRAP_LEN, IA32_PERF_CAPABILITIES_PEBS_TRAP_SHIFT) |
| |
| #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_SHIFT (7) |
| #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_LEN (1) |
| #define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_MASK \ |
| IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_LEN, \ |
| IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_SHIFT) |
| |
| #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_SHIFT (8) |
| #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_LEN (4) |
| #define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_MASK \ |
| IPM_MSR_MASK(IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_LEN, \ |
| IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_SHIFT) |
| |
| #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_SHIFT (12) |
| #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_LEN (1) |
| #define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_MASK \ |
| IPM_MSR_MASK(IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_LEN, \ |
| IA32_PERF_CAPABILITIES_FREEZE_SHILE_SMM_SHIFT) |
| |
| // Bits in the IA32_PERFEVTSELx MSRs. |
| |
| #define IA32_PERFEVTSEL_EVENT_SELECT_SHIFT (0) |
| #define IA32_PERFEVTSEL_EVENT_SELECT_LEN (8) |
| #define IA32_PERFEVTSEL_EVENT_SELECT_MASK \ |
| IPM_MSR_MASK(IA32_PERFEVTSEL_EVENT_SELECT_LEN, IA32_PERFEVTSEL_EVENT_SELECT_SHIFT) |
| |
| #define IA32_PERFEVTSEL_UMASK_SHIFT (8) |
| #define IA32_PERFEVTSEL_UMASK_LEN (8) |
| #define IA32_PERFEVTSEL_UMASK_MASK \ |
| IPM_MSR_MASK(IA32_PERFEVTSEL_UMASK_LEN, IA32_PERFEVTSEL_UMASK_SHIFT) |
| |
| #define IA32_PERFEVTSEL_USR_SHIFT (16) |
| #define IA32_PERFEVTSEL_USR_LEN (1) |
| #define IA32_PERFEVTSEL_USR_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_USR_LEN, IA32_PERFEVTSEL_USR_SHIFT) |
| |
| #define IA32_PERFEVTSEL_OS_SHIFT (17) |
| #define IA32_PERFEVTSEL_OS_LEN (1) |
| #define IA32_PERFEVTSEL_OS_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_OS_LEN, IA32_PERFEVTSEL_OS_SHIFT) |
| |
| #define IA32_PERFEVTSEL_E_SHIFT (18) |
| #define IA32_PERFEVTSEL_E_LEN (1) |
| #define IA32_PERFEVTSEL_E_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_E_LEN, IA32_PERFEVTSEL_E_SHIFT) |
| |
| #define IA32_PERFEVTSEL_PC_SHIFT (19) |
| #define IA32_PERFEVTSEL_PC_LEN (1) |
| #define IA32_PERFEVTSEL_PC_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_PC_LEN, IA32_PERFEVTSEL_PC_SHIFT) |
| |
| #define IA32_PERFEVTSEL_INT_SHIFT (20) |
| #define IA32_PERFEVTSEL_INT_LEN (1) |
| #define IA32_PERFEVTSEL_INT_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_INT_LEN, IA32_PERFEVTSEL_INT_SHIFT) |
| |
| #define IA32_PERFEVTSEL_ANY_SHIFT (21) |
| #define IA32_PERFEVTSEL_ANY_LEN (1) |
| #define IA32_PERFEVTSEL_ANY_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_ANY_LEN, IA32_PERFEVTSEL_ANY_SHIFT) |
| |
| #define IA32_PERFEVTSEL_EN_SHIFT (22) |
| #define IA32_PERFEVTSEL_EN_LEN (1) |
| #define IA32_PERFEVTSEL_EN_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_EN_LEN, IA32_PERFEVTSEL_EN_SHIFT) |
| |
| #define IA32_PERFEVTSEL_INV_SHIFT (23) |
| #define IA32_PERFEVTSEL_INV_LEN (1) |
| #define IA32_PERFEVTSEL_INV_MASK IPM_MSR_MASK(IA32_PERFEVTSEL_INV_LEN, IA32_PERFEVTSEL_INV_SHIFT) |
| |
| #define IA32_PERFEVTSEL_CMASK_SHIFT (24) |
| #define IA32_PERFEVTSEL_CMASK_LEN (8) |
| #define IA32_PERFEVTSEL_CMASK_MASK \ |
| IPM_MSR_MASK(IA32_PERFEVTSEL_CMASK_LEN, IA32_PERFEVTSEL_CMASK_SHIFT) |
| |
| // Bits in the IA32_FIXED_CTR_CTRL MSR. |
| |
| #define IA32_FIXED_CTR_CTRL_EN_SHIFT(ctr) (0 + (ctr)*4) |
| #define IA32_FIXED_CTR_CTRL_EN_LEN (2) |
| #define IA32_FIXED_CTR_CTRL_EN_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_EN_LEN, IA32_FIXED_CTR_CTRL_EN_SHIFT(ctr)) |
| |
| #define IA32_FIXED_CTR_CTRL_ANY_SHIFT(ctr) (2 + (ctr)*4) |
| #define IA32_FIXED_CTR_CTRL_ANY_LEN (1) |
| #define IA32_FIXED_CTR_CTRL_ANY_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_ANY_LEN, IA32_FIXED_CTR_CTRL_ANY_SHIFT(ctr)) |
| |
| #define IA32_FIXED_CTR_CTRL_PMI_SHIFT(ctr) (3 + (ctr)*4) |
| #define IA32_FIXED_CTR_CTRL_PMI_LEN (1) |
| #define IA32_FIXED_CTR_CTRL_PMI_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_FIXED_CTR_CTRL_PMI_LEN, IA32_FIXED_CTR_CTRL_PMI_SHIFT(ctr)) |
| |
| // The IA32_PERF_GLOBAL_CTRL MSR. |
| |
| #define IA32_PERF_GLOBAL_CTRL_PMC_EN_SHIFT(ctr) (ctr) |
| #define IA32_PERF_GLOBAL_CTRL_PMC_EN_LEN (1) |
| #define IA32_PERF_GLOBAL_CTRL_PMC_EN_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_CTRL_PMC_EN_LEN, IA32_PERF_GLOBAL_CTRL_PMC_EN_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_SHIFT(ctr) (32 + (ctr)) |
| #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_LEN (1) |
| #define IA32_PERF_GLOBAL_CTRL_FIXED_EN_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_CTRL_FIXED_EN_LEN, IA32_PERF_GLOBAL_CTRL_FIXED_EN_SHIFT(ctr)) |
| |
| // Bits in the IA32_PERF_GLOBAL_STATUS MSR. |
| // Note: Use these values for IA32_PERF_GLOBAL_STATUS_RESET and |
| // IA32_PERF_GLOBAL_STATUS_SET too. |
| |
| #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_SHIFT(ctr) (ctr) |
| #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_PMC_OVF_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_PMC_OVF_LEN, IA32_PERF_GLOBAL_STATUS_PMC_OVF_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_SHIFT(ctr) (32 + (ctr)) |
| #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_FIXED_OVF_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_FIXED_OVF_LEN, IA32_PERF_GLOBAL_STATUS_FIXED_OVF_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_SHIFT (55) |
| #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_LEN, \ |
| IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_SHIFT (58) |
| #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_LBR_FRZ_LEN, IA32_PERF_GLOBAL_STATUS_LBR_FRZ_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_SHIFT (59) |
| #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_CTR_FRZ_LEN, IA32_PERF_GLOBAL_STATUS_CTR_FRZ_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_ASCI_SHIFT (60) |
| #define IA32_PERF_GLOBAL_STATUS_ASCI_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_ASCI_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_ASCI_LEN, IA32_PERF_GLOBAL_STATUS_ASCI_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_SHIFT (61) |
| #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_LEN, IA32_PERF_GLOBAL_STATUS_UNCORE_OVF_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_SHIFT (62) |
| #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_LEN, \ |
| IA32_PERF_GLOBAL_STATUS_DS_BUFFER_OVF_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_SHIFT (63) |
| #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_COND_CHGD_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_COND_CHGD_LEN, IA32_PERF_GLOBAL_STATUS_COND_CHGD_SHIFT) |
| |
| // Bits in the IA32_PERF_GLOBAL_INUSE MSR. |
| |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_SHIFT(ctr) (ctr) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_LEN, \ |
| IA32_PERF_GLOBAL_STATUS_INUSE_PERFEVTSEL_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_SHIFT(ctr) (32 + (ctr)) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_LEN, \ |
| IA32_PERF_GLOBAL_STATUS_INUSE_FIXED_CTR_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_SHIFT (63) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_LEN (1) |
| #define IA32_PERF_GLOBAL_STATUS_INUSE_PMI_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_STATUS_INUSE_PMI_LEN, IA32_PERF_GLOBAL_STATUS_INUSE_PMI_SHIFT) |
| |
| // Bits in the IA32_PERF_GLOBAL_OVF_CTRL MSR. |
| |
| #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_SHIFT(ctr) (0) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_LEN, \ |
| IA32_PERF_GLOBAL_OVF_CTRL_PMC_CLR_OVF_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_SHIFT(ctr) (32 + (ctr)) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_MASK(ctr) \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_LEN, \ |
| IA32_PERF_GLOBAL_OVF_CTRL_FIXED_CTR_CLR_OVF_SHIFT(ctr)) |
| |
| #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_SHIFT (61) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_LEN, \ |
| IA32_PERF_GLOBAL_OVF_CTRL_UNCORE_CLR_OVF_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_SHIFT (62) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_LEN (1) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_LEN, \ |
| IA32_PERF_GLOBAL_OVF_CTRL_DS_BUFFER_CLR_OVF_SHIFT) |
| |
| #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_SHIFT (63) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_LEN (1) |
| #define IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_MASK \ |
| IPM_MSR_MASK(IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_LEN, \ |
| IA32_PERF_GLOBAL_OVF_CTRL_CLR_COND_CHGD_SHIFT) |
| |
| // Bits in the IA32_DEBUGCTL MSR. |
| |
| #define IA32_DEBUGCTL_LBR_SHIFT (0) |
| #define IA32_DEBUGCTL_LBR_LEN (1) |
| #define IA32_DEBUGCTL_LBR_MASK IPM_MSR_MASK(IA32_DEBUGCTL_LBR_LEN, IA32_DEBUGCTL_LBR_SHIFT) |
| |
| #define IA32_DEBUGCTL_BTF_SHIFT (1) |
| #define IA32_DEBUGCTL_BTF_LEN (1) |
| #define IA32_DEBUGCTL_BTF_MASK IPM_MSR_MASK(IA32_DEBUGCTL_BTF_LEN, IA32_DEBUGCTL_BTF_SHIFT) |
| |
| #define IA32_DEBUGCTL_TR_SHIFT (6) |
| #define IA32_DEBUGCTL_TR_LEN (1) |
| #define IA32_DEBUGCTL_TR_MASK IPM_MSR_MASK(IA32_DEBUGCTL_TR_LEN, IA32_DEBUGCTL_TR_SHIFT) |
| |
| #define IA32_DEBUGCTL_BTS_SHIFT (7) |
| #define IA32_DEBUGCTL_BTS_LEN (1) |
| #define IA32_DEBUGCTL_BTS_MASK IPM_MSR_MASK(IA32_DEBUGCTL_BTS_LEN, IA32_DEBUGCTL_BTS_SHIFT) |
| |
| #define IA32_DEBUGCTL_BTINT_SHIFT (8) |
| #define IA32_DEBUGCTL_BTINT_LEN (1) |
| #define IA32_DEBUGCTL_BTINT_MASK IPM_MSR_MASK(IA32_DEBUGCTL_BTINT_LEN, IA32_DEBUGCTL_BTINT_SHIFT) |
| |
| #define IA32_DEBUGCTL_BTS_OFF_OS_SHIFT (9) |
| #define IA32_DEBUGCTL_BTS_OFF_OS_LEN (1) |
| #define IA32_DEBUGCTL_BTS_OFF_OS_MASK \ |
| IPM_MSR_MASK(IA32_DEBUGCTL_BTS_OFF_OS_LEN, IA32_DEBUGCTL_BTS_OFF_OS_SHIFT) |
| |
| #define IA32_DEBUGCTL_BTS_OFF_USR_SHIFT (10) |
| #define IA32_DEBUGCTL_BTS_OFF_USR_LEN (1) |
| #define IA32_DEBUGCTL_BTS_OFF_USR_MASK \ |
| IPM_MSR_MASK(IA32_DEBUGCTL_BTS_OFF_USR_LEN, IA32_DEBUGCTL_BTS_OFF_USR_SHIFT) |
| |
| #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_SHIFT (11) |
| #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_LEN (1) |
| #define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_MASK \ |
| IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_LEN, IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_SHIFT) |
| |
| #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_SHIFT (12) |
| #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_LEN (1) |
| #define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_MASK \ |
| IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_LEN, IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_SHIFT) |
| |
| #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_SHIFT (14) |
| #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_LEN (1) |
| #define IA32_DEBUGCTL_FREEZE_WHILE_SMM_MASK \ |
| IPM_MSR_MASK(IA32_DEBUGCTL_FREEZE_WHILE_SMM_LEN, IA32_DEBUGCTL_FREEZE_WHILE_SMM_SHIFT) |
| |
| #define IA32_DEBUGCTL_RTM_SHIFT (15) |
| #define IA32_DEBUGCTL_RTM_LEN (1) |
| #define IA32_DEBUGCTL_RTM_MASK IPM_MSR_MASK(IA32_DEBUGCTL_RTM_LEN, IA32_DEBUGCTL_RTM_SHIFT) |
| |
| // Bits in the IA32_LBR_INFO_* MSRs |
| |
| #define IA32_LBR_INFO_CYCLE_COUNT_SHIFT (0) |
| #define IA32_LBR_INFO_CYCLE_COUNT_LEN (16) |
| #define IA32_LBR_INFO_CYCLE_COUNT_MASK \ |
| IPM_MSR_MASK(IA32_LBR_INFO_CYCLE_COUNT_LEN, IA32_LBR_INFO_CYCLE_COUNT_SHIFT) |
| |
| #define IA32_LBR_INFO_TSX_ABORT_SHIFT (61) |
| #define IA32_LBR_INFO_TSX_ABORT_COUNT_LEN (1) |
| #define IA32_LBR_INFO_TSX_ABORT_MASK \ |
| IPM_MSR_MASK(IA32_LBR_INFO_TSX_ABORT_LEN, IA32_LBR_INFO_TSX_ABORT_SHIFT) |
| |
| #define IA32_LBR_INFO_IN_TSX_SHIFT (62) |
| #define IA32_LBR_INFO_IN_TSX_LEN (1) |
| #define IA32_LBR_INFO_IN_TSX_MASK IPM_MSR_MASK(IA32_LBR_INFO_IN_TSX_LEN, IA32_LBR_INFO_IN_TSX_SHIFT) |
| |
| #define IA32_LBR_INFO_MISPRED_SHIFT (63) |
| #define IA32_LBR_INFO_MISPRED_LEN (1) |
| #define IA32_LBR_INFO_MISPRED_MASK \ |
| IPM_MSR_MASK(IA32_LBR_INFO_MISPRED_LEN, IA32_LBR_INFO_MISPRED_SHIFT) |
| |
| // Bits in the IA32_LBR_TOS MSR |
| |
| #define IA32_LBR_TOS_TOS_SHIFT (0) |
| #define IA32_LBR_TOS_TOS_LEN (5) |
| #define IA32_LBR_TOS_TOS_MASK IPM_MSR_MASK(IA32_LBR_TOS_TOS_LEN, IA32_LBR_TOS_TOS_SHIFT) |
| |
| // maximum number of programmable counters |
| // These are all "events" in our parlance, but on Intel these are all |
| // counter events, so we use the more specific term "counter". |
| #define IPM_MAX_PROGRAMMABLE_COUNTERS 8 |
| |
| // maximum number of fixed-use counters |
| // These are all "events" in our parlance, but on Intel these are all |
| // counter events, so we use the more specific term "counter". |
| #define IPM_MAX_FIXED_COUNTERS 3 |
| |
| // misc events |
| // Some of these events are counters, but not all of them are, so we use |
| // the more generic term "events". |
| // See, e.g., skylake-misc-events.inc. |
| // This isn't the total number of events, it's just the maximum |
| // we can collect at one time. |
| #define IPM_MAX_MISC_EVENTS 16 |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| // These structs are used for communication between the device driver |
| // and the kernel. |
| |
| namespace perfmon { |
| |
| // Properties of perf data collection on this system. |
| struct X86PmuProperties { |
| PmuCommonProperties common; |
| |
| uint8_t padding1[2]; |
| |
| // The PERF_CAPABILITIES MSR. |
| uint64_t perf_capabilities; |
| // The size of the LBR (Last Branch Record) stack. |
| // A value of zero means LBR is not supported. This may be zero even if |
| // LBR is supported by the chip because the device is not recognized as |
| // supporting it. |
| uint32_t lbr_stack_size; |
| |
| uint8_t padding2[4]; |
| }; |
| |
| // PMU configuration. |
| struct X86PmuConfig { |
| // IA32_PERF_GLOBAL_CTRL |
| uint64_t global_ctrl; |
| |
| // IA32_FIXED_CTR_CTRL |
| uint64_t fixed_ctrl; |
| |
| // IA32_DEBUGCTL |
| uint64_t debug_ctrl; |
| |
| // The id of the timebase counter to use or |kEventIdNone|. |
| // A "timebase counter" is used to trigger collection of data from other |
| // events. In other words it sets the sample rate for those events. |
| // If zero, then no timebase is in use: Each event must trigger its own |
| // data collection. Otherwise the value is the id of the timebase counter |
| // to use, which must appear in one of |programmable_ids| or |fixed_ids|. |
| PmuEventId timebase_event; |
| |
| // Ids of each event. These values are written to the trace buffer to |
| // identify the event. |
| // The used entries begin at index zero and are consecutive (no holes). |
| PmuEventId fixed_events[IPM_MAX_FIXED_COUNTERS]; |
| PmuEventId programmable_events[IPM_MAX_PROGRAMMABLE_COUNTERS]; |
| // Ids of other h/w events to collect data for. |
| PmuEventId misc_events[IPM_MAX_MISC_EVENTS]; |
| |
| // Initial value of each counter. |
| // The "misc" counters currently do not support initial values. |
| uint64_t fixed_initial_value[IPM_MAX_FIXED_COUNTERS]; |
| uint64_t programmable_initial_value[IPM_MAX_PROGRAMMABLE_COUNTERS]; |
| |
| // Flags for each counter. |
| // The values are |perfmon::kPmuConfigFlag*|. |
| uint32_t fixed_flags[IPM_MAX_FIXED_COUNTERS]; |
| uint32_t programmable_flags[IPM_MAX_PROGRAMMABLE_COUNTERS]; |
| uint32_t misc_flags[IPM_MAX_MISC_EVENTS]; |
| |
| uint8_t padding1[4]; |
| |
| // IA32_PERFEVTSEL_* |
| uint64_t programmable_hw_events[IPM_MAX_PROGRAMMABLE_COUNTERS]; |
| }; |
| |
| } // namespace perfmon |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| // Flags for the events in Intel *-pm-events.inc. |
| // See for example Intel Volume 3, Table 19-3. |
| // "Non-Architectural Performance Events of the Processor Core Supported by |
| // Skylake Microarchitecture and Kaby Lake Microarchitecture" |
| |
| // Flags for non-architectural counters |
| // CounterMask values |
| #define IPM_REG_FLAG_CMSK_MASK 0xff |
| #define IPM_REG_FLAG_CMSK1 1 |
| #define IPM_REG_FLAG_CMSK2 2 |
| #define IPM_REG_FLAG_CMSK4 4 |
| #define IPM_REG_FLAG_CMSK5 5 |
| #define IPM_REG_FLAG_CMSK6 6 |
| #define IPM_REG_FLAG_CMSK8 8 |
| #define IPM_REG_FLAG_CMSK10 10 |
| #define IPM_REG_FLAG_CMSK12 12 |
| #define IPM_REG_FLAG_CMSK16 16 |
| #define IPM_REG_FLAG_CMSK20 20 |
| // AnyThread = 1 required |
| #define IPM_REG_FLAG_ANYT 0x100 |
| // Invert = 1 required |
| #define IPM_REG_FLAG_INV 0x200 |
| // Edge = 1 required |
| #define IPM_REG_FLAG_EDG 0x400 |
| // Also supports PEBS and DataLA |
| #define IPM_REG_FLAG_PSDLA 0x800 |
| // Also supports PEBS |
| #define IPM_REG_FLAG_PS 0x1000 |
| |
| // Extra flags |
| |
| // Architectural event |
| #define IPM_REG_FLAG_ARCH 0x10000 |
| |
| // Fixed counters |
| #define IPM_REG_FLAG_FIXED_MASK 0xf00000 |
| #define IPM_REG_FLAG_FIXED0 0x100000 |
| #define IPM_REG_FLAG_FIXED1 0x200000 |
| #define IPM_REG_FLAG_FIXED2 0x300000 |
| |
| // Flags for misc registers |
| |
| // The register consists of a set of fields (not a counter). |
| // Just print in hex. |
| #define IPM_MISC_REG_FLAG_FIELDS (1u << 0) |
| // The value uses a non-standard encoding. |
| // Just print in hex. |
| #define IPM_MISC_REG_FLAG_RAW (1u << 1) |