HsaUpdateDeviceTableEntry

INT64 __fastcall HsaUpdateDeviceTableEntry(
        UINT64 *a1,
        UINT64 a2,
        INT64 a3,
        CHAR a4,
        INT64 a5,
        UINT8 *a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        INT64 a10){
  UINT64 v11; 
  __int128 v12; 
  CHAR v13; 
  unsigned __int64 v14; 
  UINT64 v15; 
  int v16; 
  int v17; 
  __int16 BlockedDomain; 
  __int128 v19; 
  __int128 v20; 
  unsigned __int8 v21; 
  INT64 v23; 
  char v24; 
  INT64 v25; 
  UINT64 v26; 
  __int64 v27; 
  __int128 v28; 
  INT64 v29[2]; 
  INT64 v30[2]; 
  v11 = a1[3] + 32i64 * (unsigned int)a2;
  LODWORD(v25) = a2;
  v24 = 0;
  v27 = 0x10000i64;
  v12 = *(_OWORD *)(v11 + 16);
  *(_OWORD *)v29 = *(_OWORD *)v11;
  *(_OWORD *)v30 = v12;
  if( (v29[0] & 1) != 0 && !(_DWORD)a7 )
  {
    v27 = LOWORD(v29[1]);
    v24 = 1;
  }
  v13 = 0;
  v14 = 0i64;
  if( a4 )
  {
    if( (v29[0] & 0x80000000000000i64) != 0 )
    {
      v13 = 1;
      v14 = (v29[1] & 0xFFFF0000 | ((v29[1] & 0xFFFFF80000FFFFFFui64 | ((unsigned __int64)v29[0] >> 34) & 0x7000000) >> 11)) >> 13;
    }
  }
  else if( a3 )
  {
    v13 = 1;
    v14 = (unsigned __int64)MmGetPhysicalAddress(*(PVOID *)(a3 + 40)).QuadPart >> 12;
  }
  v15 = 0i64;
  v26 = 0i64;
  if( a5 )
  {
    v17 = *(_DWORD *)(a5 + 4);
    if( v17 == 1 )
    {
      BlockedDomain = HsaGetBlockedDomain((INT64)a1, &v25, &v26);
      v15 = v26;
      LOWORD(v16) = BlockedDomain;
    }
    else
    {
      v16 = *(_DWORD *)(a5 + 24);
      if( v17 == 2 )
      {
        v15 = *(_QWORD *)(a5 + 16) >> 12;
        goto LABEL_17;
      }
    }
  }
  else
  {
    LOWORD(v16) = v29[1];
    if( (v29[0] & 0xE00) == 2048i64 )
    {
      v17 = 2;
      v15 = v29[0] << 12 >> 24;
LABEL_17:
      v26 = v15;
      goto LABEL_18;
    }
    v17 = 0;
  }
LABEL_18:
  LODWORD(v23) = v17;
  HsaBuildDeviceTableEntry((INT64)a1, v14, v13, v16, v23, v15, (INT64)v30, 0i64, (INT64)v29);
  *((_QWORD *)&v19 + 1) = *(_QWORD *)(v11 + 8);
  *(_QWORD *)&v28 = *(_QWORD *)v11;
  *(_QWORD *)&v19 = v28;
  *((_QWORD *)&v28 + 1) = *((_QWORD *)&v19 + 1);
  do
  {
    v20 = v19;
    v21 = _InterlockedCompareExchange128((volatile signed __int64 *)v11, v29[1], v29[0], (signed __int64 *)&v20);
    v19 = v20;
    v28 = v20;
  }
  while( !v21 );
  if( v24 )
    *(_QWORD *)&v19 = HsaInvalidateDTE(a1, v25, (UINT8 *)(unsigned int)a6);
  if( a10 )
  {
    *(_QWORD *)&v19 = v27;
    *(_QWORD *)a10 = v27;
  }
  return v19;
}

Referenced by:

HalpHsapInitializeReservedDomain
HsaAttachDeviceDomainInternal
HsaProcessDeviceExceptions
HsaSetDevicePasidTable