HsaInitializeInterruptRemapping
NTSTATUS __stdcall HsaInitializeInterruptRemapping(INT64 a1){
int v1;
int v3;
_LARGE_INTEGER v4;
UINT8 v5;
VOID *v6;
INT64 v7;
_RTL_BITMAP *v8;
INT64 v9;
INT64 v10;
INT64 v12;
INT64 v13;
v13 = 0i64;
v1 = 0;
v12 = 0i64;
v3 = *(_DWORD *)(a1 + 176);
if( v3 )
{
if( v3 == 1 )
{
if( !*(&CmpDummyThreadEvent + 397) )
{
*(&CmpDummyThreadEvent + 797) = *(_DWORD *)(a1 + 180);
*(&CmpDummyThreadEvent + 796) = (16 * *(&CmpDummyThreadEvent + 797) + 4095) & 0xFFFFF000;
v4.QuadPart = (*(&CmpDummyThreadEvent + 406))(-1i64, *(&CmpDummyThreadEvent + 796) >> 12);
*(&CmpDummyThreadEvent + 396) = v4.QuadPart;
if( v4.QuadPart
&& (v6 = (VOID *)HalMapIoSpace(v4, *(&CmpDummyThreadEvent + 796), MmCached, v5),
(*(&CmpDummyThreadEvent + 397) = v6) != 0i64) )
{
memset(v6, 0i64, *(&CmpDummyThreadEvent + 796));
v1 = ExtEnvAllocateMemory(v7, 4 * ((unsigned int)(*(_DWORD *)(a1 + 180) + 31) >> 5), &v12);
if( v1 >= 0 )
{
RtlInitializeBitMap((PRTL_BITMAP)((char *)&CmpDummyThreadEvent + 3192), (PULONG)v12, *(_DWORD *)(a1 + 180));
ExtEnvClearBits(v8, 0i64, *(unsigned int *)(a1 + 180));
*(&CmpDummyThreadEvent + 802) = (unsigned int)HalpGetIrtEntryCount() >> 9;
v1 = ExtEnvAllocateMemory(v9, 0x1C00ui64, &v13);
if( v1 >= 0 )
{
v10 = v13;
ExtEnvZeroMemory((VOID *)v13, 7168);
ExtEnvInitializeSpinLock();
*(&CmpDummyThreadEvent + 805) = 128;
*(&CmpDummyThreadEvent + 412) = v10;
*(_OWORD *)(v10 + 8) = *(&CmpDummyThreadEvent + 198);
*(_OWORD *)(v10 + 24) = *(&CmpDummyThreadEvent + 199);
*(_QWORD *)(v10 + 40) = *(&CmpDummyThreadEvent + 400);
*(_DWORD *)(v10 + 48) = 1;
*(_DWORD *)(v10 + 52) = -1;
}
}
}
else
{
return -1073741670;
}
}
}
else
{
return -1073741637;
}
}
return v1;
}Referenced by:
HsaInitializeIommu