HalpHpetDiscover

NTSTATUS __stdcall HalpHpetDiscover(){
  _LARGE_INTEGER *AcpiTable; 
  INT64 v1; 
  _LARGE_INTEGER *v2; 
  UINT8 v3; 
  unsigned int *v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned __int64 v7; 
  int v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned __int64 v11; 
  unsigned int *v12; 
  INT64 v13; 
  int v14; 
  unsigned int v15; 
  unsigned int Capabilities; 
  NTSTATUS v17; 
  CHAR v18; 
  int v20; 
  unsigned __int8 v21; 
  signed __int32 v22[8]; 
  CHAR v23[4]; 
  unsigned int v24; 
  _TIMER_INITIALIZATION_BLOCK NewTimer; 
  unsigned __int64 v26; 
  UINT64 v27; 
  unsigned __int64 v28; 
  __int128 v29[2]; 
  __int64 v30; 

  v23[0] = 0;
  v23[1] = 0;
  memset(v29, 0, sizeof(v29));
  v30 = 0i64;
  AcpiTable = HalSocGetAcpiTable(0x54455048ui64);
  v2 = AcpiTable;
  if( AcpiTable )
  {
    if( !LOBYTE(AcpiTable[5].anonymous_0.LowPart) && HalSocRequestConfigurationData(1i64, v1, &v23[1]) >= 0 )
    {
      *(&CmpDummyThreadEvent + 537) = *(LONGLONG *)((char *)&v2[5].QuadPart + 4);
      if( !*(&CmpDummyThreadEvent + 1075) || v23[1] )
      {
        v27 = HalMapIoSpace(*(&CmpDummyThreadEvent + 537), 0x400ui64, MmNonCached, v3);
        v4 = (unsigned int *)v27;
        if( v27 )
        {
          if( HalRegisterPermanentAddressUsage(*(&CmpDummyThreadEvent + 537), 0x400u) >= 0 )
          {
            v5 = *v4;
            v6 = HIWORD(*v4);
            if( v6 )
            {
              if( v6 != 0xFFFF )
              {
                if( (v5 & 0x8000) != 0 )
                  byte_140C507B8 = 1;
                v7 = (((unsigned __int64)v4[1] >> 1) + 1000000000000000i64) / v4[1];
                v28 = v7;
                if( v6 != 4318 )
                {
                  v8 = 1;
                  v9 = 0;
                  v10 = ((v5 >> 8) & 0x1F) + 1;
                  if( !v10 )
                    goto LABEL_27;
                  v11 = (unsigned int)v7;
                  v12 = v4 + 64;
                  v26 = (unsigned int)v7;
                  while( 1 )
                  {
                    memset(&NewTimer, 0i64, sizeof(NewTimer));
                    v30 = 0i64;
                    NewTimer.InternalData = v29;
                    NewTimer.Header.TableVersion = 1;
                    NewTimer.FunctionTable.Initialize = (PLONG)HalpHpetInitialize;
                    NewTimer.Header.TableSize = 144;
                    NewTimer.FunctionTable.AcknowledgeInterrupt = HalpHpetAcknowledgeInterrupt;
                    NewTimer.FunctionTable.ArmTimer = (PLONG)HalpHpetArmTimer;
                    NewTimer.FunctionTable.Stop = HalpHpetStop;
                    memset((char *)v29 + 4, 0, 20);
                    v14 = (v9 + 1) | (BYTE4(v2[6].QuadPart) << 16);
                    NewTimer.CounterBitWidth = 31;
                    NewTimer.Identifier = v14;
                    *((_QWORD *)&v29[1] + 1) = *(&CmpDummyThreadEvent + 537);
                    NewTimer.CounterFrequency = v11;
                    NewTimer.InternalDataSize = 40;
                    NewTimer.Interrupt.Mode = Latched;
                    NewTimer.Interrupt.Polarity = InterruptActiveHigh;
                    NewTimer.KnownType = TimerHpet;
                    NewTimer.MaxDivisor = 1;
                    v24 = v9 + 1;
                    LODWORD(v29[0]) = v9;
                    NewTimer.Capabilities = 48;
                    v15 = *v12 & 0xFFFFBFFB;
                    *v12 = v15;
                    _InterlockedOr(v22, 0);
                    if( (v15 & 0x10) != 0 )
                    {
                      Capabilities = 112;
                      BYTE12(v29[0]) = 1;
                      NewTimer.Capabilities = 112;
                    }
                    else
                    {
                      Capabilities = NewTimer.Capabilities;
                    }
                    if( (v15 & 0x20) != 0 )
                    {
                      *v12 = v15 | 0x100;
                      _InterlockedOr(v22, 0);
                      v15 = *v12;
                      if( (*v12 & 0x100) == 0 )
                        goto LABEL_25;
                      Capabilities = NewTimer.Capabilities;
                    }
                    LODWORD(v30) = v15;
                    if( byte_140C507B8 )
                    {
                      v17 = HalSocRequestConfigurationData(2i64, v13, v23);
                      v18 = v23[0];
                      if( v17 < 0 )
                        v18 = 0;
                      v23[0] = v18;
                      if( !v9 )
                      {
                        Capabilities |= 0x100u;
                        NewTimer.Interrupt.LegacyIrq = v18 == 0 ? 2 : 0;
                        v8 |= 4u;
LABEL_31:
                        NewTimer.Capabilities = Capabilities;
LABEL_23:
                        if( (Capabilities & 0xF00) != 0 )
                          HalpTimerRegister(&NewTimer, 0i64);
                        goto LABEL_25;
                      }
                      if( v9 == 1 )
                      {
                        NewTimer.Interrupt.LegacyIrq = 8;
                        Capabilities |= 0x100u;
                        v8 |= 0x100u;
                        goto LABEL_31;
                      }
                      if( (v15 & 0x8000) != 0 )
                        goto LABEL_23;
                    }
                    else
                    {
                      v20 = ~v8 & v12[1];
                      if( v20 )
                      {
                        v21 = 0;
                        while( ((1 << v21) & v20) == 0 )
                        {
                          if( ++v21 >= 0x20u )
                          {
                            LOWORD(Capabilities) = NewTimer.Capabilities;
                            goto LABEL_23;
                          }
                        }
                        Capabilities = NewTimer.Capabilities | 0x200;
                        NewTimer.Interrupt.Gsi = v21 + (unsigned __int16)HalpHpetGsiOffset;
                        v8 |= 1 << v21;
                        BYTE4(v29[0]) = v21;
                        goto LABEL_31;
                      }
                    }
LABEL_25:
                    v9 = v24;
                    v12 += 8;
                    v11 = v26;
                    if( v24 >= v10 )
                    {
                      v4 = (unsigned int *)v27;
                      goto LABEL_27;
                    }
                  }
                }
                byte_140C507B8 = 0;
LABEL_27:
                memset(&NewTimer, 0i64, sizeof(NewTimer));
                NewTimer.Header.TableVersion = 1;
                v30 = 0i64;
                NewTimer.CounterFrequency = (unsigned int)v28;
                memset(v29, 0, sizeof(v29));
                LODWORD(v29[0]) = -1;
                NewTimer.InternalData = v29;
                NewTimer.FunctionTable.Initialize = (PLONG)HalpHpetInitialize;
                NewTimer.FunctionTable.QueryCounter = (PULONG64)HalpHpetQueryCounter;
                NewTimer.FunctionTable.AcknowledgeInterrupt = HalpHpetAcknowledgeInterrupt;
                NewTimer.FunctionTable.ArmTimer = (PLONG)HalpHpetArmTimer;
                NewTimer.Identifier = BYTE4(v2[6].QuadPart) << 16;
                NewTimer.Header.TableSize = 144;
                NewTimer.CounterBitWidth = 32;
                NewTimer.InternalDataSize = 40;
                NewTimer.KnownType = TimerHpet;
                NewTimer.MaxDivisor = 1;
                NewTimer.Capabilities = 2;
                HalpTimerRegister(&NewTimer, 0i64);
              }
            }
          }
          HalpUnmapVirtualAddress(v4, 1i64, 0);
        }
      }
    }
  }
  return 0;
}

Referenced by:

HalpTimerRegisterBuiltinPlugins