diff options
author | CyrIng <labs@cyring.fr> | 2024-05-12 14:50:36 +0200 |
---|---|---|
committer | CyrIng <labs@cyring.fr> | 2024-05-12 14:50:36 +0200 |
commit | f26a4e5a9024a2621036020ad7269a6add034a5c (patch) | |
tree | f9588a78279c6e88d47ccc86ddd2caff6770761a | |
parent | 1549ff7b9e5389eef297105609af854d9146d252 (diff) |
[AArch64] Verifying formulas against counter overflows
-rw-r--r-- | aarch64/corefreqk.c | 48 | ||||
-rw-r--r-- | aarch64/corefreqm.c | 8 | ||||
-rw-r--r-- | aarch64/coretypes.h | 2 |
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, |