HalpIommuInitializeAll

INT64 __fastcall HalpIommuInitializeAll(CHAR a1, INT64 a2, INT64 a3){
  INT64 v3; 
  unsigned int i; 
  INT64 *v6; 
  INT64 result; 
  INT64 *v8; 
  INT64 v9; 
  unsigned int v10; 
  int v11; 
  unsigned int v12; 
  INT8 *Memory; 
  _DWORD *v14; 
  unsigned int v15; 
  int v16; 
  INT64 v17; 
  GROUP_AFFINITY v18; 
  __int128 v19; 
  __int64 IrtEntryCount; 
  IrtEntryCount = 0i64;
  v3 = a2;
  v18 = 0i64;
  v19 = 0i64;
  if( !a1 && (int)HalpIommuPopulateExceptionList() < 0 )
    return 3221225473i64;
  if( HalpHvIommu )
    return 0i64;
  if( IommuRemappingPolicy && (INT64 *)HalpIommuList == &HalpIommuList )
    return 3221225659i64;
  for( i = 0; i < 3; ++i )
  {
    v6 = (INT64 *)HalpIommuList;
    while( v6 != &HalpIommuList )
    {
      v8 = v6;
      v9 = (INT64)v6;
      v6 = (INT64 *)*v6;
      v10 = *((_DWORD *)v8 + 114);
      if( (v10 & 0x40) == 0 && IommuRemappingPolicy )
        return 3221225659i64;
      v11 = (v10 >> 5) & 1;
      if( (v10 & 0x100) == 0 )
        goto LABEL_26;
      if( !i && !a1 )
      {
        v12 = *((_DWORD *)v8 + 106);
        if( v12 > 0x10000 )
          v12 = 0x10000;
        Memory = HalpMmAllocateMemory(4 * ((v12 + 32) >> 5));
        *((_DWORD *)v8 + 110) = v12;
        v8[56] = (INT64)Memory;
        RtlClearAllBits((RTL_BITMAP *)(v8 + 55));
        v8[54] = 0i64;
      }
      if( HalpIommuPolicy == 3 )
      {
        v11 = 2;
LABEL_28:
        if( !i )
        {
          if( !a1 )
          {
            v14 = (_DWORD *)v8[66];
            if( v14 && (v15 = *((_DWORD *)v8 + 114), (v15 & 0x100) != 0) )
            {
              if( (int)HalpIommuConstructReservedPageTables(v3, v14, ((v15 >> 12) & 7) + 1) < 0 )
                return 3221225473i64;
              v16 = ((__int64(__fastcall *)(INT64, _QWORD, INT64))v8[42])(v8[2], *(unsigned int *)v8[66], v8[66] + 8);
            }
            else
            {
              v16 = 0;
            }
            if( v16 < 0 )
              return 3221225473i64;
          }
          *(_QWORD *)&v19 = 0i64;
          *((_QWORD *)&v19 + 1) = __PAIR64__(IommuRemappingPolicy, v11);
          IrtEntryCount = (unsigned int)HalpGetIrtEntryCount();
          if( ((int(__fastcall *)(INT64, __int128 *))v8[7])(v8[2], &v19) < 0 )
            return 3221225473i64;
        }
        if( i >= 2 )
        {
          if( v8[36] )
          {
            if( a1 )
            {
              if( (v8[45] & 2) != 0 )
              {
                LOBYTE(a2) = 1;
                result = ((__int64(__fastcall *)(INT64, INT64, INT64, _QWORD))v8[33])(
                           v8[2],
                           a2,
                           v8[60],
                           *((unsigned int *)v8 + 122));
              }
              else
              {
                result = 0i64;
              }
              if( (int)result < 0 )
                return result;
              ((void(__fastcall *)(INT64))v8[34])(v8[2]);
            }
            else
            {
              v18.Reserved[1] = 0;
              v18.Reserved[2] = 0;
              *(_DWORD *)&v18.Group = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
              v18.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
              if( !(unsigned __int8)HalpInterruptIsRemappingRequired() || (v17 = 6i64, (v8[57] & 0x10) != 0) )
                v17 = 1073741822i64;
              HalpIommuConfigureInterrupt(v9, v17, &v18);
            }
          }
        }
        else
        {
          LOBYTE(a3) = a1;
          result = ((__int64(__fastcall *)(INT64, _QWORD, INT64))v8[8])(v8[2], i, a3);
          if( (int)result < 0 )
            return result;
        }
      }
      else
      {
        v11 = 1;
LABEL_26:
        if( v11 || IommuRemappingPolicy )
          goto LABEL_28;
      }
    }
  }
  HalpIommuUpdatePageWalkCapability();
  HalpIommuUpdatePageTableLevel();
  return 0i64;
}

Referenced by:

HalpInterruptReinitialize
HalpIommuInitSystem