HsaIommuSendCommand
UINT64 __fastcall HsaIommuSendCommand(UINT64 *a1, UINT64 *a2, UINT8 *a3){
void *v3;
unsigned __int8 CurrentIrql;
UINT64 v7;
UINT64 v8;
unsigned __int64 v9;
UINT64 v10;
__int64 v11;
unsigned int v12;
unsigned int v13;
UINT64 v14;
__int64 v15;
__int64 v16;
UINT64 result;
unsigned int v18;
int v19[8];
struct _IO_WORKITEM LockHandle;
UINT64 v21;
UINT64 v22;
int v23;
v23 = (int)a3;
memset(&LockHandle, 0, 24);
if( (_DWORD)a3 )
{
CurrentIrql = 0;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 19);
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 19), CriticalWorkQueue, v3);
}
if( *a2 >> 60 == 1 )
{
v7 = a1[17];
a1[15] = 1i64;
*a2 = v7;
a2[1] = a1[18];
}
v8 = *a1;
v21 = *a1;
v9 = *(_QWORD *)(*a1 + 8200);
v10 = a1[6];
v22 = v10;
v11 = ((unsigned int)(v9 >> 4) & 0x7FFF) + 1;
v12 = 0;
v13 = 0;
v14 = a1[8] >> 4;
if( (_DWORD)v11 != (_DWORD)v14 )
v13 = ((v9 >> 4) & 0x7FFF) + 1;
v15 = v13;
if( v13 == ((*(_QWORD *)(v8 + 0x2000) >> 4) & 0x7FFFi64) )
{
do
{
if( (++v12 & dword_140C4A13C) != 0 || !qword_140C4A140 )
{
_mm_pause();
}
else
{
qword_140C4A140(v12, v11, v14);
v8 = v21;
}
}
while( v15 == ((*(_QWORD *)(v8 + 0x2000) >> 4) & 0x7FFFi64) );
v10 = v22;
}
v16 = 2 * ((v9 >> 4) & 0x7FFF);
*(_QWORD *)(v10 + 8 * v16) = *a2;
*(_QWORD *)(v10 + 8 * v16 + 8) = a2[1];
*(_QWORD *)(v8 + 8200) = ((unsigned int)v9 ^ (16 * (_DWORD)v15)) & 0x7FFF0 ^ v9;
_InterlockedOr(v19, 0);
result = *a2 >> 60;
if( (_BYTE)result == 1 )
{
v18 = 0;
while( 1 )
{
result = a1[15];
if( !result )
break;
if( (++v18 & dword_140C4A13C) != 0 || !qword_140C4A140 )
_mm_pause();
else
qword_140C4A140(v18, v11, v14);
}
}
if( !v23 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
HsaDismissPageFault
HsaFlushDeviceTbOnly
HsaFlushTbInternal
HsaInvalidateDTE
HsaInvalidateRemappingTableEntries