HalpIommuAllocateDmaDomain
INT64 __fastcall HalpIommuAllocateDmaDomain(INT64 a1, CHAR a2, INT64 *a3){
int PageTableType;
unsigned int v6;
__int64 v7;
__int64 v8;
INT64 v9;
bool v10;
signed __int32 v12;
INT64 v13;
INT64 v14;
signed __int32 v15;
int v16;
INT64 v17;
LODWORD(v17) = 0;
PageTableType = 0;
v6 = a1;
v7 = HalpMmAllocCtxAlloc(a1, 48i64);
v9 = v7;
if( !v7 )
return(unsigned int)-1073741670;
v10 = HalpHvIommu == 0;
*(_OWORD *)v7 = 0i64;
*(_OWORD *)(v7 + 16) = 0i64;
*(_OWORD *)(v7 + 32) = 0i64;
*(_BYTE *)(v7 + 44) = a2;
if( !v10 )
{
if( a2 )
{
if( !HalpHvIommuDeviceDomain )
goto LABEL_13;
}
else if( !HalpHvParaVirtIommuDomain )
{
goto LABEL_13;
}
v12 = _InterlockedIncrement(&HalpIommuDomainId);
*(_DWORD *)(v7 + 32) = v12;
v16 = 0;
*(_BYTE *)(v7 + 40) = a2 == 0;
v15 = v12;
LOBYTE(v16) = a2 == 0;
PageTableType = ((__int64(__fastcall *)(signed __int32 *))qword_140C4A2B0)(&v15);
goto LABEL_6;
}
if( !a2 )
{
LABEL_13:
PageTableType = -1073741637;
goto LABEL_16;
}
if( v6 > 1 )
{
PageTableType = HalpIommuGetPageTableType(&v17);
if( PageTableType < 0 )
goto LABEL_16;
PageTableType = HalpIommuCreateDmarPageTable(
(unsigned int)v17,
(unsigned int)HalpIommuMinPageTableDepth,
(unsigned int)HalpIommuMaxPageTableDepth,
v13,
v14,
0i64,
(INT64 *)(v9 + 24));
if( PageTableType < 0 )
goto LABEL_16;
}
*(_QWORD *)(v9 + 8) = v9;
*(_QWORD *)v9 = v9;
*(_QWORD *)(v9 + 16) = 0i64;
LABEL_6:
*(_DWORD *)(v9 + 36) = v6;
*a3 = v9;
if( PageTableType < 0 )
LABEL_16:
HalpMmAllocCtxFree(v8, v9);
return(unsigned int)PageTableType;
}Referenced by:
HalpIommuInitializeDmar
IommuDomainCreate