HsaUpdateRemappingDestination
UINT64 __fastcall HsaUpdateRemappingDestination(UINT64 *a1, LONG64 rdx0, _DWORD *a3, INT64 a5, INT64 a4){
unsigned int v5;
char v6;
__int64 v8;
__int64 v9;
unsigned int v10;
__m128i *v11;
unsigned __int64 v12;
unsigned int v13;
unsigned int updated;
signed __int64 v15;
signed __int64 v16;
__int64 v17;
__int128 v18;
unsigned __int8 v19;
UINT64 a5a;
unsigned int i;
v5 = 0;
v6 = rdx0;
for( i = 0; v5 < HsaAllocatedDeviceApertures; i = v5 )
{
HsaGetDeviceAperture(v5 << 9);
v9 = v8;
if( !v5 || *(_QWORD *)(v8 + 16) )
{
v10 = 0;
if( *((_DWORD *)a1 + 45) )
{
do
{
v11 = (__m128i *)(*(_QWORD *)(v9 + 16) + 16i64 * v10);
v12 = v11->m128i_i64[0];
if( (v11->m128i_i64[0] & 1) != 0 && (!v6 || _bittest(*(const signed __int32 **)(v9 + 40), v10)) )
{
LODWORD(a5a) = a4;
v13 = (v11->m128i_u8[15] << 24) | (v12 >> 8) & 0xFFFFFF;
updated = IvtUpdateExtendedDestination(v13, (v12 & 0x40) != 0, a3, a5, a5a);
if( v13 != updated )
{
v15 = ((unsigned __int64)updated << 32) ^ (_mm_srli_si128(*v11, 8).m128i_u64[0] ^ ((unsigned __int64)updated << 32)) & 0xFFFFFFFFFFFFFFi64;
rdx0 = v11->m128i_i64[1];
v16 = v11->m128i_i64[0] ^ (v11->m128i_i64[0] ^ ((unsigned __int64)updated << 8)) & 0xFFFFFF00;
v17 = v11->m128i_i64[0];
do
{
*(_QWORD *)&v18 = v17;
*((_QWORD *)&v18 + 1) = rdx0;
v19 = _InterlockedCompareExchange128(v11->m128i_i64, v15, v16, (signed __int64 *)&v18);
v17 = v18;
rdx0 = *((_QWORD *)&v18 + 1);
}
while( !v19 );
}
}
++v10;
}
while( v10 < *((_DWORD *)a1 + 45) );
v5 = i;
}
}
++v5;
}
return HsaInvalidateRemappingTableEntries(a1, rdx0, 0i64);
}Referenced by:
No references.