HalpTimerInitializeHypervisorTimer
VOID __stdcall HalpTimerInitializeHypervisorTimer(){
INT64 *Timer;
void *v1;
void *v2;
void *v3;
INT64 v4;
INT64 v5;
INT64 v6;
NTSTATUS v7;
INT64 v8;
char v9;
unsigned int *v10;
_KINTERRUPT_MODE v11;
_KINTERRUPT_POLARITY v12;
__int64 v13;
int v14;
unsigned int v15;
unsigned int v16;
_REGISTERED_INTERRUPT_CONTROLLER *v17;
BOOL v18;
_INTERRUPT_LINE Line;
_KINTERRUPT_MODE TriggerMode;
_KINTERRUPT_POLARITY Polarity;
INT64 v22;
_INTERRUPT_LINE_STATE LineState;
__int128 v24;
v22 = 0i64;
v24 = 0i64;
Line = 0i64;
v18 = 0;
if( (unsigned __int8)HalpIsPartitionCpuManager() )
{
if( qword_140C4A180 )
{
if( (EAX(__cpuid(1073741830, 0)) & 0x100) != 0 )
{
Timer = HalpFindTimer(3, 32, 24576, 3840, 0);
v4 = (INT64)Timer;
if( Timer )
{
if( (int)HalpTimerInitialize((INT64)Timer, v1, v2, v3) >= 0 )
{
*(_DWORD *)(v4 + 184) |= 4u;
HalpHypervisorHpet = (PVOID)v4;
v7 = HalpTimerTestHypervisorTimer(v4, &v18, v5, v6);
HalpHypervisorHpet = 0i64;
if( v7 >= 0 )
{
v9 = 0;
v10 = *(unsigned int **)(v4 + 72);
v11 = Latched;
v12 = InterruptPolarityUnknown;
if( v18 )
{
HalpHvBuildDeviceId(v8, (INT64 *)(*(_QWORD *)(v4 + 288) + 8i64), 0, (INT64)&v22);
}
else
{
v14 = *(_DWORD *)(v4 + 224);
if( (v14 & 0x200) != 0 )
{
if( HalpInterruptGsiToLine(*(unsigned int *)(v4 + 88), &Line) < 0 )
return;
v9 = *((_BYTE *)v10 + 4);
}
else if( (v14 & 0x100) != 0 )
{
v15 = *(_DWORD *)(v4 + 84);
if( v15 >= 8 )
{
Line.UnitId = 45057;
v15 -= 8;
}
else
{
Line.UnitId = 45056;
}
Line.Line = v15;
}
TriggerMode = *(_DWORD *)(v4 + 96);
Polarity = *(_DWORD *)(v4 + 92);
HalpInterruptApplyOverrides(&Line, &Polarity, &TriggerMode);
v11 = TriggerMode;
v12 = Polarity;
v22 = 0x8000000000000000ui64;
LOBYTE(v22) = Line.UnitId;
}
LOBYTE(v13) = v9;
if( (int)((__int64(__fastcall *)(_QWORD, _QWORD, INT64, __int64, __int128 *))qword_140C4A180)(
*((_QWORD *)v10 + 3),
*v10,
v22,
v13,
&v24) >= 0 )
{
if( v18 )
{
*(_DWORD *)(v4 + 236) = 0;
*(_DWORD *)(v4 + 232) = DWORD2(v24);
*(_QWORD *)(v4 + 240) = HIDWORD(v24);
v16 = *(_DWORD *)(v4 + 184) | 0x10;
LABEL_26:
HalpHypervisorHpet = (PVOID)v4;
*(_DWORD *)(v4 + 184) = v16 | 0x40;
HalpTimerEnableHypervisorTimer();
return;
}
LineState.Routing.UnitId = -1;
LineState.ProcessorTarget.8 = ($B39C36E67A513536CAB27D38BFD6BBE3)*((unsigned __int64 *)&v24 + 1);
*(_DWORD *)&LineState.EmulateActiveBoth = 0;
*(_QWORD *)&LineState.ProcessorTarget.Target = 8i64;
*(_QWORD *)&LineState.Vector = 251i64;
LineState.Polarity = v12;
LineState.TriggerMode = v11;
LineState.Flags = 0;
LineState.Routing.Line = 1;
v17 = HalpInterruptLookupController(Line.UnitId);
if( !v17 )
{
*(&CmpDummyThreadEvent + 1789) = 17;
return;
}
if( HalpInterruptSetRemappedLineStateInternal(v17, &Line, &LineState) >= 0 )
{
v16 = *(_DWORD *)(v4 + 184) & 0xFFFFFFEF;
goto LABEL_26;
}
}
}
}
}
}
}
}
}Referenced by:
No references.