HalpTimerEnableHypervisorTimer

VOID __stdcall HalpTimerEnableHypervisorTimer(){
  unsigned int *v0; 
  __int64 v1; 
  bool v2; 
  unsigned int v3; 
  unsigned int v4; 
  unsigned __int64 v5; 
  int v6; 
  unsigned int v7; 
  __int64 v8; 
  int v9[2]; 
  int v10; 
  __int64 v11; 
  int v12; 
  __int128 *v13; 
  __int128 v14; 
  v11 = 0i64;
  v12 = 0;
  v8 = 0i64;
  v0 = (unsigned int *)HalpHypervisorHpet;
  v14 = 0i64;
  if( HalpHypervisorHpet
    && (*((int(__fastcall **)(_QWORD))HalpHypervisorHpet + 13))(*((_QWORD *)HalpHypervisorHpet + 9)) >= 0 )
  {
    if( (v0[46] & 0x10) != 0 )
    {
      LOBYTE(v1) = 1;
      v2 = (*((int(__fastcall **)(_QWORD, __int64, _QWORD, _QWORD))v0 + 19))(
             *((_QWORD *)v0 + 9),
             v1,
             *((_QWORD *)v0 + 29),
             v0[60]) < 0;
    }
    else
    {
      v3 = v0[56];
      if( (v3 & 0x200) != 0 )
      {
        if( (int)HalpInterruptGsiToLine(v0[22], &v8) < 0 )
          return;
      }
      else if( (v3 & 0x100) != 0 )
      {
        v4 = v0[21];
        if( v4 >= 8 )
        {
          LODWORD(v8) = 45057;
          v4 -= 8;
        }
        else
        {
          LODWORD(v8) = 45056;
        }
        HIDWORD(v8) = v4;
      }
      v9[0] = -1;
      v13 = &v14;
      v10 = 3;
      v9[1] = 1;
      v5 = (unsigned __int8)HalpAcquireHighLevelLock(&HalpInterruptLock);
      v6 = HalpInterruptSetLineState(&v8, 0xFBu, 15, v0[24], v0[23], (__int64)&v10, (__int64)v9, v7);
      KxReleaseSpinLock(&HalpInterruptLock);
      __writecr8(v5);
      v2 = v6 < 0;
    }
    if( !v2 )
      ((void(*)(void))qword_140C4A188)();
  }
}

Referenced by:

HalpAcpiPostSleep
HalpTimerInitializeHypervisorTimer