aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hwpmc
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2023-06-06 17:26:46 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2023-09-03 20:27:21 +0000
commitc190fb35f35cc163b61e582a49115680b0d49dcc (patch)
tree14273dbca2ddb46275f6103b00b77eb63a04ac4e /sys/dev/hwpmc
parent45dcc17e2fb8f0f9838ba167b311f271a08fcea9 (diff)
Diffstat (limited to 'sys/dev/hwpmc')
-rw-r--r--sys/dev/hwpmc/hwpmc_amd.c3
-rw-r--r--sys/dev/hwpmc/hwpmc_arm64.c6
-rw-r--r--sys/dev/hwpmc/hwpmc_core.c6
-rw-r--r--sys/dev/hwpmc/hwpmc_mod.c3
-rw-r--r--sys/dev/hwpmc/hwpmc_power8.c3
-rw-r--r--sys/dev/hwpmc/hwpmc_uncore.c6
6 files changed, 23 insertions, 4 deletions
diff --git a/sys/dev/hwpmc/hwpmc_amd.c b/sys/dev/hwpmc/hwpmc_amd.c
index b15d223bc7a5..fbbaf92a1547 100644
--- a/sys/dev/hwpmc/hwpmc_amd.c
+++ b/sys/dev/hwpmc/hwpmc_amd.c
@@ -582,6 +582,9 @@ amd_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (pd->pd_class != a->pm_class)
return EINVAL;
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
caps = pm->pm_caps;
PMCDBG2(MDP,ALL,1,"amd-allocate ri=%d caps=0x%x", ri, caps);
diff --git a/sys/dev/hwpmc/hwpmc_arm64.c b/sys/dev/hwpmc/hwpmc_arm64.c
index 995b7158ac20..9a5debb8016b 100644
--- a/sys/dev/hwpmc/hwpmc_arm64.c
+++ b/sys/dev/hwpmc/hwpmc_arm64.c
@@ -177,9 +177,9 @@ arm64_allocate_pmc(int cpu, int ri, struct pmc *pm,
}
pe = a->pm_ev;
- /* Adjust the config value if needed. */
- config = a->pm_md.pm_md_config;
- if ((a->pm_md.pm_md_flags & PM_MD_RAW_EVENT) == 0) {
+ if ((a->pm_flags & PMC_F_EV_PMU) != 0) {
+ config = a->pm_md.pm_md_config;
+ } else {
config = (uint32_t)pe - PMC_EV_ARMV8_FIRST;
if (config > (PMC_EV_ARMV8_LAST - PMC_EV_ARMV8_FIRST))
return (EINVAL);
diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c
index 15b875e3af94..3829a03eb729 100644
--- a/sys/dev/hwpmc/hwpmc_core.c
+++ b/sys/dev/hwpmc/hwpmc_core.c
@@ -239,6 +239,9 @@ iaf_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (a->pm_class != PMC_CLASS_IAF)
return (EINVAL);
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
iap = &a->pm_md.pm_iap;
config = iap->pm_iap_config;
ev = IAP_EVSEL_GET(config);
@@ -721,6 +724,9 @@ iap_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (a->pm_class != PMC_CLASS_IAP)
return (EINVAL);
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
iap = &a->pm_md.pm_iap;
ev = IAP_EVSEL_GET(iap->pm_iap_config);
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
index de012b74d558..5dd8bc67d60a 100644
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -3349,7 +3349,8 @@ pmc_do_op_pmcallocate(struct thread *td, struct pmc_op_pmcallocate *pa)
* Look for valid values for 'pm_flags'.
*/
if ((flags & ~(PMC_F_DESCENDANTS | PMC_F_LOG_PROCCSW |
- PMC_F_LOG_PROCEXIT | PMC_F_CALLCHAIN | PMC_F_USERCALLCHAIN)) != 0)
+ PMC_F_LOG_PROCEXIT | PMC_F_CALLCHAIN | PMC_F_USERCALLCHAIN |
+ PMC_F_EV_PMU)) != 0)
return (EINVAL);
/* PMC_F_USERCALLCHAIN is only valid with PMC_F_CALLCHAIN. */
diff --git a/sys/dev/hwpmc/hwpmc_power8.c b/sys/dev/hwpmc/hwpmc_power8.c
index fc6b878eff7d..d7ccbc5c6c0a 100644
--- a/sys/dev/hwpmc/hwpmc_power8.c
+++ b/sys/dev/hwpmc/hwpmc_power8.c
@@ -168,6 +168,9 @@ power8_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (a->pm_class != PMC_CLASS_POWER8)
return (EINVAL);
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
/*
* PMC5 and PMC6 are not programmable and always count instructions
* completed and cycles, respectively.
diff --git a/sys/dev/hwpmc/hwpmc_uncore.c b/sys/dev/hwpmc/hwpmc_uncore.c
index c16800c14ce1..fd4266b605ef 100644
--- a/sys/dev/hwpmc/hwpmc_uncore.c
+++ b/sys/dev/hwpmc/hwpmc_uncore.c
@@ -199,6 +199,9 @@ ucf_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (a->pm_class != PMC_CLASS_UCF)
return (EINVAL);
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
flags = UCF_EN;
pm->pm_md.pm_ucf.pm_ucf_ctrl = (flags << (ri * 4));
@@ -498,6 +501,9 @@ ucp_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (a->pm_class != PMC_CLASS_UCP)
return (EINVAL);
+ if ((a->pm_flags & PMC_F_EV_PMU) == 0)
+ return (EINVAL);
+
ucp = &a->pm_md.pm_ucp;
ev = UCP_EVSEL(ucp->pm_ucp_config);
switch (uncore_cputype) {