HalpDpPostReplaceInitialization

NTSTATUS __stdcall HalpDpPostReplaceInitialization(INT64 *a1, UINT64 *a2){
  int v2; 
  INT64 v5; 
  INT64 v6; 
  INT64 v7; 
  CHAR CpuInfo; 
  NTSTATUS result; 
  UINT8 v10; 

  v2 = *(_DWORD *)a1;
  v10 = 0;
  HalpInterruptReinitializeThisProcessor();
  KeGetCurrentIrql();
  __writecr8(0xFui64);
  __writemsr(0x10u, *a2);
  HalpMcaResumeProcessorConfig(1i64);
  if( (dword_140C4A10C & 1) != 0 )
    HalpInterruptEnablePerformanceEvents(0i64);
  v7 = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)a1 + 15, 1u);
  while( *((_DWORD *)a1 + 15) < v2 )
    _mm_pause();
  while( *((_DWORD *)a1 + 16) < (int)v7 )
    _mm_pause();
  HalpMcUpdateMicrocode(v7, v5, v6);
  CpuInfo = HalpGetCpuInfo(0i64, 0i64, 0i64, &v10);
  v10 &= -(CpuInfo != 0);
  if( v10 == 1 )
  {
    if( KeGetCurrentPrcb()->CpuType == 15 )
      __writemsr(0xC001001F, __readmsr(0xC001001F) & 0xFFFFFFFEFFEFFFFFui64 | 0x100000000i64);
    if( KeGetCurrentPrcb()->CpuType == 18 )
      __writemsr(0xC0011029, __readmsr(0xC0011029) | 0x80000000);
  }
  _InterlockedIncrement((volatile signed __int32 *)a1 + 16);
  while( *((_DWORD *)a1 + 16) < v2 )
    _mm_pause();
  HalpRestartProfiling();
  HalpInterruptEnableNmi();
  return result;
}

Referenced by:

HalpDpOfflineProcessorForReplace