HalpIommuInitializeAll
INT64 __fastcall HalpIommuInitializeAll(CHAR a1, INT64 a2, INT64 a3){
INT64 v3;
unsigned int i;
INT64 *v6;
INT64 result;
INT64 *v8;
INT64 v9;
unsigned int v10;
int v11;
unsigned int v12;
INT8 *Memory;
_DWORD *v14;
unsigned int v15;
int v16;
INT64 v17;
GROUP_AFFINITY v18;
__int128 v19;
__int64 IrtEntryCount;
IrtEntryCount = 0i64;
v3 = a2;
v18 = 0i64;
v19 = 0i64;
if( !a1 && (int)HalpIommuPopulateExceptionList() < 0 )
return 3221225473i64;
if( HalpHvIommu )
return 0i64;
if( IommuRemappingPolicy && (INT64 *)HalpIommuList == &HalpIommuList )
return 3221225659i64;
for( i = 0; i < 3; ++i )
{
v6 = (INT64 *)HalpIommuList;
while( v6 != &HalpIommuList )
{
v8 = v6;
v9 = (INT64)v6;
v6 = (INT64 *)*v6;
v10 = *((_DWORD *)v8 + 114);
if( (v10 & 0x40) == 0 && IommuRemappingPolicy )
return 3221225659i64;
v11 = (v10 >> 5) & 1;
if( (v10 & 0x100) == 0 )
goto LABEL_26;
if( !i && !a1 )
{
v12 = *((_DWORD *)v8 + 106);
if( v12 > 0x10000 )
v12 = 0x10000;
Memory = HalpMmAllocateMemory(4 * ((v12 + 32) >> 5));
*((_DWORD *)v8 + 110) = v12;
v8[56] = (INT64)Memory;
RtlClearAllBits((RTL_BITMAP *)(v8 + 55));
v8[54] = 0i64;
}
if( HalpIommuPolicy == 3 )
{
v11 = 2;
LABEL_28:
if( !i )
{
if( !a1 )
{
v14 = (_DWORD *)v8[66];
if( v14 && (v15 = *((_DWORD *)v8 + 114), (v15 & 0x100) != 0) )
{
if( (int)HalpIommuConstructReservedPageTables(v3, v14, ((v15 >> 12) & 7) + 1) < 0 )
return 3221225473i64;
v16 = ((__int64(__fastcall *)(INT64, _QWORD, INT64))v8[42])(v8[2], *(unsigned int *)v8[66], v8[66] + 8);
}
else
{
v16 = 0;
}
if( v16 < 0 )
return 3221225473i64;
}
*(_QWORD *)&v19 = 0i64;
*((_QWORD *)&v19 + 1) = __PAIR64__(IommuRemappingPolicy, v11);
IrtEntryCount = (unsigned int)HalpGetIrtEntryCount();
if( ((int(__fastcall *)(INT64, __int128 *))v8[7])(v8[2], &v19) < 0 )
return 3221225473i64;
}
if( i >= 2 )
{
if( v8[36] )
{
if( a1 )
{
if( (v8[45] & 2) != 0 )
{
LOBYTE(a2) = 1;
result = ((__int64(__fastcall *)(INT64, INT64, INT64, _QWORD))v8[33])(
v8[2],
a2,
v8[60],
*((unsigned int *)v8 + 122));
}
else
{
result = 0i64;
}
if( (int)result < 0 )
return result;
((void(__fastcall *)(INT64))v8[34])(v8[2]);
}
else
{
v18.Reserved[1] = 0;
v18.Reserved[2] = 0;
*(_DWORD *)&v18.Group = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
v18.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
if( !(unsigned __int8)HalpInterruptIsRemappingRequired() || (v17 = 6i64, (v8[57] & 0x10) != 0) )
v17 = 1073741822i64;
HalpIommuConfigureInterrupt(v9, v17, &v18);
}
}
}
else
{
LOBYTE(a3) = a1;
result = ((__int64(__fastcall *)(INT64, _QWORD, INT64))v8[8])(v8[2], i, a3);
if( (int)result < 0 )
return result;
}
}
else
{
v11 = 1;
LABEL_26:
if( v11 || IommuRemappingPolicy )
goto LABEL_28;
}
}
}
HalpIommuUpdatePageWalkCapability();
HalpIommuUpdatePageTableLevel();
return 0i64;
}Referenced by:
HalpInterruptReinitialize
HalpIommuInitSystem