HsaGetPageFault

INT64 __fastcall HsaGetPageFault(
        UINT64 *a1,
        UINT16 *BugCheckParameter2,
        _DWORD *a3,
        _QWORD *a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  UINT64 v8; 
  _QWORD *v11; 
  UINT64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  _OWORD *v17; 
  int v18; 
  int v19; 
  int v20; 
  ULONG_PTR v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  unsigned __int64 v26; 
  signed __int32 v27[8]; 
  ULONG_PTR BugCheckParameter4; 
  UINT64 v29; 
  v8 = a1[12];
  v11 = (_QWORD *)*a1;
  v29 = v8;
  v12 = a1[14] >> 4;
  while( 1 )
  {
    while( 1 )
    {
      v13 = v11[1028];
      v14 = v11[1030];
      v15 = v14 >> 4;
      v16 = (v14 >> 4) & 0x7FFF;
      if( v16 == ((v11[1031] >> 4) & 0x7FFFi64) )
        break;
      v17 = (_OWORD *)(v8 + 16 * v16);
      v18 = (v15 & 0x7FFF) + 1;
      v19 = 0;
      *(_OWORD *)BugCheckParameter2 = *v17;
      if( !*(_QWORD *)BugCheckParameter2 )
      {
        do
        {
          if( *((_QWORD *)BugCheckParameter2 + 1) )
            break;
          KeStallExecutionProcessor(0xAu);
          if( (unsigned int)++v19 > 0x186A0 )
            KeBugCheckEx(
              0x159u,
              0x2000ui64,
              (ULONG_PTR)BugCheckParameter2,
              *(_QWORD *)BugCheckParameter2,
              *((_QWORD *)BugCheckParameter2 + 1));
          *(_OWORD *)BugCheckParameter2 = *v17;
        }
        while( !*(_QWORD *)BugCheckParameter2 );
        v18 = (v15 & 0x7FFF) + 1;
        v8 = v29;
        if( v19 )
          ++AmdErrataPprWriteOrderMitigated;
      }
      *v17 = 0i64;
      v20 = 0;
      if( v18 != (_DWORD)v12 )
        v20 = v15 + 1;
      v11[1030] = v14 ^ ((unsigned int)v14 ^ (16 * v20)) & 0x7FFF0;
      _InterlockedOr(v27, 0);
      v21 = *(_QWORD *)BugCheckParameter2;
      if( *(_QWORD *)BugCheckParameter2 >> 60 == 1 && (v21 & 0x40000000000000i64) != 0 )
      {
        if( (v21 & 0x24020000000000i64) != 0x20000000000i64 )
        {
          *a3 = BugCheckParameter2[1];
          *(_WORD *)a5 = HIDWORD(*(_QWORD *)BugCheckParameter2) & 0x1FF;
          *(_DWORD *)a6 = 0;
          *(_QWORD *)a7 = *((_QWORD *)BugCheckParameter2 + 1);
          *a4 = (unsigned __int16)*(_DWORD *)BugCheckParameter2;
          v22 = (2 * ((*(_QWORD *)BugCheckParameter2 >> 53) & 1i64)) | 1;
          if( (*(_QWORD *)BugCheckParameter2 & 0x4000000000000i64) == 0 )
            v22 = 2 * ((*(_QWORD *)BugCheckParameter2 >> 53) & 1i64);
          v23 = v22 | 4;
          if( (*(_QWORD *)BugCheckParameter2 & 0x2000000000000i64) == 0 )
            v23 = v22;
          v24 = v23 | 0x10;
          if( (*(_QWORD *)BugCheckParameter2 & 0x20000000000i64) == 0 )
            v24 = v23;
          *(_QWORD *)a8 = v24;
          return 1i64;
        }
      }
      else
      {
        LODWORD(BugCheckParameter4) = 0;
        HsaDismissPageFault(a1, BugCheckParameter2, 3221225473i64);
        v8 = v29;
      }
    }
    if( (v13 & 0x20) == 0 )
      break;
    if( (v13 & 0x80u) == 0i64 )
    {
      v26 = v11[3] & 0xFFFFFFFFFFFFDFFFui64;
      v11[3] = v26;
      _InterlockedOr(v27, 0);
      v11[1028] = 32i64;
      _InterlockedOr(v27, 0);
      v11[3] = v26 | 0x6000;
      _InterlockedOr(v27, 0);
      *a3 = -1;
      *(_WORD *)a5 = -1;
      *(_DWORD *)a6 = 0;
      *(_QWORD *)a7 = 0i64;
      *(_QWORD *)a8 = 64i64;
      *a4 = 0i64;
      return 1i64;
    }
    while( (v11[1028] & 0x80u) != 0i64 )
      ;
  }
  return 0i64;
}

Referenced by:

No references.