@@ -136,7 +136,7 @@
| X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_FSGSBASE \
| X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_VMXE \
| X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP \
- | X86_CR4_LAM_SUP))
+ | X86_CR4_LAM_SUP | X86_CR4_FRED))
#define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR)
@@ -8009,6 +8009,10 @@ void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_LAM);
kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_FRED);
+ /* Don't allow CR4.FRED=1 before all of FRED KVM support is in place. */
+ if (!guest_can_use(vcpu, X86_FEATURE_FRED))
+ vcpu->arch.cr4_guest_rsvd_bits |= X86_CR4_FRED;
+
vmx_setup_uret_msrs(vmx);
if (cpu_has_secondary_exec_ctrls())
@@ -561,6 +561,8 @@ enum kvm_msr_access {
__reserved_bits |= X86_CR4_PCIDE; \
if (!__cpu_has(__c, X86_FEATURE_LAM)) \
__reserved_bits |= X86_CR4_LAM_SUP; \
+ if (!__cpu_has(__c, X86_FEATURE_FRED)) \
+ __reserved_bits |= X86_CR4_FRED; \
__reserved_bits; \
})