PpmUpdateTimeAccumulation
VOID __stdcall PpmUpdateTimeAccumulation(_KPRCB *Prcb, UINT64 CurrentTime, UINT8 Active){
unsigned __int64 v6;
unsigned __int64 v7;
UINT64 v8;
unsigned __int64 CyclesLast;
v6 = __rdtsc();
if( (Prcb->FeatureBits & 0x8000000000i64) != 0 )
v7 = __readmsr(0xDB2u);
else
v7 = 0i64;
if( Active )
{
v8 = CurrentTime - Prcb->PowerState.PerfFeedback.LastUpdateTime;
_InterlockedExchangeAdd64(
&Prcb->PowerState.PerfFeedback.UnaccountedTime,
CurrentTime - Prcb->PowerState.PerfFeedback.LastUpdateTime);
if( (Prcb->FeatureBits & 0x8000000000i64) != 0 )
Prcb->PowerState.PerfFeedback.StallTime += PpmConvertTime(
v8,
v6 - Prcb->PowerState.PerfFeedback.CyclesLast,
v7 - Prcb->PowerState.PerfFeedback.StallCyclesLast);
}
Prcb->PowerState.PerfFeedback.LastUpdateTime = CurrentTime;
if( Active )
{
CyclesLast = Prcb->PowerState.PerfFeedback.CyclesLast;
if( v6 > CyclesLast )
Prcb->PowerState.PerfFeedback.CyclesActive += v6 - CyclesLast;
}
Prcb->PowerState.PerfFeedback.CyclesLast = v6;
if( (Prcb->FeatureBits & 0x8000000000i64) != 0 )
Prcb->PowerState.PerfFeedback.StallCyclesLast = v7;
}Referenced by:
PpmContinueActiveTimeAccumulation