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