HalpInterruptEnablePerformanceEvents
VOID __stdcall HalpInterruptEnablePerformanceEvents(UINT64 Context){
INT64 v1;
unsigned __int8 v2;
bool v4;
int v5;
unsigned int Number;
char *v7;
UINT64 v8;
char v9;
unsigned __int64 v10;
_KINTERRUPT_MODE v11;
_INTERRUPT_LINE Destination[2];
__int64 v13;
_INTERRUPT_LINE_STATE LineState;
_INTERRUPT_LINE Line;
UINT64 Flags;
v1 = Controller;
Line = 0i64;
v2 = 0;
v4 = *(_DWORD *)(Controller + 216) == 2;
memset(&LineState, 0, sizeof(LineState));
if( v4 )
{
Line.UnitId = *(_DWORD *)(Controller + 232);
Line.Line = -3;
if( !byte_140C5064A )
{
if( !HalpInterruptFindLines((unsigned int *)&Line) )
return;
byte_140C5064A = 1;
}
*(_DWORD *)&LineState.EmulateActiveBoth = 0;
LineState.Routing.UnitId = -1;
memset(&LineState.ProcessorTarget.Target + 1, 0, 20);
LineState.Polarity = InterruptActiveHigh;
LineState.TriggerMode = Latched;
LineState.Flags = 16;
LineState.Routing.Line = 1;
LineState.ProcessorTarget.Target = InterruptTargetSelfOnly;
LineState.Vector = 254;
LineState.Priority = HalpInterruptGetPriority(v1, 0xFEu);
if( !Context )
v2 = HalpAcquireHighLevelLock(&qword_140C49C40);
HalpInterruptSetLineStateInternal((_REGISTERED_INTERRUPT_CONTROLLER *)v1, &Line, &LineState);
if( !Context )
{
KxReleaseSpinLock(&qword_140C49C40);
__writecr8(v2);
}
}
v5 = *(_DWORD *)(v1 + 216);
if( ((v5 - 3) & 0xFFFFFFFC) == 0 && v5 != 5 )
{
Number = KeGetPcr()->Prcb.Number;
v7 = (char *)HalpInterruptProcessorState + 64 * (unsigned __int64)Number;
v8 = *((unsigned int *)v7 + 10);
if( (_DWORD)v8 )
{
if( HalpInterruptGsiToLine(v8, &Line) >= 0 )
{
Flags = 0x1FFFFFFFFi64;
v9 = v7[14];
*(_OWORD *)&Destination[0].UnitId = 0i64;
Destination[0].UnitId = 6;
Destination[1].UnitId = Number;
v13 = 0i64;
v10 = (unsigned __int8)HalpAcquireHighLevelLock(&qword_140C49C40);
LOBYTE(v11) = 15;
HalpInterruptSetLineState(
&Line,
(PVOID)0xFE,
v11,
(_KINTERRUPT_POLARITY)(v9 != 0),
InterruptActiveHigh,
Destination,
(UINT64)&Flags);
KxReleaseSpinLock(&qword_140C49C40);
__writecr8(v10);
}
}
}
}Referenced by:
EmonPreOverflowHandler
HalpDpPostReplaceInitialization
HalpInterruptInitSystem
HalpPostSleepMP