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