summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--aarch64/corefreqd.c2
-rw-r--r--aarch64/corefreqk.c17
2 files changed, 14 insertions, 5 deletions
diff --git a/aarch64/corefreqd.c b/aarch64/corefreqd.c
index 3c739e6..95ab2fe 100644
--- a/aarch64/corefreqd.c
+++ b/aarch64/corefreqd.c
@@ -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;
diff --git a/aarch64/corefreqk.c b/aarch64/corefreqk.c
index 536b982..ff3b6fe 100644
--- a/aarch64/corefreqk.c
+++ b/aarch64/corefreqk.c
@@ -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 = \
@@ -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;
@@ -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"