HalpApicTimerDiscover
INT64 __stdcall HalpApicTimerDiscover(){
INT64 v0;
unsigned __int64 v1;
unsigned __int64 v2;
INT64 v3;
int v4;
int v5;
int v6;
int v7;
int v8;
int v9;
__int128 v11;
TIMER_INITIALIZATION_BLOCK result;
__int64 v13;
v11 = 0i64;
if( HalSocGetAcpiTable(0x43495041ui64) )
{
v1 = 0i64;
if( (int)HalSocRequestApi(v0, 0i64, 6i64, 0x10ui64, &v11) >= 0 )
v1 = (*((__int64(**)(void))&v11 + 1))();
memset((INT64)&result, 0i64);
v13 = 0i64;
v2 = 32i64;
result.CounterBitWidth = 32;
result.InternalData = &v13;
result.Header = (SOC_INITIALIZATION_HEADER)0x9000000001i64;
result.KnownType = TimerApic;
result.InternalDataSize = 8;
result.Capabilities = 2147;
if( HalpApicTimerIsInvariant(v3) )
{
v4 = 10;
}
else
{
result.Capabilities = 26723;
v4 = 11;
}
HIDWORD(v13) = v4;
v5 = v4 - 1;
if( v5 )
{
v6 = v5 - 1;
if( v6 )
{
v7 = v6 - 1;
if( v7 )
{
v8 = v7 - 5;
if( v8 )
{
v9 = v8 - 1;
if( v9 )
{
if( v9 == 1 )
v2 = 128i64;
else
v2 = 1i64;
}
else
{
v2 = 64i64;
}
}
}
else
{
v2 = 16i64;
}
}
else
{
v2 = 8i64;
}
}
else
{
v2 = 4i64;
}
result.Interrupt.Mode = Latched;
result.Interrupt.Polarity = InterruptActiveHigh;
LOBYTE(v13) = -1;
result.CounterFrequency = v1 / v2;
result.FunctionTable.Initialize = (PTIMER_INITIALIZE)HalpApicTimerInitialize;
result.FunctionTable.QueryCounter = (PTIMER_QUERY_COUNTER)HalpApicTimerQueryCounter;
result.FunctionTable.AcknowledgeInterrupt = (PTIMER_ACKNOWLEDGE_INTERRUPT)xHalTimerWatchdogStop;
result.FunctionTable.ArmTimer = (PTIMER_ARM_TIMER)HalpApicTimerArm;
result.FunctionTable.SetInterruptVector = (PTIMER_SET_INTERRUPT_VECTOR)HalpApicTimerSetInterruptVector;
result.FunctionTable.Stop = (PTIMER_STOP)HalpApicTimerStop;
HalpTimerRegister(&result, 0i64);
}
return 0i64;
}Referenced by:
HalpTimerRegisterBuiltinPlugins