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