HalpTimerInitializeHypervisorTimer

VOID __stdcall HalpTimerInitializeHypervisorTimer(){
  INT64 *Timer; 
  void *v1; 
  void *v2; 
  void *v3; 
  INT64 v4; 
  INT64 v5; 
  INT64 v6; 
  NTSTATUS v7; 
  INT64 v8; 
  char v9; 
  unsigned int *v10; 
  _KINTERRUPT_MODE v11; 
  _KINTERRUPT_POLARITY v12; 
  __int64 v13; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  _REGISTERED_INTERRUPT_CONTROLLER *v17; 
  BOOL v18; 
  _INTERRUPT_LINE Line; 
  _KINTERRUPT_MODE TriggerMode; 
  _KINTERRUPT_POLARITY Polarity; 
  INT64 v22; 
  _INTERRUPT_LINE_STATE LineState; 
  __int128 v24; 

  v22 = 0i64;
  v24 = 0i64;
  Line = 0i64;
  v18 = 0;
  if( (unsigned __int8)HalpIsPartitionCpuManager() )
  {
    if( qword_140C4A180 )
    {
      if( (EAX(__cpuid(1073741830, 0)) & 0x100) != 0 )
      {
        Timer = HalpFindTimer(3, 32, 24576, 3840, 0);
        v4 = (INT64)Timer;
        if( Timer )
        {
          if( (int)HalpTimerInitialize((INT64)Timer, v1, v2, v3) >= 0 )
          {
            *(_DWORD *)(v4 + 184) |= 4u;
            HalpHypervisorHpet = (PVOID)v4;
            v7 = HalpTimerTestHypervisorTimer(v4, &v18, v5, v6);
            HalpHypervisorHpet = 0i64;
            if( v7 >= 0 )
            {
              v9 = 0;
              v10 = *(unsigned int **)(v4 + 72);
              v11 = Latched;
              v12 = InterruptPolarityUnknown;
              if( v18 )
              {
                HalpHvBuildDeviceId(v8, (INT64 *)(*(_QWORD *)(v4 + 288) + 8i64), 0, (INT64)&v22);
              }
              else
              {
                v14 = *(_DWORD *)(v4 + 224);
                if( (v14 & 0x200) != 0 )
                {
                  if( HalpInterruptGsiToLine(*(unsigned int *)(v4 + 88), &Line) < 0 )
                    return;
                  v9 = *((_BYTE *)v10 + 4);
                }
                else if( (v14 & 0x100) != 0 )
                {
                  v15 = *(_DWORD *)(v4 + 84);
                  if( v15 >= 8 )
                  {
                    Line.UnitId = 45057;
                    v15 -= 8;
                  }
                  else
                  {
                    Line.UnitId = 45056;
                  }
                  Line.Line = v15;
                }
                TriggerMode = *(_DWORD *)(v4 + 96);
                Polarity = *(_DWORD *)(v4 + 92);
                HalpInterruptApplyOverrides(&Line, &Polarity, &TriggerMode);
                v11 = TriggerMode;
                v12 = Polarity;
                v22 = 0x8000000000000000ui64;
                LOBYTE(v22) = Line.UnitId;
              }
              LOBYTE(v13) = v9;
              if( (int)((__int64(__fastcall *)(_QWORD, _QWORD, INT64, __int64, __int128 *))qword_140C4A180)(
                          *((_QWORD *)v10 + 3),
                          *v10,
                          v22,
                          v13,
                          &v24) >= 0 )
              {
                if( v18 )
                {
                  *(_DWORD *)(v4 + 236) = 0;
                  *(_DWORD *)(v4 + 232) = DWORD2(v24);
                  *(_QWORD *)(v4 + 240) = HIDWORD(v24);
                  v16 = *(_DWORD *)(v4 + 184) | 0x10;
LABEL_26:
                  HalpHypervisorHpet = (PVOID)v4;
                  *(_DWORD *)(v4 + 184) = v16 | 0x40;
                  HalpTimerEnableHypervisorTimer();
                  return;
                }
                LineState.Routing.UnitId = -1;
                LineState.ProcessorTarget.8 = ($B39C36E67A513536CAB27D38BFD6BBE3)*((unsigned __int64 *)&v24 + 1);
                *(_DWORD *)&LineState.EmulateActiveBoth = 0;
                *(_QWORD *)&LineState.ProcessorTarget.Target = 8i64;
                *(_QWORD *)&LineState.Vector = 251i64;
                LineState.Polarity = v12;
                LineState.TriggerMode = v11;
                LineState.Flags = 0;
                LineState.Routing.Line = 1;
                v17 = HalpInterruptLookupController(Line.UnitId);
                if( !v17 )
                {
                  *(&CmpDummyThreadEvent + 1789) = 17;
                  return;
                }
                if( HalpInterruptSetRemappedLineStateInternal(v17, &Line, &LineState) >= 0 )
                {
                  v16 = *(_DWORD *)(v4 + 184) & 0xFFFFFFEF;
                  goto LABEL_26;
                }
              }
            }
          }
        }
      }
    }
  }
}

Referenced by:

No references.