HalpBlkPoReadPerfIoPort

INT64 __fastcall HalpBlkPoReadPerfIoPort(UINT64 P3, INT16 a2, INT16 a3, _DWORD *a4){
  ULONG_PTR v5; 
  __int64 v8; 
  unsigned __int8 v9; 
  unsigned __int64 v10; 
  int v11; 
  __int64(__fastcall *v12)(_QWORD, int *, __int128 *, __int64, int *); 
  int v13; 
  int v15[2]; 
  int v16[2]; 
  __int128 v17; 
  __int64 v18; 
  int v19; 
  v5 = (unsigned int)P3;
  v8 = *(_QWORD *)(HalpBlkPcr + 8i64 * (unsigned int)P3);
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(v8 + 2216), a2);
  v10 = v9;
  HalpBlkPoBusyWait(3ui64, (unsigned int)v5, v8 + 2216);
  *(_QWORD *)(v8 + 2240) = 0i64;
  *(_QWORD *)(v8 + 2248) = 0i64;
  *(_WORD *)(v8 + 2238) = a3;
  *(_DWORD *)(v8 + 2228) = 1;
  *(_DWORD *)(v8 + 2232) = 2;
  *(_WORD *)(v8 + 2236) = a2;
  _InterlockedExchange((volatile __int32 *)(v8 + 2224), 1);
  v11 = *(_DWORD *)(v8 + 20);
  v15[0] = -1;
  v18 = 0i64;
  v17 = 0i64;
  DWORD2(v17) = v11;
  LODWORD(v17) = 4;
  v15[1] = 1;
  v16[1] = *(_DWORD *)(HalpInterruptIpiLines + 20);
  v16[0] = *(_DWORD *)(HalpInterruptIpiLines + 16);
  v12 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, __int64, int *))(HalpInterruptController + 120);
  _disable();
  v13 = v12(*(_QWORD *)(HalpInterruptController + 16), v16, &v17, 225i64, v15);
  if( (v19 & 0x200) != 0 )
    _enable();
  if( v13 < 0 )
    KeBugCheckEx(0x1DAu, 4ui64, 3ui64, v5, v8 + 2216);
  HalpBlkPoBusyWait(3ui64, (unsigned int)v5, v8 + 2216);
  *a4 = *(_DWORD *)(v8 + 2240);
  KxReleaseSpinLock((UINT64 *)(v8 + 2216));
  __writecr8(v10);
  return(unsigned int)v13;
}

Referenced by:

No references.