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