diff --git a/sys/dev/hwpmc/hwpmc_amd.c b/sys/dev/hwpmc/hwpmc_amd.c
--- a/sys/dev/hwpmc/hwpmc_amd.c
+++ b/sys/dev/hwpmc/hwpmc_amd.c
@@ -397,11 +397,10 @@
  */
 
 static int
-amd_read_pmc(int cpu, int ri, pmc_value_t *v)
+amd_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
 	enum pmc_mode mode;
 	const struct amd_descr *pd;
-	struct pmc *pm;
 	pmc_value_t tmp;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -411,13 +410,7 @@
 	KASSERT(amd_pcpu[cpu],
 	    ("[amd,%d] null per-cpu, cpu %d", __LINE__, cpu));
 
-	pm = amd_pcpu[cpu]->pc_amdpmcs[ri].phw_pmc;
 	pd = &amd_pmcdesc[ri];
-
-	KASSERT(pm != NULL,
-	    ("[amd,%d] No owner for HWPMC [cpu%d,pmc%d]", __LINE__,
-		cpu, ri));
-
 	mode = PMC_TO_MODE(pm);
 
 	PMCDBG2(MDP,REA,1,"amd-read id=%d class=%d", ri, pd->pm_descr.pd_class);
@@ -456,24 +449,17 @@
  */
 
 static int
-amd_write_pmc(int cpu, int ri, pmc_value_t v)
+amd_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
 	const struct amd_descr *pd;
 	enum pmc_mode mode;
-	struct pmc *pm;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = amd_pcpu[cpu]->pc_amdpmcs[ri].phw_pmc;
 	pd = &amd_pmcdesc[ri];
-
-	KASSERT(pm != NULL,
-	    ("[amd,%d] PMC not owned (cpu%d,pmc%d)", __LINE__,
-		cpu, ri));
-
 	mode = PMC_TO_MODE(pm);
 
 #ifdef	HWPMC_DEBUG
@@ -705,11 +691,9 @@
  */
 
 static int
-amd_start_pmc(int cpu, int ri)
+amd_start_pmc(int cpu, int ri, struct pmc *pm)
 {
 	uint64_t config;
-	struct pmc *pm;
-	struct pmc_hw *phw;
 	const struct amd_descr *pd;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -717,14 +701,8 @@
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
 
-	phw = &amd_pcpu[cpu]->pc_amdpmcs[ri];
-	pm  = phw->phw_pmc;
 	pd = &amd_pmcdesc[ri];
 
-	KASSERT(pm != NULL,
-	    ("[amd,%d] starting cpu%d,pmc%d with null pmc record", __LINE__,
-		cpu, ri));
-
 	PMCDBG2(MDP,STA,1,"amd-start cpu=%d ri=%d", cpu, ri);
 
 	KASSERT(AMD_PMC_IS_STOPPED(pd->pm_evsel),
@@ -745,10 +723,8 @@
  */
 
 static int
-amd_stop_pmc(int cpu, int ri)
+amd_stop_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
-	struct pmc_hw *phw;
 	const struct amd_descr *pd;
 	uint64_t config;
 	int i;
@@ -758,13 +734,8 @@
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
 
-	phw = &amd_pcpu[cpu]->pc_amdpmcs[ri];
-	pm  = phw->phw_pmc;
-	pd  = &amd_pmcdesc[ri];
+	pd = &amd_pmcdesc[ri];
 
-	KASSERT(pm != NULL,
-	    ("[amd,%d] cpu%d,pmc%d no PMC to stop", __LINE__,
-		cpu, ri));
 	KASSERT(!AMD_PMC_IS_STOPPED(pd->pm_evsel),
 	    ("[amd,%d] PMC%d, CPU%d \"%s\" already stopped",
 		__LINE__, ri, cpu, pd->pm_descr.pd_name));
diff --git a/sys/dev/hwpmc/hwpmc_arm64.c b/sys/dev/hwpmc/hwpmc_arm64.c
--- a/sys/dev/hwpmc/hwpmc_arm64.c
+++ b/sys/dev/hwpmc/hwpmc_arm64.c
@@ -211,10 +211,9 @@
 
 
 static int
-arm64_read_pmc(int cpu, int ri, pmc_value_t *v)
+arm64_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
 	pmc_value_t tmp;
-	struct pmc *pm;
 	register_t s;
 	int reg;
 
@@ -223,8 +222,6 @@
 	KASSERT(ri >= 0 && ri < arm64_npmcs,
 	    ("[arm64,%d] illegal row index %d", __LINE__, ri));
 
-	pm  = arm64_pcpu[cpu]->pc_arm64pmcs[ri].phw_pmc;
-
 	/*
 	 * Ensure we don't get interrupted while updating the overflow count.
 	 */
@@ -260,17 +257,14 @@
 }
 
 static int
-arm64_write_pmc(int cpu, int ri, pmc_value_t v)
+arm64_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
-	struct pmc *pm;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[arm64,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < arm64_npmcs,
 	    ("[arm64,%d] illegal row-index %d", __LINE__, ri));
 
-	pm  = arm64_pcpu[cpu]->pc_arm64pmcs[ri].phw_pmc;
-
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		v = ARMV8_RELOAD_COUNT_TO_PERFCTR_VALUE(v);
 
@@ -306,14 +300,10 @@
 }
 
 static int
-arm64_start_pmc(int cpu, int ri)
+arm64_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc_hw *phw;
 	uint32_t config;
-	struct pmc *pm;
 
-	phw    = &arm64_pcpu[cpu]->pc_arm64pmcs[ri];
-	pm     = phw->phw_pmc;
 	config = pm->pm_md.pm_arm64.pm_arm64_evsel;
 
 	/*
@@ -334,7 +324,7 @@
 }
 
 static int
-arm64_stop_pmc(int cpu, int ri)
+arm64_stop_pmc(int cpu, int ri, struct pmc *pm __unused)
 {
 	/*
 	 * Disable the PMCs.
diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c
--- a/sys/dev/hwpmc/hwpmc_core.c
+++ b/sys/dev/hwpmc/hwpmc_core.c
@@ -368,9 +368,8 @@
 }
 
 static int
-iaf_read_pmc(int cpu, int ri, pmc_value_t *v)
+iaf_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
-	struct pmc *pm;
 	pmc_value_t tmp;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -378,12 +377,6 @@
 	KASSERT(ri >= 0 && ri < core_iaf_npmc,
 	    ("[core,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = core_pcpu[cpu]->pc_corepmcs[ri + core_iaf_ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] cpu %d ri %d(%d) pmc not configured", __LINE__, cpu,
-		ri, ri + core_iaf_ri));
-
 	tmp = rdpmc(IAF_RI_TO_MSR(ri));
 
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
@@ -421,9 +414,8 @@
 }
 
 static int
-iaf_start_pmc(int cpu, int ri)
+iaf_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
 	struct core_cpu *cc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -434,8 +426,6 @@
 	PMCDBG2(MDP,STA,1,"iaf-start cpu=%d ri=%d", cpu, ri);
 
 	cc = core_pcpu[cpu];
-	pm = cc->pc_corepmcs[ri + core_iaf_ri].phw_pmc;
-
 	cc->pc_iafctrl |= pm->pm_md.pm_iaf.pm_iaf_ctrl;
 	wrmsr(IAF_CTRL, cc->pc_iafctrl);
 
@@ -450,7 +440,7 @@
 }
 
 static int
-iaf_stop_pmc(int cpu, int ri)
+iaf_stop_pmc(int cpu, int ri, struct pmc *pm)
 {
 	struct core_cpu *cc;
 
@@ -476,10 +466,9 @@
 }
 
 static int
-iaf_write_pmc(int cpu, int ri, pmc_value_t v)
+iaf_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
 	struct core_cpu *cc;
-	struct pmc *pm;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[core,%d] illegal cpu value %d", __LINE__, cpu));
@@ -487,10 +476,6 @@
 	    ("[core,%d] illegal row-index %d", __LINE__, ri));
 
 	cc = core_pcpu[cpu];
-	pm = cc->pc_corepmcs[ri + core_iaf_ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri));
 
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		v = iaf_reload_count_to_perfctr_value(v);
@@ -846,9 +831,8 @@
 }
 
 static int
-iap_read_pmc(int cpu, int ri, pmc_value_t *v)
+iap_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
-	struct pmc *pm;
 	pmc_value_t tmp;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -856,12 +840,6 @@
 	KASSERT(ri >= 0 && ri < core_iap_npmc,
 	    ("[core,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = core_pcpu[cpu]->pc_corepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu,
-		ri));
-
 	tmp = rdpmc(ri);
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		*v = iap_perfctr_value_to_reload_count(tmp);
@@ -894,9 +872,8 @@
 }
 
 static int
-iap_start_pmc(int cpu, int ri)
+iap_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
 	uint64_t evsel;
 	struct core_cpu *cc;
 
@@ -906,11 +883,6 @@
 	    ("[core,%d] illegal row-index %d", __LINE__, ri));
 
 	cc = core_pcpu[cpu];
-	pm = cc->pc_corepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] starting cpu%d,ri%d with no pmc configured",
-		__LINE__, cpu, ri));
 
 	PMCDBG2(MDP,STA,1, "iap-start cpu=%d ri=%d", cpu, ri);
 
@@ -943,23 +915,14 @@
 }
 
 static int
-iap_stop_pmc(int cpu, int ri)
+iap_stop_pmc(int cpu, int ri, struct pmc *pm __unused)
 {
-	struct pmc *pm __diagused;
-	struct core_cpu *cc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[core,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < core_iap_npmc,
 	    ("[core,%d] illegal row index %d", __LINE__, ri));
 
-	cc = core_pcpu[cpu];
-	pm = cc->pc_corepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] cpu%d ri%d no configured PMC to stop", __LINE__,
-		cpu, ri));
-
 	PMCDBG2(MDP,STO,1, "iap-stop cpu=%d ri=%d", cpu, ri);
 
 	wrmsr(IAP_EVSEL0 + ri, 0);
@@ -970,23 +933,14 @@
 }
 
 static int
-iap_write_pmc(int cpu, int ri, pmc_value_t v)
+iap_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
-	struct pmc *pm;
-	struct core_cpu *cc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[core,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < core_iap_npmc,
 	    ("[core,%d] illegal row index %d", __LINE__, ri));
 
-	cc = core_pcpu[cpu];
-	pm = cc->pc_corepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[core,%d] cpu%d ri%d no configured PMC to stop", __LINE__,
-		cpu, ri));
-
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		v = iap_reload_count_to_perfctr_value(v);
 
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -1488,7 +1488,7 @@
 
 		PMCDBG3(CSW,SWI,1,"cpu=%d ri=%d new=%jd", cpu, ri, newvalue);
 
-		pcd->pcd_write_pmc(cpu, adjri, newvalue);
+		pcd->pcd_write_pmc(cpu, adjri, pm, newvalue);
 
 		/* If a sampling mode PMC, reset stalled state. */
 		if (PMC_TO_MODE(pm) == PMC_MODE_TS)
@@ -1498,7 +1498,7 @@
 		pm->pm_pcpu_state[cpu].pps_cpustate = 1;
 
 		/* Start the PMC. */
-		pcd->pcd_start_pmc(cpu, adjri);
+		pcd->pcd_start_pmc(cpu, adjri, pm);
 	}
 
 	/*
@@ -1601,7 +1601,7 @@
 		 */
 		pm->pm_pcpu_state[cpu].pps_cpustate = 0;
 		if (pm->pm_pcpu_state[cpu].pps_stalled == 0)
-			pcd->pcd_stop_pmc(cpu, adjri);
+			pcd->pcd_stop_pmc(cpu, adjri, pm);
 
 		KASSERT(counter_u64_fetch(pm->pm_runcount) > 0,
 			("[pmc,%d] pm=%p runcount %ld", __LINE__, (void *) pm,
@@ -1625,7 +1625,7 @@
 			    ("[pmc,%d] pp refcnt = %d", __LINE__,
 				pp->pp_refcnt));
 
-			pcd->pcd_read_pmc(cpu, adjri, &newvalue);
+			pcd->pcd_read_pmc(cpu, adjri, pm, &newvalue);
 
 			if (mode == PMC_MODE_TS) {
 				PMCDBG3(CSW,SWO,1,"cpu=%d ri=%d val=%jd (samp)",
@@ -2824,7 +2824,7 @@
 			PMCDBG2(PMC,REL,2, "stopping cpu=%d ri=%d", cpu, ri);
 
 			critical_enter();
-			pcd->pcd_stop_pmc(cpu, adjri);
+			pcd->pcd_stop_pmc(cpu, adjri, pm);
 			critical_exit();
 		}
 
@@ -3246,7 +3246,7 @@
 	pm->pm_state = PMC_STATE_RUNNING;
 
 	critical_enter();
-	if ((error = pcd->pcd_write_pmc(cpu, adjri,
+	if ((error = pcd->pcd_write_pmc(cpu, adjri, pm,
 		 PMC_IS_SAMPLING_MODE(mode) ?
 		 pm->pm_sc.pm_reloadcount :
 		 pm->pm_sc.pm_initial)) == 0) {
@@ -3256,7 +3256,7 @@
 
 		/* Indicate that we desire this to run. Start it. */
 		pm->pm_pcpu_state[cpu].pps_cpustate = 1;
-		error = pcd->pcd_start_pmc(cpu, adjri);
+		error = pcd->pcd_start_pmc(cpu, adjri, pm);
 	}
 	critical_exit();
 
@@ -3321,8 +3321,9 @@
 
 	pm->pm_pcpu_state[cpu].pps_cpustate = 0;
 	critical_enter();
-	if ((error = pcd->pcd_stop_pmc(cpu, adjri)) == 0)
-		error = pcd->pcd_read_pmc(cpu, adjri, &pm->pm_sc.pm_initial);
+	if ((error = pcd->pcd_stop_pmc(cpu, adjri, pm)) == 0)
+		error = pcd->pcd_read_pmc(cpu, adjri, pm,
+		    &pm->pm_sc.pm_initial);
 	critical_exit();
 
 	pmc_restore_cpu_binding(&pb);
@@ -4400,7 +4401,7 @@
 				if ((pm->pm_flags & PMC_F_ATTACHED_TO_OWNER) &&
 				    (pm->pm_state == PMC_STATE_RUNNING))
 					error = (*pcd->pcd_read_pmc)(cpu, adjri,
-					    &oldvalue);
+					    pm, &oldvalue);
 				else
 					oldvalue = pm->pm_gv.pm_savedvalue;
 			}
@@ -4425,13 +4426,14 @@
 
 			critical_enter();
 			/* save old value */
-			if (prw.pm_flags & PMC_F_OLDVALUE)
+			if (prw.pm_flags & PMC_F_OLDVALUE) {
 				if ((error = (*pcd->pcd_read_pmc)(cpu, adjri,
-					 &oldvalue)))
+				    pm, &oldvalue)))
 					goto error;
+			}
 			/* write out new value */
 			if (prw.pm_flags & PMC_F_NEWVALUE)
-				error = (*pcd->pcd_write_pmc)(cpu, adjri,
+				error = (*pcd->pcd_write_pmc)(cpu, adjri, pm,
 				    prw.pm_value);
 		error:
 			critical_exit();
@@ -5028,7 +5030,7 @@
 			continue;
 
 		pm->pm_pcpu_state[cpu].pps_stalled = 0;
-		(*pcd->pcd_start_pmc)(cpu, adjri);
+		(*pcd->pcd_start_pmc)(cpu, adjri, pm);
 	}
 }
 
@@ -5162,11 +5164,11 @@
 			if (pm->pm_pcpu_state[cpu].pps_cpustate) {
 				pm->pm_pcpu_state[cpu].pps_cpustate = 0;
 				if (!pm->pm_pcpu_state[cpu].pps_stalled) {
-					(void) pcd->pcd_stop_pmc(cpu, adjri);
+					(void) pcd->pcd_stop_pmc(cpu, adjri, pm);
 
 					if (PMC_TO_MODE(pm) == PMC_MODE_TC) {
 						pcd->pcd_read_pmc(cpu, adjri,
-						    &newvalue);
+						    pm, &newvalue);
 						tmp = newvalue -
 						    PMC_PCPU_SAVED(cpu,ri);
 
diff --git a/sys/dev/hwpmc/hwpmc_soft.c b/sys/dev/hwpmc/hwpmc_soft.c
--- a/sys/dev/hwpmc/hwpmc_soft.c
+++ b/sys/dev/hwpmc/hwpmc_soft.c
@@ -257,22 +257,14 @@
 }
 
 static int
-soft_read_pmc(int cpu, int ri, pmc_value_t *v)
+soft_read_pmc(int cpu, int ri, struct pmc *pm __unused, pmc_value_t *v)
 {
-	struct pmc *pm __diagused;
-	const struct pmc_hw *phw;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[soft,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < SOFT_NPMCS,
 	    ("[soft,%d] illegal row-index %d", __LINE__, ri));
 
-	phw = &soft_pcpu[cpu]->soft_hw[ri];
-	pm  = phw->phw_pmc;
-
-	KASSERT(pm != NULL,
-	    ("[soft,%d] no owner for PHW [cpu%d,pmc%d]", __LINE__, cpu, ri));
-
 	PMCDBG1(MDP,REA,1,"soft-read id=%d", ri);
 
 	*v = soft_pcpu[cpu]->soft_values[ri];
@@ -281,20 +273,13 @@
 }
 
 static int
-soft_write_pmc(int cpu, int ri, pmc_value_t v)
+soft_write_pmc(int cpu, int ri, struct pmc *pm __unused, pmc_value_t v)
 {
-	struct pmc *pm __diagused;
-
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[soft,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < SOFT_NPMCS,
 	    ("[soft,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = soft_pcpu[cpu]->soft_hw[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[soft,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri));
-
 	PMCDBG3(MDP,WRI,1, "soft-write cpu=%d ri=%d v=%jx", cpu, ri, v);
 
 	soft_pcpu[cpu]->soft_values[ri] = v;
@@ -335,10 +320,8 @@
 }
 
 static int
-soft_start_pmc(int cpu, int ri)
+soft_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
-	struct soft_cpu *pc;
 	struct pmc_soft *ps;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -346,12 +329,6 @@
 	KASSERT(ri >= 0 && ri < SOFT_NPMCS,
 	    ("[soft,%d] illegal row-index %d", __LINE__, ri));
 
-	pc = soft_pcpu[cpu];
-	pm = pc->soft_hw[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[soft,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri));
-
 	ps = pmc_soft_ev_acquire(pm->pm_event);
 	if (ps == NULL)
 		return (EINVAL);
@@ -362,10 +339,8 @@
 }
 
 static int
-soft_stop_pmc(int cpu, int ri)
+soft_stop_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
-	struct soft_cpu *pc;
 	struct pmc_soft *ps;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -373,12 +348,6 @@
 	KASSERT(ri >= 0 && ri < SOFT_NPMCS,
 	    ("[soft,%d] illegal row-index %d", __LINE__, ri));
 
-	pc = soft_pcpu[cpu];
-	pm = pc->soft_hw[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[soft,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri));
-
 	ps = pmc_soft_ev_acquire(pm->pm_event);
 	/* event unregistered ? */
 	if (ps != NULL) {
@@ -420,7 +389,7 @@
 			user_mode = TRAPF_USERMODE(ks->pm_tf);
 			error = pmc_process_interrupt(PMC_SR, pm, ks->pm_tf);
 			if (error) {
-				soft_stop_pmc(ks->pm_cpu, ri);
+				soft_stop_pmc(ks->pm_cpu, ri, pm);
 				continue;
 			}
 
diff --git a/sys/dev/hwpmc/hwpmc_tsc.c b/sys/dev/hwpmc/hwpmc_tsc.c
--- a/sys/dev/hwpmc/hwpmc_tsc.c
+++ b/sys/dev/hwpmc/hwpmc_tsc.c
@@ -220,22 +220,14 @@
 }
 
 static int
-tsc_read_pmc(int cpu, int ri, pmc_value_t *v)
+tsc_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
-	struct pmc *pm;
 	enum pmc_mode mode __diagused;
-	const struct pmc_hw *phw;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[tsc,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri == 0, ("[tsc,%d] illegal ri %d", __LINE__, ri));
 
-	phw = &tsc_pcpu[cpu]->tc_hw;
-	pm  = phw->phw_pmc;
-
-	KASSERT(pm != NULL,
-	    ("[tsc,%d] no owner for PHW [cpu%d,pmc%d]", __LINE__, cpu, ri));
-
 	mode = PMC_TO_MODE(pm);
 
 	KASSERT(mode == PMC_MODE_SC,
@@ -270,7 +262,7 @@
 }
 
 static int
-tsc_start_pmc(int cpu __diagused, int ri __diagused)
+tsc_start_pmc(int cpu __diagused, int ri __diagused, struct pmc *pm __unused)
 {
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -281,7 +273,7 @@
 }
 
 static int
-tsc_stop_pmc(int cpu __diagused, int ri __diagused)
+tsc_stop_pmc(int cpu __diagused, int ri __diagused, struct pmc *pm __unused)
 {
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -292,7 +284,8 @@
 }
 
 static int
-tsc_write_pmc(int cpu __diagused, int ri __diagused, pmc_value_t v __unused)
+tsc_write_pmc(int cpu __diagused, int ri __diagused, struct pmc *pm __unused,
+    pmc_value_t v __unused)
 {
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
diff --git a/sys/dev/hwpmc/hwpmc_uncore.c b/sys/dev/hwpmc/hwpmc_uncore.c
--- a/sys/dev/hwpmc/hwpmc_uncore.c
+++ b/sys/dev/hwpmc/hwpmc_uncore.c
@@ -260,9 +260,8 @@
 }
 
 static int
-ucf_read_pmc(int cpu, int ri, pmc_value_t *v)
+ucf_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
-	struct pmc *pm;
 	pmc_value_t tmp;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -270,12 +269,6 @@
 	KASSERT(ri >= 0 && ri < uncore_ucf_npmc,
 	    ("[uncore,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = uncore_pcpu[cpu]->pc_uncorepmcs[ri + uncore_ucf_ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] cpu %d ri %d(%d) pmc not configured", __LINE__, cpu,
-		ri, ri + uncore_ucf_ri));
-
 	tmp = rdmsr(UCF_CTR0 + ri);
 
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
@@ -305,9 +298,8 @@
 }
 
 static int
-ucf_start_pmc(int cpu, int ri)
+ucf_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
 	struct uncore_cpu *ucfc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -318,8 +310,6 @@
 	PMCDBG2(MDP,STA,1,"ucf-start cpu=%d ri=%d", cpu, ri);
 
 	ucfc = uncore_pcpu[cpu];
-	pm = ucfc->pc_uncorepmcs[ri + uncore_ucf_ri].phw_pmc;
-
 	ucfc->pc_ucfctrl |= pm->pm_md.pm_ucf.pm_ucf_ctrl;
 
 	wrmsr(UCF_CTRL, ucfc->pc_ucfctrl);
@@ -335,7 +325,7 @@
 }
 
 static int
-ucf_stop_pmc(int cpu, int ri)
+ucf_stop_pmc(int cpu, int ri, struct pmc *pm __unused)
 {
 	uint32_t fc;
 	struct uncore_cpu *ucfc;
@@ -366,10 +356,9 @@
 }
 
 static int
-ucf_write_pmc(int cpu, int ri, pmc_value_t v)
+ucf_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
 	struct uncore_cpu *cc;
-	struct pmc *pm;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[uncore,%d] illegal cpu value %d", __LINE__, cpu));
@@ -377,10 +366,6 @@
 	    ("[uncore,%d] illegal row-index %d", __LINE__, ri));
 
 	cc = uncore_pcpu[cpu];
-	pm = cc->pc_uncorepmcs[ri + uncore_ucf_ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] cpu %d ri %d pmc not configured", __LINE__, cpu, ri));
 
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		v = ucf_reload_count_to_perfctr_value(v);
@@ -581,9 +566,8 @@
 }
 
 static int
-ucp_read_pmc(int cpu, int ri, pmc_value_t *v)
+ucp_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v)
 {
-	struct pmc *pm;
 	pmc_value_t tmp;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
@@ -591,12 +575,6 @@
 	KASSERT(ri >= 0 && ri < uncore_ucp_npmc,
 	    ("[uncore,%d] illegal row-index %d", __LINE__, ri));
 
-	pm = uncore_pcpu[cpu]->pc_uncorepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] cpu %d ri %d pmc not configured", __LINE__, cpu,
-		ri));
-
 	tmp = rdmsr(UCP_PMC0 + ri);
 	if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
 		*v = ucp_perfctr_value_to_reload_count(tmp);
@@ -629,9 +607,8 @@
 }
 
 static int
-ucp_start_pmc(int cpu, int ri)
+ucp_start_pmc(int cpu, int ri, struct pmc *pm)
 {
-	struct pmc *pm;
 	uint64_t evsel;
 	struct uncore_cpu *cc;
 
@@ -641,11 +618,6 @@
 	    ("[uncore,%d] illegal row-index %d", __LINE__, ri));
 
 	cc = uncore_pcpu[cpu];
-	pm = cc->pc_uncorepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] starting cpu%d,ri%d with no pmc configured",
-		__LINE__, cpu, ri));
 
 	PMCDBG2(MDP,STA,1, "ucp-start cpu=%d ri=%d", cpu, ri);
 
@@ -664,23 +636,14 @@
 }
 
 static int
-ucp_stop_pmc(int cpu, int ri)
+ucp_stop_pmc(int cpu, int ri, struct pmc *pm __unused)
 {
-	struct pmc *pm __diagused;
-	struct uncore_cpu *cc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[uncore,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < uncore_ucp_npmc,
 	    ("[uncore,%d] illegal row index %d", __LINE__, ri));
 
-	cc = uncore_pcpu[cpu];
-	pm = cc->pc_uncorepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] cpu%d ri%d no configured PMC to stop", __LINE__,
-		cpu, ri));
-
 	PMCDBG2(MDP,STO,1, "ucp-stop cpu=%d ri=%d", cpu, ri);
 
 	/* stop hw. */
@@ -692,23 +655,14 @@
 }
 
 static int
-ucp_write_pmc(int cpu, int ri, pmc_value_t v)
+ucp_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v)
 {
-	struct pmc *pm;
-	struct uncore_cpu *cc;
 
 	KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
 	    ("[uncore,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < uncore_ucp_npmc,
 	    ("[uncore,%d] illegal row index %d", __LINE__, ri));
 
-	cc = uncore_pcpu[cpu];
-	pm = cc->pc_uncorepmcs[ri].phw_pmc;
-
-	KASSERT(pm,
-	    ("[uncore,%d] cpu%d ri%d no configured PMC to stop", __LINE__,
-		cpu, ri));
-
 	PMCDBG4(MDP,WRI,1, "ucp-write cpu=%d ri=%d msr=0x%x v=%jx", cpu, ri,
 	    UCP_PMC0 + ri, v);
 
diff --git a/sys/sys/pmc.h b/sys/sys/pmc.h
--- a/sys/sys/pmc.h
+++ b/sys/sys/pmc.h
@@ -62,7 +62,7 @@
  * The patch version is incremented for every bug fix.
  */
 #define	PMC_VERSION_MAJOR	0x09
-#define	PMC_VERSION_MINOR	0x03
+#define	PMC_VERSION_MINOR	0x04
 #define	PMC_VERSION_PATCH	0x0000
 
 #define	PMC_VERSION		(PMC_VERSION_MAJOR << 24 |		\
@@ -1004,8 +1004,10 @@
 	/* configuring/reading/writing the hardware PMCs */
 	int (*pcd_config_pmc)(int _cpu, int _ri, struct pmc *_pm);
 	int (*pcd_get_config)(int _cpu, int _ri, struct pmc **_ppm);
-	int (*pcd_read_pmc)(int _cpu, int _ri, pmc_value_t *_value);
-	int (*pcd_write_pmc)(int _cpu, int _ri, pmc_value_t _value);
+	int (*pcd_read_pmc)(int _cpu, int _ri, struct pmc *_pm,
+	    pmc_value_t *_value);
+	int (*pcd_write_pmc)(int _cpu, int _ri, struct pmc *_pm,
+	    pmc_value_t _value);
 
 	/* pmc allocation/release */
 	int (*pcd_allocate_pmc)(int _cpu, int _ri, struct pmc *_t,
@@ -1013,8 +1015,8 @@
 	int (*pcd_release_pmc)(int _cpu, int _ri, struct pmc *_pm);
 
 	/* starting and stopping PMCs */
-	int (*pcd_start_pmc)(int _cpu, int _ri);
-	int (*pcd_stop_pmc)(int _cpu, int _ri);
+	int (*pcd_start_pmc)(int _cpu, int _ri, struct pmc *_pm);
+	int (*pcd_stop_pmc)(int _cpu, int _ri, struct pmc *_pm);
 
 	/* description */
 	int (*pcd_describe)(int _cpu, int _ri, struct pmc_info *_pi,