HalpInterruptApplyOverrides
VOID __stdcall HalpInterruptApplyOverrides(
_INTERRUPT_LINE *Line,
_KINTERRUPT_POLARITY *Polarity,
_KINTERRUPT_MODE *TriggerMode){
char v6;
char v7;
UINT64 UnitId;
void **v9;
void **v10;
int v11;
unsigned int *LinesForGsiRange;
v6 = 0;
v7 = HalpAcquireHighLevelLock((UINT64 *)&CmpDummyThreadEvent + 891);
v9 = (void **)*(&CmpDummyThreadEvent + 888);
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 888) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 7104) )
{
UnitId = Line->UnitId;
while( 1 )
{
v10 = v9;
v9 = (void **)*v9;
if( v10[2] == (void *)*Line )
break;
if( v9 == (void **)((char *)&CmpDummyThreadEvent + 7104) )
goto LABEL_11;
}
*Line = (_INTERRUPT_LINE)v10[3];
if( Polarity )
*Polarity = *((_KINTERRUPT_POLARITY *)v10 + 9);
if( TriggerMode )
*TriggerMode = *((_KINTERRUPT_MODE *)v10 + 8);
v6 = 1;
}
LABEL_11:
LOBYTE(UnitId) = v7;
HalpReleaseHighLevelLock((UINT64 *)&CmpDummyThreadEvent + 891, UnitId);
if( !v6 && *(_DWORD *)(Controller + 216) == 2 && Line->UnitId - 45056 <= 1 )
{
v11 = Line->Line + 8;
if( Line->UnitId != 45057 )
v11 = Line->Line;
LinesForGsiRange = HalpInterruptFindLinesForGsiRange(v11, v11 + 1);
if( LinesForGsiRange )
{
Line->Line = v11 + LinesForGsiRange[5] - LinesForGsiRange[7];
Line->UnitId = LinesForGsiRange[4];
}
}
}Referenced by:
ExtEnvSetVpptTarget
HalDisableInterrupt
HalpInterruptConnect
HalpInterruptMaskAcpi
HalpInterruptRemap
HalpInterruptRestoreClock
HalpInterruptSetDestinationInternal
HalpInterruptSetLineState
HalpTimerConfigureInterrupt
HalpTimerInitializeHypervisorTimer
HalpTimerUnmapInterrupt