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.