HalpHvDiscover

INT64 __fastcall HalpHvDiscover(INT64 a1){
  INT64 v1; 
  int MaximumProcessorCount; 
  TIMER_INITIALIZATION_BLOCK result; 
  CHAR v5; 
  v5 = 0;
  if( (int)HalSocRequestApi(a1, (INT64)HalpHvCounterUpdateCallback, 3i64, 8ui64, &HalpHvTimerApi) >= 0 )
  {
    memset((INT64)&result, 0i64);
    result.Header = (SOC_INITIALIZATION_HEADER)0x9000000001i64;
    result.FunctionTable.Initialize = (PTIMER_INITIALIZE)HalSystemVectorDispatchEntry;
    result.FunctionTable.QueryCounter = (PTIMER_QUERY_COUNTER)HalpHvCounterQueryCounter;
    result.CounterBitWidth = 64;
    result.KnownType = TimerHypervisor;
    result.Capabilities = 2;
    result.CounterFrequency = 10000000i64;
    HalpTimerRegister(&result, 0i64);
  }
  if( (int)HalSocRequestConfigurationData(3i64, v1, &v5) >= 0 && v5 )
  {
    memset((INT64)&result, 0i64);
    result.InternalData = 0i64;
    result.Header = (SOC_INITIALIZATION_HEADER)0x9000000001i64;
    MaximumProcessorCount = HalQueryMaximumProcessorCount();
    result.CounterBitWidth = 64;
    result.CounterFrequency = 10000000i64;
    result.KnownType = TimerHypervisor;
    result.Capabilities = 34913;
    result.FunctionTable.Initialize = (PTIMER_INITIALIZE)HalpHvTimerInitialize;
    result.FunctionTable.QueryCounter = (PTIMER_QUERY_COUNTER)HalpHvCounterQueryCounter;
    result.FunctionTable.SetInterruptVector = (PTIMER_SET_INTERRUPT_VECTOR)HalpHvTimerSetInterruptVector;
    result.FunctionTable.ArmTimer = (PTIMER_ARM_TIMER)HalpHvTimerArm;
    result.FunctionTable.AcknowledgeInterrupt = (PTIMER_ACKNOWLEDGE_INTERRUPT)HalpHvTimerAcknowledgeInterrupt;
    result.InternalDataSize = 24 * MaximumProcessorCount;
    result.FunctionTable.Stop = (PTIMER_STOP)HalpHvTimerStop;
    HalpTimerRegister(&result, 0i64);
  }
  return 0i64;
}

Referenced by:

HalpTimerRegisterBuiltinPluginsCommon