HalpDpPostReplaceInitialization

INT64 __fastcall HalpDpPostReplaceInitialization(INT64 *a1, UINT64 *a2){
  DOUBLE v2; 
  int v3; 
  INT64 v6; 
  INT64 v7; 
  INT64 v8; 
  CHAR CpuInfo; 
  UINT8 v11; 
  v3 = *(_DWORD *)a1;
  v11 = 0;
  HalpInterruptReinitializeThisProcessor((INT64)a1, v2);
  KeGetCurrentIrql();
  __writecr8(0xFui64);
  __writemsr(0x10u, *a2);
  HalpMcaResumeProcessorConfig(1i64);
  if( (HalpFeatureBits & 1) != 0 )
    HalpInterruptEnablePerformanceEvents(0i64);
  v8 = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)a1 + 15, 1u);
  while( *((_DWORD *)a1 + 15) < v3 )
    _mm_pause();
  while( *((_DWORD *)a1 + 16) < (int)v8 )
    _mm_pause();
  HalpMcUpdateMicrocode(v8, v6, v7);
  CpuInfo = HalpGetCpuInfo(0i64, 0i64, 0i64, &v11);
  v11 &= -(CpuInfo != 0);
  if( v11 == 1 )
  {
    if( *((_BYTE *)KeGetCurrentPrcb() + 64) == 15 )
      __writemsr(0xC001001F, __readmsr(0xC001001F) & 0xFFFFFFFEFFEFFFFFui64 | 0x100000000i64);
    if( *((_BYTE *)KeGetCurrentPrcb() + 64) == 18 )
      __writemsr(0xC0011029, __readmsr(0xC0011029) | 0x80000000);
  }
  _InterlockedIncrement((volatile signed __int32 *)a1 + 16);
  while( *((_DWORD *)a1 + 16) < v3 )
    _mm_pause();
  HalpRestartProfiling();
  return HalpInterruptEnableNmi();
}

Referenced by:

HalpDpOfflineProcessorForReplace