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