HalpIommuHsaDiscover
int __fastcall HalpIommuHsaDiscover(_QWORD *a1){
INT64 Table;
INT64 v3;
int result;
__int64 v5;
unsigned __int64 v6;
int v7;
bool v8;
unsigned __int64 v9;
__int64 v10;
_BYTE *v11;
unsigned __int64 v12;
__int64 v13;
_BYTE *v14;
CHAR a3;
*a1 = 0i64;
qword_140C486E8 = (__int64)&HsaIvhdList;
HsaIvhdList = (__int64)&HsaIvhdList;
a3 = 0;
if( HalpExtEnvLoaderBlock )
{
Table = HalpAcpiGetTable((volatile INT64 *)HalpExtEnvLoaderBlock);
v3 = Table;
if( Table )
{
v5 = *(unsigned int *)(Table + 4);
if( (unsigned int)v5 >= 0x5A )
{
v6 = v5 + v3;
v7 = *(_DWORD *)(v3 + 36);
if( (v7 & 1) != 0 )
{
if( (v7 & 2) != 0 )
{
v8 = 1;
v9 = v3 + 48;
while( v9 < v6 )
{
if( v9 + 4 > v6 )
return -1073741811;
v10 = *(unsigned __int16 *)(v9 + 2);
if( (unsigned int)v10 < 4 || v9 + v10 > v6 )
return -1073741811;
v11 = (_BYTE *)v9;
v9 += v10;
if( *v11 == 64 )
{
result = HalpIommuProcessIvhdEntry(v3, (INT64)v11, &a3);
if( result < 0 )
return result;
v8 = v8 && !a3;
}
}
}
else
{
v8 = 0;
}
v12 = v3 + 48;
while( v12 < v6 )
{
if( v12 + 4 > v6 )
return -1073741811;
v13 = *(unsigned __int16 *)(v12 + 2);
if( (unsigned int)v13 < 4 || v12 + v13 > v6 )
return -1073741811;
v14 = (_BYTE *)v12;
v12 += v13;
if( *v14 == 17 )
{
result = HalpIommuProcessIvhdEntry(v3, (INT64)v14, &a3);
if( result < 0 )
return result;
v8 = v8 && !a3;
}
}
*a1 ^= (*(_DWORD *)a1 ^ (2 * v8)) & 2;
}
}
}
}
return 0;
}Referenced by:
HalpIommuRegisterBuiltinPlugins