diff --git a/sys/dev/hwpmc/hwpmc_amd.c b/sys/dev/hwpmc/hwpmc_amd.c index 8531db13dc6..29902149471 100644 --- a/sys/dev/hwpmc/hwpmc_amd.c +++ b/sys/dev/hwpmc/hwpmc_amd.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -183,6 +184,24 @@ static uint64_t amd_core_allowed_mask; static uint64_t amd_l3_allowed_mask; static uint64_t amd_df_allowed_mask; +static uint64_t amd_core_extra_mask; +static uint64_t amd_l3_extra_mask; +static uint64_t amd_df_extra_mask; + +SYSCTL_DECL(_kern_hwpmc); + +SYSCTL_U64(_kern_hwpmc, OID_AUTO, amd_core_extra_mask, CTLFLAG_RDTUN, + &amd_core_extra_mask, 0, + "Extra allowed bits in AMD core PMU PERFEVTSEL (override; default 0)"); + +SYSCTL_U64(_kern_hwpmc, OID_AUTO, amd_l3_extra_mask, CTLFLAG_RDTUN, + &amd_l3_extra_mask, 0, + "Extra allowed bits in AMD L3 PMU control (override; default 0)"); + +SYSCTL_U64(_kern_hwpmc, OID_AUTO, amd_df_extra_mask, CTLFLAG_RDTUN, + &amd_df_extra_mask, 0, + "Extra allowed bits in AMD DF PMU control (override; default 0)"); + static void amd_init_policy(void) { @@ -205,13 +224,13 @@ amd_config_mask(enum sub_class subclass, uint64_t caps) switch (subclass) { case PMC_AMD_SUB_CLASS_CORE: - return (amd_core_allowed_mask | + return (amd_core_allowed_mask | amd_core_extra_mask | (((caps & PMC_CAP_PRECISE) != 0) ? AMD_PMC_PRECISERETIRE : 0)); case PMC_AMD_SUB_CLASS_L3_CACHE: - return (amd_l3_allowed_mask); + return (amd_l3_allowed_mask | amd_l3_extra_mask); case PMC_AMD_SUB_CLASS_DATA_FABRIC: - return (amd_df_allowed_mask); + return (amd_df_allowed_mask | amd_df_extra_mask); default: return (0); } diff --git a/sys/dev/hwpmc/hwpmc_ibs.c b/sys/dev/hwpmc/hwpmc_ibs.c index 93e43d65763..8cfe7b2df14 100644 --- a/sys/dev/hwpmc/hwpmc_ibs.c +++ b/sys/dev/hwpmc/hwpmc_ibs.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #define EXTERR_CATEGORY EXTERR_CAT_HWPMC_IBS @@ -60,6 +61,19 @@ static uint64_t ibs_features; static uint64_t ibs_fetch_allowed_mask; static uint64_t ibs_op_allowed_mask; +static uint64_t ibs_fetch_extra_mask; +static uint64_t ibs_op_extra_mask; + +SYSCTL_DECL(_kern_hwpmc); + +SYSCTL_U64(_kern_hwpmc, OID_AUTO, ibs_fetch_extra_mask, CTLFLAG_RDTUN, + &ibs_fetch_extra_mask, 0, + "Extra allowed bits in the IBS fetch control MSR (override; default 0)"); + +SYSCTL_U64(_kern_hwpmc, OID_AUTO, ibs_op_extra_mask, CTLFLAG_RDTUN, + &ibs_op_extra_mask, 0, + "Extra allowed bits in the IBS op control MSR (override; default 0)"); + /* * Per-processor information */ @@ -98,7 +112,7 @@ static int ibs_validate_fetch_config(uint64_t config) { - if ((config & ~ibs_fetch_allowed_mask) != 0) + if ((config & ~(ibs_fetch_allowed_mask | ibs_fetch_extra_mask)) != 0) return (EINVAL); return (0); @@ -120,6 +134,8 @@ ibs_validate_op_config(uint64_t config) allowed_mask |= IBS_OP_CTL_LDLATMASK | IBS_OP_CTL_L3MISSONLY; } + allowed_mask |= ibs_op_extra_mask; + if ((config & ~allowed_mask) != 0) return (EINVAL);