HsaInitializeInterruptRemapping

INT64 __fastcall HsaInitializeInterruptRemapping(INT64 a1){
  int Memory; 
  int v3; 
  LARGE_INTEGER v4; 
  PVOID v5; 
  INT64 v6; 
  RTL_BITMAP *v7; 
  INT64 v8; 
  INT64 v9; 
  PULONG BitMapBuffer; 
  INT64 v12; 
  v12 = 0i64;
  Memory = 0;
  BitMapBuffer = 0i64;
  v3 = *(_DWORD *)(a1 + 176);
  if( v3 )
  {
    if( v3 == 1 )
    {
      if( !*((_QWORD *)&HsaSharedRemappingTable + 1) )
      {
        *((_DWORD *)NumberOfBytes + 1) = *(_DWORD *)(a1 + 180);
        *(_DWORD *)NumberOfBytes = (16 * *((_DWORD *)NumberOfBytes + 1) + 4095) & 0xFFFFF000;
        v4.QuadPart = ((__int64(__fastcall *)(__int64, _QWORD))HsaPhysicalMemoryApi)(
                        -1i64,
                        *(_DWORD *)NumberOfBytes >> 12);
        *(LARGE_INTEGER *)&HsaSharedRemappingTable = v4;
        if( v4.QuadPart
          && (v5 = HalMapIoSpace(v4, *(unsigned int *)NumberOfBytes, MmCached),
              (*((_QWORD *)&HsaSharedRemappingTable + 1) = v5) != 0i64) )
        {
          memset((INT64)v5, 0i64);
          Memory = ExtEnvAllocateMemory(
                     v6,
                     4 * ((unsigned int)(*(_DWORD *)(a1 + 180) + 31) >> 5),
                     (INT64 *)&BitMapBuffer);
          if( Memory >= 0 )
          {
            RtlInitializeBitMap(
              (RTL_BITMAP *)((char *)NumberOfBytes + 8),
              (UINT64 *)BitMapBuffer,
              *(unsigned int *)(a1 + 180));
            ExtEnvClearBits(v7, 0i64, *(unsigned int *)(a1 + 180));
            HsaTotalDeviceApertures = (unsigned int)HalpGetIrtEntryCount() >> 9;
            Memory = ExtEnvAllocateMemory(v8, 0x1C00ui64, &v12);
            if( Memory >= 0 )
            {
              v9 = v12;
              ExtEnvZeroMemory((VOID *)v12, 0x1C00ui64);
              ExtEnvInitializeSpinLock(&HsaDeviceApertureLock);
              HsaAllocatedDeviceApertures = 128;
              HsaDeviceApertureRanges[0] = v9;
              *(_OWORD *)(v9 + 8) = *(_OWORD *)&HsaSharedRemappingTable;
              *(_OWORD *)(v9 + 24) = *(_OWORD *)NumberOfBytes;
              *(_QWORD *)(v9 + 40) = qword_140C486C0;
              *(_DWORD *)(v9 + 48) = 1;
              *(_DWORD *)(v9 + 52) = -1;
            }
          }
        }
        else
        {
          return(unsigned int)-1073741670;
        }
      }
    }
    else
    {
      return(unsigned int)-1073741637;
    }
  }
  return(unsigned int)Memory;
}

Referenced by:

HsaInitializeIommu