summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyrIng <labs@cyring.fr>2024-05-12 14:50:36 +0200
committerCyrIng <labs@cyring.fr>2024-05-12 14:50:36 +0200
commitf26a4e5a9024a2621036020ad7269a6add034a5c (patch)
treef9588a78279c6e88d47ccc86ddd2caff6770761a
parent1549ff7b9e5389eef297105609af854d9146d252 (diff)
[AArch64] Verifying formulas against counter overflows
-rw-r--r--aarch64/corefreqk.c48
-rw-r--r--aarch64/corefreqm.c8
-rw-r--r--aarch64/coretypes.h2
3 files changed, 27 insertions, 31 deletions
diff --git a/aarch64/corefreqk.c b/aarch64/corefreqk.c
index 37ae4ed..536b982 100644
--- a/aarch64/corefreqk.c
+++ b/aarch64/corefreqk.c
@@ -2947,8 +2947,7 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#define Delta_TSC(Core) \
({ \
- Core->Delta.TSC = Core->Counter[1].TSC \
- - Core->Counter[0].TSC; \
+ Core->Delta.TSC = Core->Counter[1].TSC - Core->Counter[0].TSC; \
})
#define Delta_TSC_OVH(Core) \
@@ -2969,22 +2968,22 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#define Delta_C0(Core) \
({ /* Absolute Delta of Unhalted (Core & Ref) C0 Counter. */ \
- Core->Delta.C0.UCC = ( \
- Core->Counter[0].C0.UCC > Core->Counter[1].C0.UCC \
- ) ? Core->Counter[0].C0.UCC - Core->Counter[1].C0.UCC \
- : Core->Counter[1].C0.UCC - Core->Counter[0].C0.UCC; \
- \
- Core->Delta.C0.URC = ( \
- Core->Counter[0].C0.URC > Core->Counter[1].C0.URC \
- ) ? Core->Counter[0].C0.URC - Core->Counter[1].C0.URC \
- : Core->Counter[1].C0.URC - Core->Counter[0].C0.URC; \
+ if (Core->Counter[1].C0.UCC >= Core->Counter[0].C0.UCC) { \
+ Core->Delta.C0.UCC = Core->Counter[1].C0.UCC \
+ - Core->Counter[0].C0.UCC; \
+ } \
+ if (Core->Counter[1].C0.URC >= Core->Counter[0].C0.URC) { \
+ Core->Delta.C0.URC = Core->Counter[1].C0.URC \
+ - Core->Counter[0].C0.URC; \
+ } \
})
#define Delta_C1(Core) \
({ \
- Core->Delta.C1 = (Core->Counter[0].C1 > Core->Counter[1].C1) ? \
- Core->Counter[0].C1 - Core->Counter[1].C1 \
- : Core->Counter[1].C1 - Core->Counter[0].C1; \
+ if (Core->Counter[1].C1 >= Core->Counter[0].C1) { \
+ Core->Delta.C1 = Core->Counter[1].C1 \
+ - Core->Counter[0].C1; \
+ } \
})
#define Delta_C3(Core) \
@@ -3007,11 +3006,11 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#define Delta_INST(Core) \
({ /* Delta of Retired Instructions */ \
- if (Core->Counter[1].INST > Core->Counter[0].INST) \
- Core->Delta.INST = Core->Counter[1].INST \
- - Core->Counter[0].INST; \
- else { \
- Core->Delta.INST = INST_COUNTER_OVERFLOW \
+ if (Core->Counter[1].INST >= Core->Counter[0].INST) { \
+ Core->Delta.INST = Core->Counter[1].INST \
+ - Core->Counter[0].INST; \
+ } else { \
+ Core->Delta.INST = (INST_COUNTER_OVERFLOW + 0x1) \
- Core->Counter[0].INST; \
Core->Delta.INST += Core->Counter[1].INST; \
} \
@@ -3105,13 +3104,10 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#define Delta_UNCORE_FC0(Pkg) \
({ \
- Pkg->Delta.Uncore.FC0 = \
- (Pkg->Counter[0].Uncore.FC0 > \
- Pkg->Counter[1].Uncore.FC0) ? \
- Pkg->Counter[0].Uncore.FC0 \
- - Pkg->Counter[1].Uncore.FC0 \
- : Pkg->Counter[1].Uncore.FC0 \
- - Pkg->Counter[0].Uncore.FC0; \
+ if (Pkg->Counter[1].Uncore.FC0 >= Pkg->Counter[0].Uncore.FC0) { \
+ Pkg->Delta.Uncore.FC0 = Pkg->Counter[1].Uncore.FC0 \
+ - Pkg->Counter[0].Uncore.FC0; \
+ } \
})
#define Save_TSC(Core) \
diff --git a/aarch64/corefreqm.c b/aarch64/corefreqm.c
index f39a790..dd4b603 100644
--- a/aarch64/corefreqm.c
+++ b/aarch64/corefreqm.c
@@ -30,11 +30,11 @@
unsigned long long overhead = pSlice->Counter[1].INST \
- pSlice->Counter[0].INST; \
/* Test and compute if counter has overflowed */ \
- if (pSlice->Counter[2].INST > pSlice->Counter[1].INST) \
- pSlice->Delta.INST = pSlice->Counter[2].INST \
- - pSlice->Counter[1].INST; \
+ if (pSlice->Counter[2].INST >= pSlice->Counter[1].INST) \
+ pSlice->Delta.INST = pSlice->Counter[2].INST \
+ - pSlice->Counter[1].INST; \
else { \
- pSlice->Delta.INST = INST_COUNTER_OVERFLOW \
+ pSlice->Delta.INST = (INST_COUNTER_OVERFLOW + 0x1) \
- pSlice->Counter[1].INST; \
pSlice->Delta.INST += pSlice->Counter[2].INST; \
} \
diff --git a/aarch64/coretypes.h b/aarch64/coretypes.h
index 673a7c2..3fcf0de 100644
--- a/aarch64/coretypes.h
+++ b/aarch64/coretypes.h
@@ -253,7 +253,7 @@ enum CSTATES_ENCODING {
#define CSTATES_ENCODING_COUNT 12
-#define INST_COUNTER_OVERFLOW 0x7fffffff
+#define INST_COUNTER_OVERFLOW 0x7fffffffLLU
enum THM_POINTS {
THM_THRESHOLD_1,