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