hwpmc: Correct selection of Intel fixed counters.

Intel json's use event=0 to specify fixed counter number via umask.
Alternatively fixed counters have equivalent programmable event/umask.

MFC after:	1 month
This commit is contained in:
Alexander Motin 2022-05-30 19:46:48 -04:00
parent acdfbc6cbe
commit c1e813d123

View File

@ -245,15 +245,31 @@ iaf_allocate_pmc(int cpu, int ri, struct pmc *pm,
ev = IAP_EVSEL_GET(config);
umask = IAP_UMASK_GET(config);
/* INST_RETIRED.ANY */
if (ev == 0xC0 && ri != 0)
return (EINVAL);
/* CPU_CLK_UNHALTED.THREAD */
if (ev == 0x3C && ri != 1)
return (EINVAL);
/* CPU_CLK_UNHALTED.REF */
if (ev == 0x0 && umask == 0x3 && ri != 2)
return (EINVAL);
if (ev == 0x0) {
if (umask != ri + 1)
return (EINVAL);
} else {
switch (ri) {
case 0: /* INST_RETIRED.ANY */
if (ev != 0xC0 || umask != 0x00)
return (EINVAL);
break;
case 1: /* CPU_CLK_UNHALTED.THREAD */
if (ev != 0x3C || umask != 0x00)
return (EINVAL);
break;
case 2: /* CPU_CLK_UNHALTED.REF */
if (ev != 0x3C || umask != 0x01)
return (EINVAL);
break;
case 3: /* TOPDOWN.SLOTS */
if (ev != 0xA4 || umask != 0x01)
return (EINVAL);
break;
default:
return (EINVAL);
}
}
pmc_alloc_refs++;
if ((cpu_stdext_feature3 & CPUID_STDEXT3_TSXFA) != 0 &&