HalpInitializeConfigurationFromMadt
VOID __stdcall HalpInitializeConfigurationFromMadt(_LOADER_PARAMETER_BLOCK *LoaderBlock){
unsigned int v1;
_LARGE_INTEGER *Table;
char *v4;
unsigned __int64 v5;
__int64 v6;
char *v7;
char v8;
unsigned int v9;
unsigned __int64 v10;
unsigned int v11;
_DWORD *v12;
unsigned __int64 v13;
_DWORD *v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned int v17;
unsigned __int64 v18;
unsigned __int64 i;
_DWORD *v20;
unsigned __int64 j;
_QWORD *v22;
__int64 v23;
__int64 v24;
unsigned __int16 v25;
_QWORD *v26;
int v27;
__int64 v28;
unsigned int v29;
__int64 v30;
__int64 v31;
int v32;
unsigned int v33;
__int64 v34;
unsigned int v35;
unsigned int v36;
unsigned __int16 v37;
int v38;
unsigned int v39;
unsigned int v40;
__int64 v41;
__int64 v42;
bool v43;
UINT64 ChannelCount;
v1 = 0;
Table = HalpAcpiGetTable(LoaderBlock, (const UINT8 *)0x43495041, 0i64);
if( !Table )
return;
v4 = (char *)&Table[5].QuadPart + 4;
v5 = (unsigned __int64)Table + (unsigned int)Table->anonymous_0.HighPart;
if( (unsigned __int64)&Table[5].QuadPart + 6 > v5 )
goto LABEL_11;
do
{
v6 = (unsigned __int8)v4[1];
if( (unsigned __int8)v6 < 2u || (unsigned __int64)&v4[v6] > v5 )
break;
v7 = v4;
v4 += v6;
v8 = *v7;
if( *v7 )
{
if( v8 != 9 )
{
if( v8 != 11 || (unsigned __int8)v6 < 0x28u )
continue;
LABEL_53:
++v1;
continue;
}
v43 = (_BYTE)v6 == 16;
}
else
{
v43 = (_BYTE)v6 == 8;
}
if( v43 )
goto LABEL_53;
}
while( (unsigned __int64)(v4 + 2) <= v5 );
if( v1 > 0x500 )
v1 = 1280;
LABEL_11:
v9 = (v1 + HalpMaximumGroupSize - 1) / HalpMaximumGroupSize;
if( v9 > 0x40 )
{
v9 = 64;
v1 = HalpMaximumGroupSize << 6;
}
LODWORD(ChannelCount) = HalpParseChannelCount();
HalpAllocateNumaConfigData(LoaderBlock, v9, v1, 0i64, ChannelCount);
v10 = *(&CmpDummyThreadEvent + 876);
if( *(&CmpDummyThreadEvent + 876) )
{
*(_DWORD *)(*(&CmpDummyThreadEvent + 876) + 60i64) = v1;
v11 = 0;
*(_DWORD *)(v10 + 56) = v9;
if( v1 )
{
if( v1 >= 4 )
{
v12 = *(_DWORD **)v10;
v13 = v10 + 8;
v14 = *(_DWORD **)(v10 + 8);
v15 = *(_QWORD *)v10 + 4i64 * (v1 - 1);
v16 = (unsigned __int64)&v14[v1 - 1];
if( ((unsigned __int64)v14 > v15 || v16 < (unsigned __int64)v12)
&& ((unsigned __int64)v14 > v10 || v16 < v10)
&& ((unsigned __int64)v14 > v13 || v16 < v10 + 8)
&& ((unsigned __int64)v12 > v10 || v15 < v10)
&& ((unsigned __int64)v12 > v13 || v15 < v13) )
{
v17 = v1 & 0xFFFFFFFC;
do
v11 += 4;
while( v11 < v17 );
v18 = 4i64 * v17;
for( i = v18 >> 2; i; --i )
*v12++ = -1;
v20 = v14;
for( j = v18 >> 2; j; --j )
*v20++ = -1;
}
}
if( v11 < v1 )
{
v22 = (_QWORD *)*(&CmpDummyThreadEvent + 876);
v23 = 4i64 * v11;
v24 = v1 - v11;
do
{
*(_DWORD *)(v23 + *v22) = -1;
*(_DWORD *)(v23 + v22[1]) = -1;
v23 += 4i64;
--v24;
}
while( v24 );
}
}
v25 = 0;
if( *(_DWORD *)(v10 + 56) )
{
v26 = (_QWORD *)*(&CmpDummyThreadEvent + 876);
v27 = 0;
do
{
v28 = v25++;
*(_DWORD *)(v26[3] + 4 * v28) = v27;
*(_DWORD *)(v26[4] + 4 * v28) = 0;
*(_DWORD *)(v26[5] + 4 * v28) = HalpMaximumGroupSize;
v27 = v25;
}
while( (unsigned int)v25 < *(_DWORD *)(v10 + 56) );
}
v29 = HalpMaximumGroupSize;
v30 = *(&CmpDummyThreadEvent + 876);
v31 = v25;
v32 = HalpMaximumGroupSize * (v25 - 1);
v33 = 0;
*(_DWORD *)(*(_QWORD *)(*(&CmpDummyThreadEvent + 876) + 40i64) + 4 * v31 - 4) = v1 - v32;
if( v1 )
{
v34 = 0i64;
do
{
v35 = v33++;
*(_DWORD *)(v34 + *(_QWORD *)(v30 + 16)) = v35 / v29;
v34 += 4i64;
}
while( v33 < v1 );
}
v36 = *(_DWORD *)(v10 + 56);
v37 = 0;
if( v36 )
{
v38 = 0;
do
{
v39 = 0;
v40 = v36;
if( v36 )
{
v41 = *(&CmpDummyThreadEvent + 876);
do
{
v42 = v39 + v38 * *(_DWORD *)(v41 + 64);
++v39;
*(_WORD *)(*(_QWORD *)(v41 + 48) + 2 * v42) = 0;
v40 = *(_DWORD *)(v10 + 56);
}
while( v39 < v40 );
}
++v37;
v36 = v40;
v38 = v37;
}
while( v37 < v40 );
}
HalpChannelInitializeStaticConfiguration();
}
}Referenced by:
HalpNumaInitializeStaticConfiguration