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.