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