HalpChannelInitializeStaticConfiguration
VOID __stdcall HalpChannelInitializeStaticConfiguration(){
unsigned __int16 v0;
unsigned __int16 *v1;
unsigned __int64 v2;
unsigned __int64 v3;
unsigned int v4;
unsigned __int64 v5;
__int64 v6;
unsigned __int16 i;
__int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
unsigned int v16;
__int64 v17;
__int64 v18;
WCHAR v19;
unsigned int v20;
__int64 v21;
__int64 v22;
UINT8 v23;
UINT8 DeepPowerStateValue;
unsigned __int16 v25;
unsigned __int64 v26;
unsigned __int64 v27;
v26 = 0i64;
DeepPowerStateValue = 0;
v27 = 0i64;
if( HalpChannelMemoryRangeCount )
{
if( *(_BYTE *)(HalpAcpiMpst + 8) == 1 )
{
v0 = *(_WORD *)(HalpAcpiMpst + 40);
v1 = (unsigned __int16 *)(HalpAcpiMpst + 44);
v2 = -1i64;
v3 = HalpAcpiMpst + *(unsigned int *)(HalpAcpiMpst + 4);
v25 = v0;
v4 = 0;
v5 = 0i64;
v6 = 0i64;
for( i = 0; i < v0; v1 = (unsigned __int16 *)((char *)v1 + *((unsigned int *)v1 + 1)) )
{
if( (*(_BYTE *)v1 & 1) != 0 )
{
if( (*(_BYTE *)v1 & 4) != 0 )
goto LABEL_45;
v8 = *((unsigned int *)v1 + 6);
if( (_DWORD)v8 )
{
if( (unsigned __int64)&v1[v8 + 16] > v3 )
goto LABEL_45;
qsort(v1 + 16, (unsigned int)v8, (const WCHAR *)2, HalpMpsValueAscendingSort);
v26 = *((_QWORD *)v1 + 1);
v9 = v26 >> 12;
v10 = v26 >> 12;
if( v26 >> 12 >= v2 )
v10 = v2;
v2 = v10;
v27 = *((_QWORD *)v1 + 2);
v11 = v9 + (v27 >> 12) - 1;
v12 = v11;
if( v11 <= v5 )
v12 = v5;
v6 += v27 >> 12;
v13 = 0;
v5 = v12;
v14 = 0;
if( *(_QWORD *)&HalpNumaMemoryRanges )
{
if( v9 >= **(_QWORD **)&HalpNumaMemoryRanges
&& v9 >= *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64) )
{
v15 = 1;
do
{
++v15;
++v14;
}
while( v9 >= *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v15) );
v0 = v25;
v13 = 0;
}
v14 = *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v14 + 8);
if( v11 >= **(_QWORD **)&HalpNumaMemoryRanges
&& v11 >= *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64) )
{
v16 = 1;
do
{
++v16;
++v13;
}
while( v11 >= *(_QWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v16) );
v0 = v25;
}
if( *(_DWORD *)(*(_QWORD *)&HalpNumaMemoryRanges + 16i64 * v13 + 8) != v14 )
goto LABEL_45;
}
v17 = 2i64 * v4;
*(_QWORD *)&HalpChannelMemoryRanges[4 * v17] = v1;
HalpChannelMemoryRanges[4 * v17 + 4] = v1[1];
++v4;
HalpChannelMemoryRanges[4 * v17 + 5] = v14;
}
}
++i;
}
if( (!*(_QWORD *)&HalpNumaMemoryRanges
|| v2 == HalpMinNumaPage && v5 == HalpMaxNumaPage && v6 == HalpNumaPageCount)
&& (unsigned __int64)(v1 + 1) <= v3 )
{
v18 = *v1;
if( (unsigned __int64)&v1[14 * v18 + 2] <= v3 )
{
qsort(HalpChannelMemoryRanges, v4, (const WCHAR *)0x10, HalpChannelMpnIdSort);
if( (unsigned int)HalpValidateMpns() )
{
qsort(HalpChannelMemoryRanges, v4, (const WCHAR *)0x10, HalpChannelAssignmentSort);
v19 = 0;
v20 = 0;
if( !v4 )
{
LABEL_44:
qsort(HalpChannelMemoryRanges, v4, (const WCHAR *)0x10, HalpChannelAscendingSort);
*(_QWORD *)&HalpChannelMemoryRanges[8 * v20] = -1i64;
*(_QWORD *)HalpChannelMemoryRanges = 0i64;
return;
}
v21 = 0i64;
while( 1 )
{
v22 = *(_QWORD *)&HalpChannelMemoryRanges[v21];
v26 = *(_QWORD *)(v22 + 8);
*(_QWORD *)&HalpChannelMemoryRanges[v21] = v26 >> 12;
if( v20 && HalpChannelMemoryRanges[v21 + 5] == HalpChannelMemoryRanges[8 * v20 - 3] )
{
if( HalpChannelMemoryRanges[v21 + 4] != HalpChannelMemoryRanges[8 * v20 - 4] )
++v19;
}
else
{
v19 = 0;
}
HalpChannelMemoryRanges[v21 + 6] = v19;
if( HalpSelectFeasibleLowPowerState(
(_MEMORY_POWER_NODE *)v22,
&DeepPowerStateValue,
(POWER_STATE_CHARACTERISTICS *)(unsigned __int16)v18) != 1 )
break;
v23 = DeepPowerStateValue;
if( DeepPowerStateValue )
{
LOBYTE(HalpChannelMemoryRanges[v21 + 7]) = 1;
HIBYTE(HalpChannelMemoryRanges[v21 + 7]) = v23;
}
++v20;
v21 += 8i64;
if( v20 >= v4 )
goto LABEL_44;
}
}
}
}
}
LABEL_45:
HalpChannelMemoryRangeCount = 0;
HalpChannelMemoryRanges = 0i64;
}
}Referenced by:
HalpInitializeConfigurationFromMadt
HalpNumaInitializeStaticConfiguration