HalpSfiTimerDiscover
INT64 __stdcall HalpSfiTimerDiscover(){
LARGE_INTEGER *AcpiTable;
LARGE_INTEGER *v1;
__int64 HighPart;
unsigned int v4;
unsigned __int64 v5;
LARGE_INTEGER *v6;
unsigned __int64 LowPart;
unsigned __int64 v8;
LARGE_INTEGER v9;
__int128 v10;
__int64 v11;
TIMER_INITIALIZATION_BLOCK result;
memset((INT64)&result, 0i64);
v11 = 0i64;
v10 = 0i64;
AcpiTable = HalSocGetAcpiTable(0x524D544Dui64);
v1 = AcpiTable;
if( AcpiTable )
{
HighPart = (unsigned int)AcpiTable->HighPart;
if( (unsigned int)HighPart >= 0x38 )
{
v4 = 0;
v5 = (HighPart - 36) / 0x14ui64;
if( (_DWORD)v5 )
{
v6 = v1 + 6;
do
{
if( !BYTE4(v6[-2].QuadPart)
&& BYTE5(v6[-2].QuadPart) == 32
&& !BYTE6(v6[-2].QuadPart)
&& v6->LowPart
&& v6[-1].QuadPart )
{
memset((INT64)&result, 0i64);
result.Header = (SOC_INITIALIZATION_HEADER)0x9000000001i64;
v11 = 0i64;
v10 = 0i64;
LowPart = v6->LowPart;
result.CounterBitWidth = 32;
result.InternalDataSize = 24;
v8 = ((LowPart >> 1) + 1000000000000000i64) / LowPart;
v9 = v6[-1];
result.CounterFrequency = v8;
result.InternalData = &v10;
result.Interrupt.Gsi = v6->HighPart;
result.FunctionTable.Initialize = (PTIMER_INITIALIZE)HalpSfiTimerInitialize;
result.FunctionTable.QueryCounter = (PTIMER_QUERY_COUNTER)HalpSfiTimerQueryCounter;
result.FunctionTable.AcknowledgeInterrupt = (PTIMER_ACKNOWLEDGE_INTERRUPT)HalpSfiTimerAcknowledgeInterrupt;
result.FunctionTable.ArmTimer = (PTIMER_ARM_TIMER)HalpSfiTimerArm;
result.FunctionTable.Stop = (PTIMER_STOP)HalpSfiTimerStop;
result.Interrupt.Mode = Latched;
result.Interrupt.Polarity = InterruptActiveHigh;
result.KnownType = TimerSfi;
result.MaxDivisor = 1;
result.Capabilities = 610;
if( HalRegisterPermanentAddressUsage(v9, 0x14u) < 0 )
return 0i64;
HIDWORD(v11) = v4;
*(LARGE_INTEGER *)&v10 = v6[-1];
HalpTimerRegister(&result, 0i64);
}
++v4;
v6 = (LARGE_INTEGER *)((char *)v6 + 20);
}
while( v4 < (unsigned int)v5 );
}
}
}
return 0i64;
}Referenced by:
HalpTimerRegisterBuiltinPlugins