PpmIdleCompleteExitLatencyTrace

VOID __stdcall PpmIdleCompleteExitLatencyTrace(
        _KPRCB *Prcb,
        INT64 Status,
        UINT8 NonInterruptibleTransition,
        UINT64 ExitTime,
        UINT64 TraceFlags,
        UINT64 ProcessorState,
        UINT64 PlatformState,
        UINT64 LatencyTraceFlags){
  _KPRCB *v8; 
  volatile unsigned __int64 InitiateWakeStamp; 
  int v10; 
  _PPM_IDLE_STATES *IdleStates; 
  UINT64 *ExitTimea; 
  UINT64 ProcessorStateIndex; 

  ProcessorStateIndex = ExitTime;
  v8 = Prcb;
  if( (int)Status < 0 )
    goto LABEL_8;
  if( NonInterruptibleTransition
    && (InitiateWakeStamp = Prcb->PowerState.IdleStates->InitiateWakeStamp, ProcessorStateIndex > InitiateWakeStamp) )
  {
    v10 = PpmConvertTime(ProcessorStateIndex - InitiateWakeStamp, PopQpcFrequency, 0x989680ui64);
  }
  else
  {
    v10 = TraceFlags;
  }
  LODWORD(ExitTimea) = v10;
  if( !(unsigned __int8)PpmTraceExitLatency(
                           (PPM_IDLE_STATES *)&ProcessorStateIndex,
                           (unsigned int)PlatformState,
                           (unsigned int)LatencyTraceFlags,
                           (unsigned int)ProcessorState,
                           (UINT64)ExitTimea,
                           &ProcessorStateIndex) )
  {
    Prcb = v8;
LABEL_8:
    PpmCancelExitLatencyTrace(Prcb);
    return;
  }
  IdleStates = v8->PowerState.IdleStates;
  IdleStates->ExitLatencyTraceEnabled = 0;
  IdleStates->InitiateWakeStamp = 0i64;
}

Referenced by:

PpmIdleExecuteTransition