HalpNumaInitializeStaticConfiguration

VOID __stdcall HalpNumaInitializeStaticConfiguration(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  _LOADER_PARAMETER_BLOCK *v1; 
  unsigned int v2; 
  unsigned int v3; 
  unsigned int v4; 
  _DWORD *v5; 
  unsigned __int64 i; 
  __int64 v7; 
  __int64 v8; 
  unsigned int v9; 
  unsigned int v10; 
  char v11; 
  ULONG v12; 
  _ACPI_SRAT_ENTRY *v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  __int64 Length; 
  UCHAR v17; 
  int ProximityDomainLow; 
  __int64 v19; 
  __int64 v20; 
  unsigned int v21; 
  int LowPart; 
  unsigned __int64 v23; 
  ULONGLONG v24; 
  __int64 v25; 
  __int64 v26; 
  ULONG ClockDomain; 
  int v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  unsigned int v32; 
  __int64 v33; 
  __int64 v34; 
  unsigned int v35; 
  unsigned int v36; 
  _LARGE_INTEGER *Table; 
  _LARGE_INTEGER *v38; 
  unsigned int HighPart; 
  __int64 v40; 
  unsigned int v41; 
  unsigned int v42; 
  unsigned int v43; 
  int v44; 
  unsigned int v45; 
  unsigned int v46; 
  __int16 v47; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  unsigned int *NumaLocalityInfo; 
  __int64 v52; 
  unsigned int *v53; 
  unsigned int v54; 
  unsigned int *v55; 
  int v56; 
  unsigned int v57; 
  _QWORD *v58; 
  unsigned int v59; 
  int v60; 
  unsigned int v61; 
  unsigned int v62; 
  unsigned int j; 
  __int16 v64; 
  __int64 v65; 
  __int64 v66; 
  __int64 v67; 
  unsigned int v68; 
  unsigned int v69; 
  unsigned int v70; 
  __int64 v71; 
  __int64 v72; 
  __int64 v73; 
  unsigned int v74; 
  unsigned int v75; 
  int v76; 
  __int64 v77; 
  NTSTATUS AvailableProximityId; 
  __int64 v79; 
  NTSTATUS v80; 
  __int64 v81; 
  unsigned int v82; 
  int v83; 
  int v84; 
  __int64 v85; 
  __int64 v86; 
  __int64 v87; 
  __int64 v88; 
  __int64 v89; 
  UINT64 v90; 
  INT64 *v91; 
  UINT64 *ProximityId; 
  UINT64 *NodeCapacity; 
  UINT64 MemoryRangeCount; 
  __int64 NodeCount[2]; 
  unsigned __int8 v97; 
  UINT64 ChannelCount; 

  LODWORD(ChannelCount) = 0;
  LODWORD(NodeCount[0]) = 0;
  v1 = LoaderBlock;
  MemoryRangeCount = 0i64;
  *(&CmpDummyThreadEvent + 6996) = 1;
  HalpAcpiMpst = (__int64)HalpAcpiGetTable(LoaderBlock, (const UINT8 *)0x5453504D, 0i64);
  *(&CmpDummyThreadEvent + 869) = HalpAcpiGetTable(v1, (const UINT8 *)0x54415253, 0i64);
  *(&CmpDummyThreadEvent + 877) = HalpAcpiGetTable(v1, (const UINT8 *)0x5443534D, 0i64);
  if( !*(&CmpDummyThreadEvent + 869) )
  {
    HalpInitializeConfigurationFromMadt(v1);
    return;
  }
  v97 = *(_BYTE *)(*(&CmpDummyThreadEvent + 869) + 8i64);
  if( (unsigned __int8)HalpGetNumaProcMemoryCount(
                          (UINT64 *)NodeCount,
                          (UINT64 *)((char *)&MemoryRangeCount + 4),
                          &MemoryRangeCount,
                          &ChannelCount) )
  {
    v2 = HIDWORD(MemoryRangeCount);
    LODWORD(v90) = ChannelCount;
    HalpAllocateNumaConfigData(
      v1,
      LODWORD(NodeCount[0]),
      HIDWORD(MemoryRangeCount),
      (unsigned int)MemoryRangeCount,
      v90);
    if( *(&CmpDummyThreadEvent + 876) )
    {
      v3 = 0;
      if( v2 )
      {
        if( v2 >= 4
          && (**(&CmpDummyThreadEvent + 876) > *(&CmpDummyThreadEvent + 876)
           || **(&CmpDummyThreadEvent + 876) + 4 * (unsigned __int64)(v2 - 1) < *(&CmpDummyThreadEvent + 876)) )
        {
          v4 = v2 & 0xFFFFFFFC;
          do
            v3 += 4;
          while( v3 < v4 );
          v5 = (_DWORD *)**(&CmpDummyThreadEvent + 876);
          for( i = (16 * ((unsigned __int64)v4 >> 2)) >> 2; i; --i )
            *v5++ = -1;
        }
        if( v3 < v2 )
        {
          v7 = 4i64 * v3;
          v8 = v2 - v3;
          do
          {
            *(_DWORD *)(v7 + **(&CmpDummyThreadEvent + 876)) = -1;
            v7 += 4i64;
            --v8;
          }
          while( v8 );
        }
      }
      v9 = 0;
      v10 = 0;
      v11 = 0;
      v12 = 0;
      v13 = (_ACPI_SRAT_ENTRY *)(*(&CmpDummyThreadEvent + 869) + 48i64);
      v14 = *(&CmpDummyThreadEvent + 869) + *(unsigned int *)(*(&CmpDummyThreadEvent + 869) + 4i64);
      if( *(&CmpDummyThreadEvent + 869) + 50i64 <= v14 )
      {
        v15 = *(&CmpDummyThreadEvent + 876);
        while( 1 )
        {
          Length = v13->Length;
          if( (unsigned __int8)Length < 2u || (unsigned __int64)v13 + Length > v14 )
          {
LABEL_57:
            v1 = LoaderBlock;
            goto LABEL_58;
          }
          if( (unsigned __int8)HalpVerifySratEntryLengthAndFlag(v13) )
            break;
LABEL_56:
          v13 = (_ACPI_SRAT_ENTRY *)((char *)v13 + v17);
          if( (unsigned __int64)&v13->ApicAffinity > v14 )
            goto LABEL_57;
        }
        if( *(_BYTE *)(*(&CmpDummyThreadEvent + 869) + 8i64) == 1 )
        {
          ProximityDomainLow = v13->ApicAffinity.ProximityDomainLow;
        }
        else if( v13->Type )
        {
          if( v13->Type == 2 )
            ProximityDomainLow = v13->X2ApicAffinity.ProximityDomain;
          else
            ProximityDomainLow = v13->MemoryAffinity.ProximityDomain;
        }
        else
        {
          ProximityDomainLow = v13->ApicAffinity.ProximityDomainLow
                             + ((v13->ApicAffinity.ProximityDomainHigh[0]
                               + ((v13->ApicAffinity.ProximityDomainHigh[1]
                                 + (v13->ApicAffinity.ProximityDomainHigh[2] << 8)) << 8)) << 8);
        }
        v19 = *(&CmpDummyThreadEvent + 876);
        v20 = 0i64;
        v21 = *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 56i64);
        if( v21 )
        {
          do
          {
            if( ProximityDomainLow == *(_DWORD *)(*(_QWORD *)(v15 + 24) + 4 * v20) )
              break;
            v20 = (unsigned int)(v20 + 1);
          }
          while( (unsigned int)v20 < v21 );
        }
        if( (_DWORD)v20 == v21 )
        {
          *(_DWORD *)(*(_QWORD *)(v15 + 24) + 4 * v20) = ProximityDomainLow;
          *(_DWORD *)(*(_QWORD *)(*(&CmpDummyThreadEvent + 876) + 32i64) + 4 * v20) = ProximityDomainLow;
          ++*(_DWORD *)(v19 + 56);
        }
        switch( v13->Type )
        {
          case 0u:
            goto LABEL_125;
          case 1u:
            v23 = (unsigned __int64)v13->MemoryAffinity.Base.QuadPart >> 12;
            v24 = v13->MemoryAffinity.Length >> 12;
            if( v23 < HalpMinNumaPage )
              HalpMinNumaPage = (unsigned __int64)v13->MemoryAffinity.Base.QuadPart >> 12;
            if( v24 + v23 - 1 > *(&CmpDummyThreadEvent + 867) )
              *(&CmpDummyThreadEvent + 867) = v24 + v23 - 1;
            *(&CmpDummyThreadEvent + 871) += v24;
            v25 = 2i64 * v10++;
            *(_QWORD *)(*(&CmpDummyThreadEvent + 866) + 8 * v25) = v23;
            *(_DWORD *)(*(&CmpDummyThreadEvent + 866) + 8 * v25 + 8) = ProximityDomainLow;
            break;
          case 2u:
LABEL_125:
            if( v13->Type )
            {
              LowPart = v13->MemoryAffinity.Base.anonymous_0.LowPart;
            }
            else
            {
              LowPart = v13->ApicAffinity.ApicId;
              if( LowPart == 255 )
                LowPart = -1;
            }
            v26 = *(&CmpDummyThreadEvent + 876);
            *(_DWORD *)(**(&CmpDummyThreadEvent + 876) + 4i64 * v9) = LowPart;
            *(_DWORD *)(*(_QWORD *)(v26 + 16) + 4i64 * v9++) = ProximityDomainLow;
            ++*(_DWORD *)(*(_QWORD *)(v26 + 40) + 4 * v20);
            if( v97 >= 3u )
            {
              if( v13->Type )
                ClockDomain = v13->X2ApicAffinity.ClockDomain;
              else
                ClockDomain = v13->ApicAffinity.ClockDomain;
              if( v11 )
              {
                if( v12 != ClockDomain )
                  LODWORD(HalpMaximumClockDomainCount) = 2;
              }
              else
              {
                v11 = 1;
                v12 = ClockDomain;
              }
            }
            break;
        }
        v17 = v13->Length;
        goto LABEL_56;
      }
LABEL_58:
      *(&CmpDummyThreadEvent + 1741) = v10;
      *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 60i64) = v9;
      qsort(
        *(&CmpDummyThreadEvent + 866),
        v10,
        0x10ui64,
        (INT64)HalpNodeCostSort,
        v91,
        (UINT64)ProximityId,
        (UINT64)NodeCapacity);
      v28 = 0;
      if( v10 > 1 )
      {
        v29 = 0i64;
        v30 = v10 - 1;
        v31 = 16i64;
        do
        {
          if( *(_DWORD *)(v29 + *(&CmpDummyThreadEvent + 866) + 8) != *(_DWORD *)(v31
                                                                                 + *(&CmpDummyThreadEvent + 866)
                                                                                 + 8) )
          {
            v29 = 16i64 * (unsigned int)++v28;
            *(_OWORD *)(v29 + *(&CmpDummyThreadEvent + 866)) = *(_OWORD *)(v31 + *(&CmpDummyThreadEvent + 866));
          }
          v31 += 16i64;
          --v30;
        }
        while( v30 );
      }
      v32 = 0;
      v33 = 2i64 * (unsigned int)(v28 + 1);
      *(&CmpDummyThreadEvent + 1741) = v28 + 1;
      *(&CmpDummyThreadEvent + 1748) = v28 + 1;
      *(_QWORD *)(*(&CmpDummyThreadEvent + 866) + 8 * v33) = -1i64;
      *(_DWORD *)(*(&CmpDummyThreadEvent + 866) + 8 * v33 + 8) = 0;
      **(&CmpDummyThreadEvent + 866) = 0i64;
      if( v28 != -1 )
      {
        v34 = *(&CmpDummyThreadEvent + 876);
        do
        {
          v35 = *(_DWORD *)(v34 + 56);
          v36 = 0;
          if( v35 )
          {
            while( *(_DWORD *)(*(&CmpDummyThreadEvent + 866) + 16i64 * v32 + 8) != *(_DWORD *)(*(_QWORD *)(v34 + 24)
                                                                                              + 4i64 * v36) )
            {
              if( ++v36 >= v35 )
                goto LABEL_70;
            }
            *(_DWORD *)(*(&CmpDummyThreadEvent + 866) + 16i64 * v32 + 8) = v36;
          }
LABEL_70:
          ++v32;
        }
        while( v32 < v28 + 1 );
      }
      if( *(&CmpDummyThreadEvent + 877) )
        HalpUpdateConfigurationFromMsct(
          (UINT64 *)(*(&CmpDummyThreadEvent + 876) + 56i64),
          *(unsigned int *)(*(&CmpDummyThreadEvent + 876) + 64i64),
          (UINT64 *)(*(&CmpDummyThreadEvent + 876) + 60i64),
          *(unsigned int *)(*(&CmpDummyThreadEvent + 876) + 68i64),
          &HalpMaximumClockDomainCount,
          *(UINT64 **)(*(&CmpDummyThreadEvent + 876) + 24i64),
          *(UINT64 **)(*(&CmpDummyThreadEvent + 876) + 40i64),
          *(UINT64 **)(*(&CmpDummyThreadEvent + 876) + 16i64));
      Table = HalpAcpiGetTable(v1, (const UINT8 *)0x54494C53, 0i64);
      v38 = Table;
      if( Table )
      {
        HighPart = Table[4].anonymous_0.HighPart;
        if( HighPart * HighPart + 44 > Table->anonymous_0.HighPart )
        {
LABEL_84:
          NumaLocalityInfo = (unsigned int *)v1->Extension->NumaLocalityInfo;
          if( !*(&CmpDummyThreadEvent + 875) )
          {
            if( !NumaLocalityInfo )
              goto LABEL_105;
            v52 = *NumaLocalityInfo;
            v53 = (unsigned int *)(*(&CmpDummyThreadEvent + 876) + 56i64);
            v54 = *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 56i64);
            if( (_DWORD)v52 != v54 )
              goto LABEL_105;
            v55 = &NumaLocalityInfo[v52];
            v56 = 0;
            v57 = 0;
            if( v54 )
            {
              v58 = (_QWORD *)(*(&CmpDummyThreadEvent + 876) + 24i64);
              do
              {
                v59 = *NumaLocalityInfo;
                v60 = 0;
                if( *NumaLocalityInfo )
                {
                  while( NumaLocalityInfo[v60 + 1] != *(_DWORD *)(*v58 + 4i64 * v57) )
                  {
                    if( ++v60 >= v59 )
                      goto LABEL_94;
                  }
                  v56 = v60 * v59;
                }
LABEL_94:
                if( v60 == v59 )
                  goto LABEL_105;
                v61 = 0;
                if( v54 )
                {
                  while( 1 )
                  {
                    v62 = *NumaLocalityInfo;
                    for( j = 0; j < v62; ++j )
                    {
                      if( NumaLocalityInfo[j + 1] == *(_DWORD *)(*v58 + 4i64 * v61) )
                        break;
                    }
                    if( j == v62 )
                      break;
                    v64 = *((_WORD *)v55 + v56 + j + 2);
                    v65 = v61 + v57 * *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 64i64);
                    ++v61;
                    *(_WORD *)(*(_QWORD *)(*(&CmpDummyThreadEvent + 876) + 48i64) + 2 * v65) = v64;
                    if( v61 >= *v53 )
                      goto LABEL_101;
                  }
                  NumaLocalityInfo = 0i64;
                  break;
                }
LABEL_101:
                v66 = v57 * (*(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 64i64) + 1);
                ++v57;
                *(_WORD *)(*(_QWORD *)(*(&CmpDummyThreadEvent + 876) + 48i64) + 2 * v66) = 0;
                v54 = *v53;
              }
              while( v57 < *v53 );
            }
            if( !NumaLocalityInfo )
            {
LABEL_105:
              v67 = *(&CmpDummyThreadEvent + 876);
              v68 = 0;
              v69 = *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 56i64);
              if( v69 )
              {
                do
                {
                  v70 = 0;
                  if( v69 )
                  {
                    do
                    {
                      v71 = v70 + v68 * *(_DWORD *)(v67 + 64);
                      ++v70;
                      *(_WORD *)(*(_QWORD *)(v67 + 48) + 2 * v71) = 1;
                    }
                    while( v70 < *(_DWORD *)(v67 + 56) );
                  }
                  v72 = v68 * (*(_DWORD *)(v67 + 64) + 1);
                  ++v68;
                  *(_WORD *)(*(_QWORD *)(v67 + 48) + 2 * v72) = 0;
                  v69 = *(_DWORD *)(v67 + 56);
                }
                while( v68 < v69 );
              }
            }
          }
          v73 = *(&CmpDummyThreadEvent + 876);
          v74 = 0;
          v75 = *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 56i64);
          if( v75 )
          {
            do
            {
              v76 = HalpMaximumGroupSize;
              v77 = v74;
              if( *(_DWORD *)(*(_QWORD *)(v73 + 40) + 4i64 * v74) > (unsigned int)HalpMaximumGroupSize )
              {
                AvailableProximityId = HalpGetAvailableProximityId();
                v79 = *(&CmpDummyThreadEvent + 876);
                *(_DWORD *)(v73 + 56) = v75 + 1;
                v80 = AvailableProximityId;
                v81 = *(_QWORD *)(v73 + 40);
                v82 = 0;
                v83 = *(_DWORD *)(v81 + 4i64 * v74);
                *(_DWORD *)(v81 + 4i64 * v74) = v76;
                v84 = v83 - v76;
                *(_DWORD *)(*(_QWORD *)(v73 + 40) + 4i64 * v75) = v84;
                *(_DWORD *)(*(_QWORD *)(v79 + 24) + 4i64 * v75) = AvailableProximityId;
                *(_DWORD *)(*(_QWORD *)(v79 + 32) + 4i64 * v75) = *(_DWORD *)(*(_QWORD *)(v79 + 32) + 4i64 * v74);
                if( v75 )
                {
                  do
                  {
                    *(_WORD *)(*(_QWORD *)(v79 + 48) + 2i64 * (v75 + v82 * *(_DWORD *)(v79 + 64))) = *(_WORD *)(*(_QWORD *)(v79 + 48) + 2i64 * (v82 * *(_DWORD *)(v79 + 64) + v74));
                    v85 = v82 + v74 * *(_DWORD *)(v79 + 64);
                    v86 = v82 + v75 * *(_DWORD *)(v79 + 64);
                    ++v82;
                    *(_WORD *)(*(_QWORD *)(v79 + 48) + 2 * v86) = *(_WORD *)(*(_QWORD *)(v79 + 48) + 2 * v85);
                  }
                  while( v82 < v75 );
                  v77 = v74;
                }
                v87 = *(&CmpDummyThreadEvent + 876);
                *(_WORD *)(*(_QWORD *)(*(&CmpDummyThreadEvent + 876) + 48i64)
                         + 2i64 * v75 * (*(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 64i64) + 1)) = 0;
                v88 = (unsigned int)(*(_DWORD *)(v87 + 60) - 1);
                if( *(_DWORD *)(v87 + 60) != 1 )
                {
                  do
                  {
                    if( !v84 )
                      break;
                    v89 = *(_QWORD *)(v87 + 16);
                    if( *(_DWORD *)(v89 + 4 * v88) == *(_DWORD *)(*(_QWORD *)(v79 + 24) + 4 * v77) )
                    {
                      --v84;
                      *(_DWORD *)(v89 + 4 * v88) = v80;
                    }
                    v88 = (unsigned int)(v88 - 1);
                  }
                  while( (_DWORD)v88 );
                }
              }
              v75 = *(_DWORD *)(v73 + 56);
              ++v74;
            }
            while( v74 < v75 );
          }
          if( (_DWORD)HalpMaximumClockDomainCount != 1 )
            HalpTimerPlatformSourceForced = 1;
          HalpChannelInitializeStaticConfiguration();
          return;
        }
        v40 = *(&CmpDummyThreadEvent + 876);
        v41 = 0;
        v42 = *(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 56i64);
        if( v42 )
        {
          do
          {
            v43 = *(_DWORD *)(*(_QWORD *)(v40 + 24) + 4i64 * v41);
            if( v43 >= HighPart )
              goto LABEL_84;
            v44 = HighPart * v43;
            v45 = 0;
            if( v42 )
            {
              do
              {
                v46 = *(_DWORD *)(*(_QWORD *)(v40 + 24) + 4i64 * v45);
                if( v46 >= HighPart )
                  goto LABEL_84;
                v47 = *((unsigned __int8 *)&v38[5].QuadPart + v46 + v44 + 4);
                if( (unsigned __int8)v47 < 0xAu )
                  goto LABEL_84;
                v48 = v45 + v41 * *(_DWORD *)(v40 + 64);
                ++v45;
                *(_WORD *)(*(_QWORD *)(v40 + 48) + 2 * v48) = v47 << 7;
              }
              while( v45 < *(_DWORD *)(v40 + 56) );
            }
            v49 = *(_QWORD *)(v40 + 48);
            v50 = v41 * (*(_DWORD *)(v40 + 64) + 1);
            if( *(_WORD *)(v49 + 2 * v50) != 1280 )
              goto LABEL_84;
            *(_WORD *)(v49 + 2 * v50) = 0;
            ++v41;
            v42 = *(_DWORD *)(v40 + 56);
          }
          while( v41 < v42 );
        }
      }
      *(&CmpDummyThreadEvent + 875) = v38;
      goto LABEL_84;
    }
  }
}

Referenced by:

HalpSetupAcpiPhase0