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