HalpIommuProcessIvhdEntry

void __fastcall HalpIommuProcessIvhdEntry(__int64 a1, INT64 a2, char *r8_0){
  char v6; 
  bool v7; 
  __int64 **v8; 
  unsigned __int64 v9; 
  __int16 v10; 
  __int16 v11; 
  __int16 v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  unsigned int v16; 
  int v17; 
  INT64 v18; 
  INT64 v19; 
  void *v20; 
  int v21; 
  INT64 v22; 
  _QWORD *v23; 
  _QWORD *v24; 
  INT64 v25; 
  INT64 a4; 
  __int64 v27[2]; 
  INT64 arg1[14]; 
  INT64 v29[18]; 
  __int64 v30[28]; 
  char a3; 
  char v32; 
  INT64 v33; 

  v6 = 0;
  v25 = 0i64;
  memset(v29, 0i64, 0x88u);
  memset(v30, 0i64, 0xA8u);
  v7 = *(_WORD *)(a2 + 2) < 0x28u;
  v27[0] = 0i64;
  v33 = 0i64;
  a4 = 0i64;
  *r8_0 = 0;
  v32 = 0;
  a3 = 0;
  if( !v7 && (*(_BYTE *)a2 == 17 || *(_BYTE *)a2 == 64) )
  {
    v8 = (__int64 **)*(&CmpDummyThreadEvent + 404);
    if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 404) == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 3232) )
    {
LABEL_7:
      v9 = *(_QWORD *)(a2 + 24);
      v10 = (4 * *(_WORD *)(a2 + 24)) & 8 | (16 * ((v9 >> 45) & 1)) | 1;
      if( (*(_BYTE *)(a2 + 1) & 0x10) == 0 || (v9 & 0x600000000008i64) != 0x600000000008i64 )
        v10 = (4 * *(_WORD *)(a2 + 24)) & 8 | (16 * ((v9 >> 45) & 1));
      v11 = v10 | 4;
      if( (v11 & 1) == 0
        || (v9 & 0x12) != 18
        || (v9 & 0xC000) == 0
        || (v9 & 0x20000000000i64) == 0
        || (BYTE4(v9) & 0x1Fu) < 8 )
      {
        v11 &= ~4u;
      }
      v12 = v11 | 2;
      if( (v9 & 0x84) != 0x84 )
        v12 = v11;
      if( (v12 & 3) != 0
        && HsaProcessIvmd(a2, a1 + *(unsigned int *)(a1 + 4), &a3, &a4) >= 0
        && ExtEnvAllocateMemory(v13, 0xF0ui64, &v33) >= 0 )
      {
        v14 = v33;
        memset((VOID *)v33, 0i64, 0xF0u);
        memset(&v29[2], 0i64, 0x78u);
        *(_QWORD *)(v14 + 232) = v14 + 224;
        *(_QWORD *)(v14 + 224) = v14 + 224;
        *(_BYTE *)(v14 + 16) = *(_BYTE *)(a2 + 1);
        *(_WORD *)(v14 + 18) = v12;
        *(_QWORD *)(v14 + 8) = *(_QWORD *)(a2 + 8);
        *(_DWORD *)(v14 + 160) = *(unsigned __int16 *)(a2 + 16);
        *(_DWORD *)(v14 + 164) = *(unsigned __int8 *)(a2 + 5);
        *(_DWORD *)(v14 + 168) ^= (*(_DWORD *)(v14 + 168) ^ (*(unsigned __int16 *)(a2 + 4) >> 3)) & 0x1F;
        v15 = *(_DWORD *)(v14 + 168) ^ ((unsigned __int8)*(_DWORD *)(v14 + 168) ^ (unsigned __int8)(32
                                                                                                  * *(_WORD *)(a2 + 4))) & 0xE0u;
        *(_DWORD *)(v14 + 168) = v15;
        if( ExtEnvAllocateMemory(v15, 0x2000ui64, &v25) >= 0 )
        {
          *(_QWORD *)(v14 + 192) = v25;
          *(_DWORD *)(v14 + 184) = 0x10000;
          RtlClearBits((PRTL_BITMAP)(v14 + 184), 0, 0x10000u);
          *(_QWORD *)(v14 + 152) = 0i64;
          if( HalpIommuProcessDeviceEntries(v14, a2, &v32) >= 0
            && HalRegisterPermanentAddressUsage(*(_LARGE_INTEGER *)(v14 + 8), 0x2040u) >= 0 )
          {
            memset(arg1, 0i64, 0x68u);
            HIDWORD(arg1[9]) = *(_DWORD *)(v14 + 160);
            v16 = 2076;
            arg1[10] = *(_QWORD *)(v14 + 164);
            arg1[7] = (INT64)v29;
            arg1[8] = (INT64)v30;
            v29[0] = (INT64)HsaConfigureSettings;
            v29[1] = (INT64)HsaInitializeIommu;
            arg1[0] = 0x6800000001i64;
            arg1[1] = v14;
            arg1[2] = 0x81C00000000i64;
            LODWORD(arg1[9]) = 1;
            LODWORD(arg1[12]) = 16;
            if( (v12 & 1) != 0 )
            {
              v29[4] = (INT64)HsaCreateDevice;
              v29[5] = (INT64)IvtDeleteDevice;
              v30[0] = (__int64)HsaFindDevice;
              v30[5] = (__int64)HsaFlushTb;
              v30[6] = (__int64)HsaFlushDeviceTbOnly;
              v30[19] = (__int64)HsaQueryAcpiDeviceMapping;
              v30[20] = (__int64)HsaGetRidAcpiMapCount;
              if( !a3 )
              {
                v16 = 2332;
                v30[17] = (__int64)HsaEnumerateIvmdDevices;
                v30[18] = (__int64)HsaProcessReservedDomains;
                v29[7] = (INT64)HsaAttachDeviceDomain;
                v29[8] = (INT64)HsaDetachDeviceDomain;
              }
              v16 |= 0x3000u;
              v29[9] = (INT64)HsaFlushDomainTb;
              v29[10] = (INT64)xHalTimerWatchdogStop;
              v29[11] = (INT64)xHalTimerWatchdogStop;
              HIDWORD(arg1[2]) = v16;
            }
            v17 = 0x40000;
            if( (unsigned int)((1 << ((BYTE4(v9) & 0x1F) + 1)) - 1) < 0x40000 )
              v17 = (1 << ((BYTE4(v9) & 0x1F) + 1)) - 1;
            LODWORD(arg1[11]) = v17;
            if( (v12 & 4) != 0 )
            {
              v16 |= 0x20u;
              v30[1] = (__int64)HsaSetDeviceSvmCapabilities;
              v30[2] = (__int64)HsaSetDevicePasidTable;
              v30[3] = (__int64)HsaGrowPasidTable;
              v30[4] = (__int64)HsaSetPasidAddressSpace;
              v30[7] = (__int64)HsaDismissPageFault;
              v30[8] = (__int64)HsaGetPageFault;
              v30[14] = (__int64)HsaMarkHiberRegions;
              HIDWORD(arg1[2]) = v16;
            }
            if( (v12 & 2) != 0 )
            {
              v29[14] = (INT64)HsaUpdateRemappingTableEntry;
              v16 = v16 & 0xFFFFFFAF | 0x40;
              HIDWORD(arg1[2]) = v16;
              v29[15] = (INT64)HsaInvalidateRemappingTableEntry;
              v29[16] = (INT64)HsaUpdateRemappingDestination;
              v29[12] = (INT64)HsaAllocateRemappingTableEntry;
              v29[13] = (INT64)HsaFreeRemappingTableEntry;
            }
            if( (v12 & 4) != 0 )
            {
              v30[9] = (__int64)HsaSetMessageInterruptRouting;
              v30[10] = (__int64)HsaEnableInterrupt;
              v30[11] = (__int64)HsaDisableInterrupt;
              v30[12] = (__int64)HsaHandleInterrupt;
              HIDWORD(arg1[2]) = v16 | 2;
            }
            v18 = a4;
            v19 = *(unsigned int *)a4;
            HIDWORD(arg1[11]) = 65534 - v19;
            HalpHsaAllocateReservedDomainList(
              v14,
              (unsigned int)(65534 - v19),
              v19,
              (_ACL *)1,
              v25,
              a4,
              v27[0],
              v27[1],
              arg1[0],
              arg1[1],
              arg1[2],
              arg1[3],
              arg1[4],
              arg1[5],
              arg1[6],
              arg1[7],
              arg1[8],
              arg1[9],
              arg1[10],
              arg1[11],
              arg1[12],
              arg1[13],
              v29[0],
              v29[1],
              v29[2],
              (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)v29[3]);
            if( v21 >= 0 )
            {
              *(_DWORD *)(v14 + 200) = 65534;
              *(_QWORD *)(v14 + 208) = v18;
              if( ExtEnvRegisterIommu(arg1, v20) >= 0 && ExtEnvAllocateMemory(v22, 0x18ui64, v27) >= 0 )
              {
                v23 = (_QWORD *)v27[0];
                *(_OWORD *)v27[0] = 0i64;
                v23[2] = 0i64;
                v23[2] = *(_QWORD *)(a2 + 8);
                v24 = (_QWORD *)*(&CmpDummyThreadEvent + 405);
                if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 405) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 3232) )
                  __fastfail(3u);
                *v23 = (char *)&CmpDummyThreadEvent + 3232;
                v23[1] = v24;
                *v24 = v23;
                *(&CmpDummyThreadEvent + 405) = v23;
                if( a3 || v32 )
                  v6 = 1;
                *r8_0 = v6;
              }
            }
          }
        }
      }
    }
    else
    {
      while( v8[2] != *(__int64 **)(a2 + 8) )
      {
        v8 = (__int64 **)*v8;
        if( v8 == (__int64 **)((char *)&CmpDummyThreadEvent + 3232) )
          goto LABEL_7;
      }
    }
  }
}

Referenced by:

HalpIommuHsaDiscover