HalpTimerEnableHypervisorTimer

VOID __stdcall HalpTimerEnableHypervisorTimer(){
  unsigned int *v0; 
  __int64 v1; 
  bool v2; 
  unsigned int v3; 
  unsigned int v4; 
  unsigned __int8 v5; 
  _KINTERRUPT_MODE v6; 
  unsigned __int64 v7; 
  NTSTATUS v8; 
  _INTERRUPT_LINE Line; 
  UINT64 Flags; 
  char Destination[12]; 
  int v12; 
  __int128 *v13; 
  __int128 v14; 

  *(_QWORD *)&Destination[4] = 0i64;
  v12 = 0;
  Line = 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( HalpInterruptGsiToLine(v0[22], &Line) < 0 )
          return;
      }
      else if( (v3 & 0x100) != 0 )
      {
        v4 = v0[21];
        if( v4 >= 8 )
        {
          Line.UnitId = 45057;
          v4 -= 8;
        }
        else
        {
          Line.UnitId = 45056;
        }
        Line.Line = v4;
      }
      Flags = 0x1FFFFFFFFi64;
      v13 = &v14;
      *(_DWORD *)Destination = 3;
      v5 = HalpAcquireHighLevelLock(&qword_140C49C40);
      LOBYTE(v6) = 15;
      v7 = v5;
      v8 = HalpInterruptSetLineState(
             &Line,
             (PVOID)0xFB,
             v6,
             (_KINTERRUPT_POLARITY)v0[24],
             (_KINTERRUPT_POLARITY)v0[23],
             (_INTERRUPT_LINE *)Destination,
             (UINT64)&Flags);
      KxReleaseSpinLock(&qword_140C49C40);
      __writecr8(v7);
      v2 = v8 < 0;
    }
    if( !v2 )
      ((void(*)(void))qword_140C4A188)();
  }
}

Referenced by:

HalpAcpiPostSleep
HalpTimerInitializeHypervisorTimer