KiRestoreFeatureBits
VOID __stdcall KiRestoreFeatureBits(){
struct _KPRCB *CurrentPrcb;
char CpuType;
unsigned __int64 v2;
unsigned __int64 v3;
CurrentPrcb = KeGetCurrentPrcb();
if( CurrentPrcb->CpuVendor == 2 )
__writemsr(0x1A0u, KiIa32MiscEnable);
if( (CurrentPrcb->FeatureBits & 0x400000000i64) != 0 )
__writemsr(0xC0000103, CurrentPrcb->GroupIndex | ((unsigned __int64)CurrentPrcb->Group << 8));
if( CurrentPrcb->BpbCurrentSpecCtrl || ((unsigned __int16)KeFeatureBits2 & 0x600) != 0 )
__writemsr(0x48u, CurrentPrcb->BpbCurrentSpecCtrl);
if( ((unsigned __int16)KeFeatureBits2 & 0x8000) != 0 )
__writemsr(0x122u, CurrentPrcb->MsrIa32TsxCtrl);
KeInitializeCatRegisters();
__writemsr(0x174u, 0i64);
__writemsr(0x176u, 0i64);
__writemsr(0x175u, 0i64);
if( CurrentPrcb->CpuVendor == 1 )
{
CpuType = CurrentPrcb->CpuType;
if( CpuType > 15 && CpuType != 17 && !HviIsAnyHypervisorPresent() )
__writemsr(0xC0011029, __readmsr(0xC0011029) | 2);
}
if( KiFlushPcid && !VslVsmEnabled )
{
v2 = __readcr3();
__writecr3(v2 | 2);
}
KiCheckMicrocode((INT64)CurrentPrcb);
if( KiUserCetAllowed )
{
v3 = __readcr4();
__writecr4(v3 | 0x800000);
}
}Referenced by:
KeRestoreProcessorSpecificFeatures