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; 
  INT64 Table; 
  __int64 v38; 
  unsigned int v39; 
  __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 *v51; 
  __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; 
  int AvailableProximityId; 
  __int64 v79; 
  int v80; 
  __int64 v81; 
  unsigned int v82; 
  int v83; 
  int v84; 
  __int64 v85; 
  __int64 v86; 
  __int64 v87; 
  __int64 v88; 
  __int64 v89; 
  int ClockDomainCount; 
  UINT64 MemoryRangeCount; 
  UINT64 v92[2]; 
  unsigned __int8 v94; 
  UINT64 ChannelCount; 
  LODWORD(ChannelCount) = 0;
  LODWORD(v92[0]) = 0;
  v1 = LoaderBlock;
  MemoryRangeCount = 0i64;
  HalpNumaInitializationComplete = 1;
  HalpAcpiMpst = HalpAcpiGetTable((volatile INT64 *)LoaderBlock);
  HalpAcpiSrat = HalpAcpiGetTable((volatile INT64 *)v1);
  HalpAcpiMsct = HalpAcpiGetTable((volatile INT64 *)v1);
  if( !HalpAcpiSrat )
  {
    HalpInitializeConfigurationFromMadt(v1);
    return;
  }
  v94 = *(_BYTE *)(HalpAcpiSrat + 8);
  if( (unsigned __int8)HalpGetNumaProcMemoryCount(
                          v92,
                          (UINT64 *)((char *)&MemoryRangeCount + 4),
                          &MemoryRangeCount,
                          &ChannelCount) )
  {
    v2 = HIDWORD(MemoryRangeCount);
    ClockDomainCount = ChannelCount;
    HalpAllocateNumaConfigData(v1);
    if( HalpNumaConfig )
    {
      v3 = 0;
      if( v2 )
      {
        if( v2 >= 4
          && (*(_QWORD *)HalpNumaConfig > (unsigned __int64)HalpNumaConfig
           || *(_QWORD *)HalpNumaConfig + 4 * (unsigned __int64)(v2 - 1) < HalpNumaConfig) )
        {
          v4 = v2 & 0xFFFFFFFC;
          do
            v3 += 4;
          while( v3 < v4 );
          v5 = *(_DWORD **)HalpNumaConfig;
          for( i = (16 * ((unsigned __int64)v4 >> 2)) >> 2; i; --i )
            *v5++ = -1;
        }
        if( v3 < v2 )
        {
          v7 = 4i64 * v3;
          v8 = v2 - v3;
          do
          {
            *(_DWORD *)(v7 + *(_QWORD *)HalpNumaConfig) = -1;
            v7 += 4i64;
            --v8;
          }
          while( v8 );
        }
      }
      v9 = 0;
      v10 = 0;
      v11 = 0;
      v12 = 0;
      v13 = (ACPI_SRAT_ENTRY *)(HalpAcpiSrat + 48);
      v14 = HalpAcpiSrat + *(unsigned int *)(HalpAcpiSrat + 4);
      if( HalpAcpiSrat + 50 <= v14 )
      {
        v15 = HalpNumaConfig;
        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 *)(HalpAcpiSrat + 8) == 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 = HalpNumaConfig;
        v20 = 0i64;
        v21 = *(_DWORD *)(HalpNumaConfig + 56);
        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 *)(HalpNumaConfig + 32) + 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 > HalpMaxNumaPage )
              HalpMaxNumaPage = v24 + v23 - 1;
            HalpNumaPageCount += v24;
            v25 = 2i64 * v10++;
            *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 8 * v25) = v23;
            *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 8 * v25 + 8) = ProximityDomainLow;
            break;
          case 2u:
LABEL_125:
            if( v13->Type )
            {
              LowPart = v13->MemoryAffinity.Base.LowPart;
            }
            else
            {
              LowPart = v13->ApicAffinity.ApicId;
              if( LowPart == 255 )
                LowPart = -1;
            }
            v26 = HalpNumaConfig;
            *(_DWORD *)(*(_QWORD *)HalpNumaConfig + 4i64 * v9) = LowPart;
            *(_DWORD *)(*(_QWORD *)(v26 + 16) + 4i64 * v9++) = ProximityDomainLow;
            ++*(_DWORD *)(*(_QWORD *)(v26 + 40) + 4 * v20);
            if( v94 >= 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:
      HalpNumaMemoryRangeCount = v10;
      *(_DWORD *)(HalpNumaConfig + 60) = v9;
      qsort(*(WCHAR **)&HalpNumaMemoryRanges, v10, (const WCHAR *)0x10, HalpNodeCostSort, ClockDomainCount);
      v28 = 0;
      if( v10 > 1 )
      {
        v29 = 0i64;
        v30 = v10 - 1;
        v31 = 16i64;
        do
        {
          if( *(_DWORD *)(v29 + *(_QWORD *)&HalpNumaMemoryRanges + 8) != *(_DWORD *)(v31
                                                                                    + *(_QWORD *)&HalpNumaMemoryRanges
                                                                                    + 8) )
          {
            v29 = 16i64 * (unsigned int)++v28;
            *(_OWORD *)(v29 + *(_QWORD *)&HalpNumaMemoryRanges) = *(_OWORD *)(v31 + *(_QWORD *)&HalpNumaMemoryRanges);
          }
          v31 += 16i64;
          --v30;
        }
        while( v30 );
      }
      v32 = 0;
      v33 = 2i64 * (unsigned int)(v28 + 1);
      HalpNumaMemoryRangeCount = v28 + 1;
      HalpNumaMaxMemoryRangeCount = v28 + 1;
      *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 8 * v33) = -1i64;
      *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 8 * v33 + 8) = 0;
      **(_QWORD **)&HalpNumaMemoryRanges = 0i64;
      if( v28 != -1 )
      {
        v34 = HalpNumaConfig;
        do
        {
          v35 = *(_DWORD *)(v34 + 56);
          v36 = 0;
          if( v35 )
          {
            while( *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v32 + 8) != *(_DWORD *)(*(_QWORD *)(v34 + 24)
                                                                                                 + 4i64 * v36) )
            {
              if( ++v36 >= v35 )
                goto LABEL_70;
            }
            *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v32 + 8) = v36;
          }
LABEL_70:
          ++v32;
        }
        while( v32 < v28 + 1 );
      }
      if( HalpAcpiMsct )
        HalpUpdateConfigurationFromMsct(
          (UINT64 *)(HalpNumaConfig + 56),
          *(unsigned int *)(HalpNumaConfig + 64),
          (UINT64 *)(HalpNumaConfig + 60),
          *(unsigned int *)(HalpNumaConfig + 68),
          &HalpMaximumClockDomainCount,
          *(UINT64 **)(HalpNumaConfig + 24),
          *(UINT64 **)(HalpNumaConfig + 40),
          *(UINT64 **)(HalpNumaConfig + 16));
      Table = HalpAcpiGetTable((volatile INT64 *)v1);
      v38 = Table;
      if( Table )
      {
        v39 = *(_DWORD *)(Table + 36);
        if( v39 * v39 + 44 > *(_DWORD *)(Table + 4) )
        {
LABEL_84:
          v51 = *(unsigned int **)(*((_QWORD *)v1 + 30) + 296i64);
          if( !HalpAcpiSlit )
          {
            if( !v51 )
              goto LABEL_105;
            v52 = *v51;
            v53 = (unsigned int *)(HalpNumaConfig + 56);
            v54 = *(_DWORD *)(HalpNumaConfig + 56);
            if( (_DWORD)v52 != v54 )
              goto LABEL_105;
            v55 = &v51[v52];
            v56 = 0;
            v57 = 0;
            if( v54 )
            {
              v58 = (_QWORD *)(HalpNumaConfig + 24);
              do
              {
                v59 = *v51;
                v60 = 0;
                if( *v51 )
                {
                  while( v51[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 = *v51;
                    for( j = 0; j < v62; ++j )
                    {
                      if( v51[j + 1] == *(_DWORD *)(*v58 + 4i64 * v61) )
                        break;
                    }
                    if( j == v62 )
                      break;
                    v64 = *((_WORD *)v55 + v56 + j + 2);
                    v65 = v61 + v57 * *(_DWORD *)(HalpNumaConfig + 64);
                    ++v61;
                    *(_WORD *)(*(_QWORD *)(HalpNumaConfig + 48) + 2 * v65) = v64;
                    if( v61 >= *v53 )
                      goto LABEL_101;
                  }
                  v51 = 0i64;
                  break;
                }
LABEL_101:
                v66 = v57 * (*(_DWORD *)(HalpNumaConfig + 64) + 1);
                ++v57;
                *(_WORD *)(*(_QWORD *)(HalpNumaConfig + 48) + 2 * v66) = 0;
                v54 = *v53;
              }
              while( v57 < *v53 );
            }
            if( !v51 )
            {
LABEL_105:
              v67 = HalpNumaConfig;
              v68 = 0;
              v69 = *(_DWORD *)(HalpNumaConfig + 56);
              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 = HalpNumaConfig;
          v74 = 0;
          v75 = *(_DWORD *)(HalpNumaConfig + 56);
          if( v75 )
          {
            do
            {
              v76 = HalpMaximumGroupSize;
              v77 = v74;
              if( *(_DWORD *)(*(_QWORD *)(v73 + 40) + 4i64 * v74) > (unsigned int)HalpMaximumGroupSize )
              {
                AvailableProximityId = HalpGetAvailableProximityId();
                v79 = HalpNumaConfig;
                *(_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 = HalpNumaConfig;
                *(_WORD *)(*(_QWORD *)(HalpNumaConfig + 48) + 2i64 * v75 * (*(_DWORD *)(HalpNumaConfig + 64) + 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 = HalpNumaConfig;
        v41 = 0;
        v42 = *(_DWORD *)(HalpNumaConfig + 56);
        if( v42 )
        {
          do
          {
            v43 = *(_DWORD *)(*(_QWORD *)(v40 + 24) + 4i64 * v41);
            if( v43 >= v39 )
              goto LABEL_84;
            v44 = v39 * v43;
            v45 = 0;
            if( v42 )
            {
              do
              {
                v46 = *(_DWORD *)(*(_QWORD *)(v40 + 24) + 4i64 * v45);
                if( v46 >= v39 )
                  goto LABEL_84;
                v47 = *(unsigned __int8 *)(v46 + v44 + v38 + 44);
                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 );
        }
      }
      HalpAcpiSlit = v38;
      goto LABEL_84;
    }
  }
}

Referenced by:

HalpSetupAcpiPhase0