HalpIommuInitializeDmarPageTable
NTSTATUS __stdcall HalpIommuInitializeDmarPageTable(
INT64 a1,
INT64 a2,
UINT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 result){
int v7;
unsigned int v8;
int v9;
__int64(__fastcall **v10)();
unsigned int v12;
int v13;
const char *v14;
unsigned int v15;
char *v16;
char *v17;
int v18;
unsigned int v19;
_DWORD *v20;
unsigned int v21;
__int64 v22;
UINT64 v23;
__int64 v24;
v7 = a2;
v8 = a3;
v9 = a1;
memset((VOID *)result, 0i64, 0x60u);
if( v9 )
{
if( v9 != 3 )
return -1073741811;
v10 = HsaSlPhyPteInterface;
}
else
{
v10 = IvtSlPhyPteInterface;
}
*(_DWORD *)(result + 28) = 3;
v12 = 0;
*(_QWORD *)(result + 88) = v10;
*(_DWORD *)result = v9;
*(_DWORD *)(result + 24) = v8;
v13 = 12;
if( v8 )
{
v14 = "\t";
do
{
*(_DWORD *)&v14[result - (_QWORD)"\t" + 36] = *(_DWORD *)v14;
v15 = v8 - v12++;
*(_DWORD *)(result + 4i64 * (v15 - 1) + 60) = v13;
v13 += *(_DWORD *)v14;
v14 += 4;
}
while( v12 < v8 );
}
*(_DWORD *)(result + 32) = 0;
LODWORD(v16) = HalpIommuAllocateAndZeroPageTable(result, 0i64, a6);
*(_QWORD *)(result + 16) = v16;
v17 = v16;
if( v16 )
{
v18 = 0;
v19 = v8 - v7;
if( v8 == v7 )
{
LABEL_16:
*(_QWORD *)(result + 8) = 0i64;
return 0;
}
v20 = (_DWORD *)(result + 36);
while( 1 )
{
v21 = v18 + 1;
v22 = 1 << *v20 << *(_DWORD *)(result + 28);
LODWORD(v23) = HalpIommuAllocateAndZeroPageTable(result, (unsigned int)(v18 + 1), a6);
*(_QWORD *)&v17[v22] = v23;
if( !v23 )
break;
LODWORD(v24) = MmGetPhysicalAddress(v23);
(**(void(__fastcall ***)(VOID *, _QWORD, __int64))(result + 88))(v17, v8 - v18 - 1, v24);
if( !byte_140C49BF1 )
KeInvalidateRangeAllCachesNoIpi(v17, (unsigned int)(1 << *(_DWORD *)(result + 28)));
v17 = *(char **)&v17[v22];
++v20;
++v18;
if( v21 >= v19 )
goto LABEL_16;
}
}
return -1073741670;
}Referenced by:
HalpIommuCreateDmarPageTable