Skip to content

Commit

Permalink
[AArch64] Guessing the fixed performance counters
Browse files Browse the repository at this point in the history
  • Loading branch information
cyring committed May 12, 2024
1 parent f26a4e5 commit 933dd7e
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
2 changes: 1 addition & 1 deletion aarch64/corefreqd.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ static void *Child_Thread(void *arg)

CALL_FUNC CallSliceFunc = (CALL_FUNC[2]){
CallWith_RDTSC_No_RDPMC, CallWith_RDTSC_RDPMC
}[ RO(Shm)->Proc.Features.PerfMon.FixCtrs == 2 ];
}[ RO(Shm)->Proc.Features.PerfMon.CoreCycles > 0 ];

pthread_t tid = pthread_self();
cpu_set_t cpuset;
Expand Down
17 changes: 13 additions & 4 deletions aarch64/corefreqk.c
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,6 @@ static void Query_Features(void *pArg)
iArg->Features->PerfMon.Version = dfr0.PMUVer;
if (iArg->Features->PerfMon.Version > 0) {
iArg->Features->PerfMon.FixCtrs++; /* Fixed Cycle Counter */
iArg->Features->PerfMon.FixCtrs++; /* Instruction Counter */
}
/*TODO(Memory-mapped PMU register at offset 0xe00): pmcfgr */
iArg->Features->PerfMon.MonWidth = \
Expand Down Expand Up @@ -2532,6 +2531,8 @@ static void PerCore_GenericMachine(void *arg)
{
volatile CPUPWRCTLR cpuPwrCtl;
volatile PMUSERENR pmuser;
volatile PMCNTENSET enset;
volatile PMCNTENCLR enclr;
volatile REVIDR revid;
CORE_RO *Core = (CORE_RO *) arg;

Expand All @@ -2548,15 +2549,23 @@ static void PerCore_GenericMachine(void *arg)
}
__asm__ __volatile__(
"mrs %[pmuser], pmuserenr_el0" "\n\t"
"mrs %[enset], pmcntenset_el0" "\n\t"
"mrs %[enclr], pmcntenclr_el0" "\n\t"
"isb"
: [pmuser] "=r" (pmuser)
: [pmuser] "=r" (pmuser),
[enset] "=r" (enset),
[enclr] "=r" (enclr)
:
: "memory"
);

if (Core->Bind == PUBLIC(RO(Proc))->Service.Core) {
PUBLIC(RO(Proc))->Features.PerfMon.CoreCycles = pmuser.CR;
PUBLIC(RO(Proc))->Features.PerfMon.InstrRetired = pmuser.IR;
PUBLIC(RO(Proc))->Features.PerfMon.CoreCycles = pmuser.CR
| enset.C
| enclr.C;
PUBLIC(RO(Proc))->Features.PerfMon.InstrRetired = pmuser.IR
| enset.F0
| enclr.F0;
}
__asm__ __volatile__(
"mrs %[revid], revidr_el1" "\n\t"
Expand Down

0 comments on commit 933dd7e

Please sign in to comment.