HalpIommuInitDiscard

INT64 __fastcall HalpIommuInitDiscard(INT64 a1){
  bool v2; 
  _QWORD *v3; 
  INT64 result; 
  INT64 v5; 
  int v6; 
  INT64 v7[2]; 
  HalpIommuParaVirtDeviceCacheLock = 0i64;
  HalpDeviceBlockUnblockPushLock = 0i64;
  HalpIommuDeviceCreatedListPushLock = 0i64;
  v2 = *(_BYTE *)HalpHvCpuManager == 0;
  v3 = (_QWORD *)HalIommuDispatch;
  qword_140C48A48 = (__int64)&HalpIommuParaVirtDeviceCache;
  HalpIommuParaVirtDeviceCache = (__int64)&HalpIommuParaVirtDeviceCache;
  qword_140C49BB8 = (__int64)&HalpIommuDeviceCreatedList;
  HalpIommuDeviceCreatedList = (__int64)&HalpIommuDeviceCreatedList;
  qword_140C49C08 = (__int64)&HalpRidAliasList;
  HalpRidAliasList = (__int64)&HalpRidAliasList;
  *(_QWORD *)(HalIommuDispatch + 8) = IommuGetConfiguration;
  v3[2] = IommuGetLibraryContext;
  v3[3] = IommuMapDevice;
  v3[4] = IommuEnableDevicePasid;
  v3[5] = IommuSetAddressSpace;
  v3[6] = IommuDisableDevicePasid;
  v3[7] = IommuUnmapDevice;
  v3[9] = IommuFlushTb;
  v3[10] = IommuFlushAllPasid;
  v3[11] = IommuProcessPageRequestQueue;
  v3[16] = IommuDevicePowerChange;
  v3[17] = IommuBeginDeviceReset;
  v3[18] = IommuFinalizeDeviceReset;
  *(_OWORD *)v7 = 0i64;
  HalpHvParaVirtIommuDomain = 0;
  HalpIommuDmaGuardTableOptIn = 0;
  HalpHvIommu = 0;
  if( !v2 )
  {
    HalpHvIommuDeviceDomain = ((unsigned int)EDX(__cpuid(1073741827, 0)) >> 24) & 1;
    HalpHvParaVirtIommuDomain = (EDX(__cpuid(1073741827, 0)) & 0x2000000) != 0;
    HviGetHardwareFeatures((INT64)v7);
    if( (v7[0] & 0x20) != 0 )
    {
      HalpHvIommu = 1;
      v3[1] = IommuHvGetConfiguration;
      v3[5] = IommuHvSetAddressSpace;
      v3[9] = IommuHvFlushTb;
      v3[10] = IommuHvFlushAllPasid;
      v3[16] = IommuHvDevicePowerChange;
    }
  }
  HalpIommuEnableGpuIdentityMapping = *(int *)(*(_QWORD *)(a1 + 240) + 132i64) < 0;
  result = HalpIommuRegisterBuiltinPlugins();
  v5 = HalpIommuList;
  if( (INT64 *)HalpIommuList != &HalpIommuList )
  {
    while( 1 )
    {
      v6 = *(_DWORD *)(v5 + 456);
      v5 = *(_QWORD *)v5;
      if( (v6 & 0x40) == 0 )
        break;
      if( (INT64 *)v5 == &HalpIommuList )
        return result;
    }
  }
  HalpInterruptX2ApicPolicy = 0;
  return result;
}

Referenced by:

HalpIommuInitSystem