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