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