HaliAcpiSleep

NTSTATUS __fastcall HaliAcpiSleep(UINT64 Context, INT64 rdx0, INT64 *a2, INT64 r9_0, INT64 a3, INT64 a4, INT32 *a5){
  unsigned int v7; 
  INT64 *v8; 
  SLEEP_STATE_CONTEXT v10; 
  NTSTATUS v11; 
  char v12; 
  _DWORD *v13; 
  unsigned int v14; 
  int v15; 
  __int64 v16; 
  struct _KPRCB *v17; 
  __int64 Number; 
  INT64 v19; 
  INT64 v20; 
  _LARGE_INTEGER v21; 
  unsigned int v22; 
  unsigned int v23; 
  NTSTATUS v24; 
  unsigned int v25; 
  int v26; 
  _FIRMWARE_REENTRY v27; 
  unsigned int v28; 
  int v29; 
  __int64 v30; 
  __int64 v31; 
  char *v33; 
  __int64 v34; 
  __int64 v35; 
  unsigned int v36; 
  unsigned int v37; 
  UINT64 *BytesWritten; 
  __int16 Input[2]; 
  __int16 v40[2]; 
  __int16 Output[2]; 
  _WORD v42[2]; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CurrentIrql; 
  int v45; 
  char Value; 
  unsigned int v47; 

  v47 = r9_0;
  v7 = r9_0;
  v8 = a2;
  Value = 0;
  v10.bits._bf_0 = Context;
  v40[0] = 0;
  Output[0] = 0;
  Input[0] = 0;
  v42[0] = 0;
  CurrentIrql = KeGetCurrentIrql();
  v11 = 0;
  _disable();
  v12 = 0;
  v13 = (_DWORD *)a3;
  v14 = 0;
  v45 &= 0x200u;
  CurrentPrcb = KeGetCurrentPrcb();
  _InterlockedDecrement((volatile signed __int32 *)a3);
  while( *v13 )
  {
    if( (++v14 & dword_140C4A13C) != 0 || !qword_140C4A140 )
      _mm_pause();
    else
      qword_140C4A140(v14, rdx0, a2);
  }
  LODWORD(a2) = KeGetPcr()->Prcb.Number;
  *(_QWORD *)(HalpTimerSavedProcessorCounter + 8i64 * (_QWORD)a2) = __rdtsc();
  if( HalpHvIsReferenceTscConfigured() )
  {
    if( !v15 )
    {
      HalpTimerIsReferenceTimeSaved = 1;
      HalpTimerSavedReferenceTime = qword_140C4A148(&HalpTimerSavedSequenceNumber);
      v16 = 0i64;
    }
  }
  else
  {
    HalpTimerIsReferenceTimeSaved = v16;
    HalpTimerSavedSequenceNumber = v16;
  }
  HalpTscOnWake = v16;
  if( !KeGetPcr()->Prcb.Number )
    HalpTscRestoreValue = *(_QWORD *)HalpTimerSavedProcessorCounter;
  v17 = CurrentPrcb;
  Number = CurrentPrcb->Number;
  if( !(_DWORD)Number )
  {
    byte_140C49D29 = v16;
    *(&CmpDummyThreadEvent + 962) = v16;
    HalpAcpiPreSleep(v10);
    if( *(&CmpDummyThreadEvent + 5040) )
      HalpAcpiPmRegisterRead(PM1A_CTRL_REGISTER, 0i64, Output, 2ui64, 0i64);
    if( *(&CmpDummyThreadEvent + 5184) )
      HalpAcpiPmRegisterRead(PM1B_CTRL_REGISTER, 0i64, v42, 2ui64, 0i64);
    v22 = v10.AsULONG >> 12;
    if( ((v10.AsULONG >> 12) & 2) != 0
      && (unsigned __int8)HalpSetupRealModeResume(qword_140C49E98, (unsigned int)BaseAddress) )
    {
      goto LABEL_71;
    }
    HalpInterruptProcessorRestarting = 1;
    _InterlockedIncrement((_DWORD *)&CmpDummyThreadEvent + 963);
    v23 = 0;
    while( *(&CmpDummyThreadEvent + 963) != v7 )
    {
      if( (++v23 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else((void(__fastcall *)(_QWORD, _QWORD, _QWORD))qword_140C4A140)(v23, v19, (_LARGE_INTEGER)v21.QuadPart);
    }
    if( rdx0 )
    {
      v24 = ((__int64(__fastcall *)(INT64 *))rdx0)(v8);
      v20 = (unsigned int)HalpPlatformFlags;
      v11 = v24;
      if( (HalpPlatformFlags & 1) != 0 || v24 != -1073741632 )
      {
        if( v24 )
        {
          if( v24 == 1073742484 )
            byte_140C49D29 = 1;
          else
            HalpReenableAcpi((unsigned int)HalpPlatformFlags);
          goto LABEL_71;
        }
      }
      else
      {
        v12 = 1;
      }
    }
    _InterlockedAdd((_DWORD *)&CmpDummyThreadEvent + 964, 1u);
    v25 = 0;
    while( *(&CmpDummyThreadEvent + 964) != v7 )
    {
      if( (++v25 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else((void(__fastcall *)(_QWORD, _QWORD, _QWORD))qword_140C4A140)(v25, v19, (_LARGE_INTEGER)v21.QuadPart);
    }
    _InterlockedOr((_DWORD *)&CmpDummyThreadEvent + 964, 0);
    HalpCheckWakeupTimeAndAdjust(v20, v19, v21);
    HalpCheckLowMemoryPreSleep(v10.AsULONG);
    Input[0] = 0x8000;
    if( *(&CmpDummyThreadEvent + 4992) )
      HalpAcpiPmRegisterWrite(PM1A_EVT_REGISTER, 0i64, Input, 2ui64, 0i64);
    if( *(&CmpDummyThreadEvent + 5136) )
      HalpAcpiPmRegisterWrite(PM1B_EVT_REGISTER, 0i64, Input, 2ui64, 0i64);
    Value = -112;
    if( (v22 & 0x40) != 0 )
    {
      LODWORD(BytesWritten) = 1;
      HalSetEnvironmentVariableEx(
        (WCHAR *)L"SystemSleepCheckpoint",
        (_GUID *)&SYSTEM_SLEEP_ETW_CHECKPOINT_GUID,
        &Value,
        1ui64,
        (UINT64)BytesWritten);
    }
    if( (v10.bits._bf_0 & 0x1000) != 0 )
    {
      if( CurrentPrcb->CpuVendor == 1 )
        KeWriteProtectPAT(1u);
      __wbinvd();
    }
    if( byte_140C4A0F9 )
    {
      v26 = (v10.AsULONG >> 8) & 0xF;
      if( (unsigned int)(v26 - 1) <= 2 || v26 == 5 )
      {
        v11 = HalpHvEnterSleepState();
LABEL_75:
        Value = -97;
        if( (v22 & 0x40) != 0 )
        {
          LODWORD(BytesWritten) = 1;
          HalSetEnvironmentVariableEx(
            (WCHAR *)L"SystemSleepCheckpoint",
            (_GUID *)&SYSTEM_SLEEP_ETW_CHECKPOINT_GUID,
            &Value,
            1ui64,
            (UINT64)BytesWritten);
        }
        *(&CmpDummyThreadEvent + 963) = 0;
        *(&CmpDummyThreadEvent + 964) = 0;
        HalpAcpiPostSleep((_CONTEXT *)v10.AsULONG);
        goto LABEL_78;
      }
    }
    if( (HalpPlatformFlags & 1) == 0 )
    {
      v27 = HalRestartRoutine;
      if( !v12 )
        v27 = HalPowerDownRoutine;
      HalReturnToFirmware(v27);
    }
    if( *(&CmpDummyThreadEvent + 5040) )
    {
      HalpAcpiPmRegisterRead(PM1A_CTRL_REGISTER, 0i64, v40, 2ui64, 0i64);
      v40[0] = v40[0] & 0x203 | ((v10.bits._bf_0 & 7 | 8) << 10);
      HalpAcpiPmRegisterWrite(PM1A_CTRL_REGISTER, 0i64, v40, 2ui64, 0i64);
    }
    if( *(&CmpDummyThreadEvent + 5184) )
    {
      HalpAcpiPmRegisterRead(PM1B_CTRL_REGISTER, 0i64, v40, 2ui64, 0i64);
      v40[0] = v40[0] & 0x203 | (((v10.AsULONG >> 4) & 7 | 8) << 10);
      HalpAcpiPmRegisterWrite(PM1B_CTRL_REGISTER, 0i64, v40, 2ui64, 0i64);
    }
    v28 = 0;
    if( *(&CmpDummyThreadEvent + 4992) )
    {
      v29 = *(&CmpDummyThreadEvent + 5136) != 0 ? 3 : 0;
      HalpAcpiPmRegisterRead(PM1A_EVT_REGISTER, 0i64, Input, 2ui64, 0i64);
      if( Input[0] >= 0 )
      {
        do
        {
          HalpAcpiPmRegisterRead((_ACPI_PM_REGISTER)v29, 0i64, Input, 2ui64, 0i64);
          if( (Input[0] & 0x8000) != 0 )
            break;
          if( (++v28 & dword_140C4A13C) != 0 || !qword_140C4A140 )
            _mm_pause();
          else
            qword_140C4A140(v28, v30, v31);
          HalpAcpiPmRegisterRead(PM1A_EVT_REGISTER, 0i64, Input, 2ui64, 0i64);
        }
        while( (Input[0] & 0x8000) == 0 );
        v7 = v47;
      }
    }
LABEL_71:
    if( *(&CmpDummyThreadEvent + 5040) )
      HalpAcpiPmRegisterWrite(PM1A_CTRL_REGISTER, 0i64, Output, 2ui64, 0i64);
    if( *(&CmpDummyThreadEvent + 5184) )
      HalpAcpiPmRegisterWrite(PM1B_CTRL_REGISTER, 0i64, v42, 2ui64, 0i64);
    goto LABEL_75;
  }
  v22 = v10.AsULONG >> 12;
  if( ((v10.AsULONG >> 12) & 8) != 0 )
    v33 = (char *)v16;
  else
    v33 = (char *)Memory + 1472 * Number;
  if( (unsigned __int8)HalpSaveProcessorState((INT64)v33) )
    goto LABEL_102;
  _InterlockedIncrement((_DWORD *)&CmpDummyThreadEvent + 963);
  if( rdx0 )
  {
    v36 = 0;
    while( *(&CmpDummyThreadEvent + 963) != v7 )
    {
      if( (++v36 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v36, v34, v35);
    }
    v11 = ((__int64(__fastcall *)(INT64 *))rdx0)(v8);
    if( v11 != 1073742484 )
    {
      v17 = CurrentPrcb;
      goto LABEL_99;
    }
LABEL_102:
    v37 = 0;
    while( *(&CmpDummyThreadEvent + 964) )
    {
      if( (++v37 & dword_140C4A13C) != 0 || !qword_140C4A140 )
        _mm_pause();
      else
        qword_140C4A140(v37, v34, v35);
    }
LABEL_78:
    v17 = CurrentPrcb;
    goto LABEL_79;
  }
LABEL_99:
  if( v17->CpuVendor == 1 )
    KeWriteProtectPAT(1u);
  HalpFlushAndWait((INT32 *)&CmpDummyThreadEvent + 964);
LABEL_79:
  if( (v22 & 1) != 0 && (v22 & 0x10) == 0 && v17->CpuVendor == 1 )
  {
    KeWriteProtectPAT(0);
    __wbinvd();
  }
  HalpPostSleepMP(v7);
  __writecr8((unsigned __int8)CurrentIrql);
  if( v45 )
    _enable();
  return v11;
}

Referenced by:

No references.