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