IvtIommuWaitCommand

INT64 __fastcall IvtIommuWaitCommand(INT64 a1, INT64 rdx0, UINT8 *a3){
  void *v3; 
  int v4; 
  unsigned __int8 CurrentIrql; 
  __int64 v7; 
  __int64 v8; 
  unsigned int v9; 
  INT64 result; 
  _QWORD a2[2]; 
  _BYTE LockHandle[56]; 
  v4 = (int)a3;
  memset(LockHandle, 0, 24);
  if( (_DWORD)a3 )
  {
    CurrentIrql = 0;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    *(_QWORD *)LockHandle = 0i64;
    *(_QWORD *)&LockHandle[8] = a1 + 168;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 168), CriticalWorkQueue, v3);
  }
  a2[0] = *(_QWORD *)(a1 + 152);
  a2[1] = *(_QWORD *)(a1 + 160);
  *(_DWORD *)(a1 + 136) = 1;
  IvtIommuSendCommand((_QWORD *)a1, a2, 1i64);
  v9 = 0;
  while( 1 )
  {
    result = *(unsigned int *)(a1 + 136);
    if( !(_DWORD)result )
      break;
    if( (++v9 & dword_140C4A13C) != 0 || !qword_140C4A140 )
      _mm_pause();
    else
      qword_140C4A140(v9, v7, v8);
  }
  if( !v4 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  return result;
}

Referenced by:

IvtFlushTbInternal
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries