HaliAcpiSleep

__int64 __fastcall HaliAcpiSleep(
        unsigned int a1,
        __int64 (__fastcall *a2)(__int64),
        __int64 a3,
        int a4,
        volatile signed __int32 *a5){
  DOUBLE v5; 
  unsigned int v6; 
  __int64 v7; 
  unsigned int v10; 
  char v11; 
  volatile signed __int32 *v12; 
  unsigned int v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  UINT64 *v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  int v26; 
  unsigned int v27; 
  int v28; 
  __int64 v29; 
  __int64 v30; 
  _QWORD *v32; 
  void *v33; 
  void *v34; 
  UINT64 v35; 
  unsigned int v36; 
  unsigned int v37; 
  INT64 v38; 
  OBJECT_TYPE_LIST *v39; 
  INT64 v40; 
  UINT64 v41; 
  GENERIC_MAPPING *v42; 
  PRIVILEGE_SET *v43; 
  UINT64 *CurrentPrcb; 
  UINT64 *CurrentIrql; 
  INT64 *v46; 
  int v47; 
  char Value; 
  int v49; 
  v49 = a4;
  v6 = a4;
  v7 = a3;
  Value = 0;
  WORD2(v42) = 0;
  LOWORD(v43) = 0;
  LOWORD(v42) = 0;
  WORD2(v43) = 0;
  CurrentIrql = (UINT64 *)KeGetCurrentIrql();
  v10 = 0;
  _disable();
  v11 = 0;
  v12 = a5;
  v13 = 0;
  v47 &= 0x200u;
  CurrentPrcb = (UINT64 *)KeGetCurrentPrcb();
  _InterlockedDecrement(a5);
  while( *v12 )
  {
    if( (++v13 & dword_140C4A13C) != 0 || !qword_140C4A140 )
      _mm_pause();
    else
      qword_140C4A140(v13, a2, a3);
  }
  LODWORD(a3) = *((_DWORD *)KeGetPcr() + 105);
  *(_QWORD *)(HalpTimerSavedProcessorCounter + 8 * a3) = __rdtsc();
  if( HalpHvIsReferenceTscConfigured() )
  {
    if( !(_DWORD)v15 )
    {
      HalpTimerIsReferenceTimeSaved = 1;
      HalpTimerSavedReferenceTime = qword_140C4A148(&HalpTimerSavedSequenceNumber);
      v16 = 0i64;
    }
  }
  else
  {
    HalpTimerIsReferenceTimeSaved = v16;
    HalpTimerSavedSequenceNumber = v16;
  }
  HalpTscOnWake = v16;
  if( !*((_DWORD *)KeGetPcr() + 105) )
    HalpTscRestoreValue = *(_QWORD *)HalpTimerSavedProcessorCounter;
  v17 = CurrentPrcb;
  v18 = *((unsigned int *)CurrentPrcb + 9);
  if( !(_DWORD)v18 )
  {
    HalpResumeFromHibernate = v16;
    HalpBarrier = v16;
    HalpAcpiPreSleep(a1);
    if( byte_140C48DF0 )
      HalpAcpiPmRegisterRead(1, 0, (__int64)&v43, 2u, 0i64);
    if( byte_140C48E80 )
      HalpAcpiPmRegisterRead(4, 0, (__int64)&v43 + 4, 2u, 0i64);
    v21 = a1 >> 12;
    if( ((a1 >> 12) & 2) != 0
      && (unsigned __int8)HalpSetupRealModeResume(HalpLowStub, (unsigned int)HalpLowStubPhysicalAddress) )
    {
      goto LABEL_71;
    }
    HalpInterruptProcessorRestarting = 1;
    _InterlockedIncrement(&HalpSaveStateSync);
    v22 = 0;
    while( HalpSaveStateSync != v6 )
    {
      if( (++v22 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v22, v19, v20);
    }
    if( a2 )
    {
      v23 = a2(v7);
      v10 = v23;
      if( (HalpPlatformFlags & 1) != 0 || v23 != -1073741632 )
      {
        if( v23 )
        {
          if( v23 == 1073742484 )
            HalpResumeFromHibernate = 1;
          else
            HalpReenableAcpi();
          goto LABEL_71;
        }
      }
      else
      {
        v11 = 1;
      }
    }
    _InterlockedAdd(&HalpFlushBarrier, 1u);
    v24 = 0;
    while( HalpFlushBarrier != v6 )
    {
      if( (++v24 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v24, v19, v20);
    }
    _InterlockedOr(&HalpFlushBarrier, 0);
    HalpCheckWakeupTimeAndAdjust();
    HalpCheckLowMemoryPreSleep(a1, v5);
    LOWORD(v42) = 0x8000;
    if( PmRegisters[0] )
      HalpAcpiPmRegisterWrite(0, 0, (__int64)&v42, 2u, 0i64);
    if( byte_140C48E50 )
      HalpAcpiPmRegisterWrite(3, 0, (__int64)&v42, 2u, 0i64);
    Value = -112;
    if( (v21 & 0x40) != 0 )
      HalSetEnvironmentVariableEx((PWCHAR)L"SystemSleepCheckpoint", (GUID *)&SYSTEM_SLEEP_ETW_CHECKPOINT_GUID, &Value);
    if( (a1 & 0x1000) != 0 )
    {
      if( *((_BYTE *)CurrentPrcb + 141) == 1 )
        KeWriteProtectPAT(1u);
      __wbinvd();
    }
    if( HalpHvSleepEnlightenedCpuManager )
    {
      v25 = (a1 >> 8) & 0xF;
      if( v25 - 1 <= 2 || v25 == 5 )
      {
        v10 = HalpHvEnterSleepState();
LABEL_75:
        Value = -97;
        if( (v21 & 0x40) != 0 )
          HalSetEnvironmentVariableEx(
            (PWCHAR)L"SystemSleepCheckpoint",
            (GUID *)&SYSTEM_SLEEP_ETW_CHECKPOINT_GUID,
            &Value);
        HalpSaveStateSync = 0;
        HalpFlushBarrier = 0;
        HalpAcpiPostSleep((CONTEXT *)a1);
        goto LABEL_78;
      }
    }
    if( (HalpPlatformFlags & 1) == 0 )
    {
      v26 = 2;
      if( !v11 )
        v26 = 1;
      HalReturnToFirmware(v26);
    }
    if( byte_140C48DF0 )
    {
      HalpAcpiPmRegisterRead(1, 0, (__int64)&v42 + 4, 2u, 0i64);
      WORD2(v42) = WORD2(v42) & 0x203 | ((a1 & 7 | 8) << 10);
      HalpAcpiPmRegisterWrite(1, 0, (__int64)&v42 + 4, 2u, 0i64);
    }
    if( byte_140C48E80 )
    {
      HalpAcpiPmRegisterRead(4, 0, (__int64)&v42 + 4, 2u, 0i64);
      WORD2(v42) = WORD2(v42) & 0x203 | (((a1 >> 4) & 7 | 8) << 10);
      HalpAcpiPmRegisterWrite(4, 0, (__int64)&v42 + 4, 2u, 0i64);
    }
    v27 = 0;
    if( PmRegisters[0] )
    {
      v28 = byte_140C48E50 != 0 ? 3 : 0;
      HalpAcpiPmRegisterRead(0, 0, (__int64)&v42, 2u, 0i64);
      if( (__int16)v42 >= 0 )
      {
        do
        {
          HalpAcpiPmRegisterRead(v28, 0, (__int64)&v42, 2u, 0i64);
          if( ((unsigned __int16)v42 & 0x8000) != 0 )
            break;
          if( (++v27 & dword_140C4A13C) != 0 || !qword_140C4A140 )
            _mm_pause();
          else
            qword_140C4A140(v27, v29, v30);
          HalpAcpiPmRegisterRead(0, 0, (__int64)&v42, 2u, 0i64);
        }
        while( ((unsigned __int16)v42 & 0x8000) == 0 );
        v6 = v49;
      }
    }
LABEL_71:
    if( byte_140C48DF0 )
      HalpAcpiPmRegisterWrite(1, 0, (__int64)&v43, 2u, 0i64);
    if( byte_140C48E80 )
      HalpAcpiPmRegisterWrite(4, 0, (__int64)&v43 + 4, 2u, 0i64);
    goto LABEL_75;
  }
  v21 = a1 >> 12;
  if( ((a1 >> 12) & 8) != 0 )
    v32 = (_QWORD *)v16;
  else
    v32 = (_QWORD *)(HalpHiberProcState + 1472 * v18);
  if( (unsigned __int8)HalpSaveProcessorState(v32, v14, v15, v16, v38, v40, (INT64)v42, (INT64)v43, (CHAR)CurrentPrcb) )
    goto LABEL_102;
  _InterlockedIncrement(&HalpSaveStateSync);
  if( a2 )
  {
    v36 = 0;
    while( HalpSaveStateSync != v6 )
    {
      if( (++v36 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v36, v33, v34);
    }
    v10 = a2(v7);
    if( v10 != 1073742484 )
    {
      v17 = CurrentPrcb;
      goto LABEL_99;
    }
LABEL_102:
    v37 = 0;
    while( HalpFlushBarrier )
    {
      if( (++v37 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v37, v33, v34);
    }
LABEL_78:
    v17 = CurrentPrcb;
    goto LABEL_79;
  }
LABEL_99:
  if( *((_BYTE *)v17 + 141) == 1 )
    KeWriteProtectPAT(1u);
  HalpFlushAndWait(&HalpFlushBarrier, v33, v34, v35, v39, v41, v42, v43, CurrentPrcb, CurrentIrql, v46);
LABEL_79:
  if( (v21 & 1) != 0 && (v21 & 0x10) == 0 && *((_BYTE *)v17 + 141) == 1 )
  {
    KeWriteProtectPAT(0);
    __wbinvd();
  }
  HalpPostSleepMP(v6);
  __writecr8((unsigned __int8)CurrentIrql);
  if( v47 )
    _enable();
  return v10;
}

Referenced by:

No references.