|
@@ -3788,20 +3788,21 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
|
|
if (!is_paging(vcpu)) {
|
|
|
hw_cr4 &= ~X86_CR4_PAE;
|
|
|
hw_cr4 |= X86_CR4_PSE;
|
|
|
- /*
|
|
|
- * SMEP/SMAP is disabled if CPU is in non-paging mode
|
|
|
- * in hardware. However KVM always uses paging mode to
|
|
|
- * emulate guest non-paging mode with TDP.
|
|
|
- * To emulate this behavior, SMEP/SMAP needs to be
|
|
|
- * manually disabled when guest switches to non-paging
|
|
|
- * mode.
|
|
|
- */
|
|
|
- hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
|
|
|
} else if (!(cr4 & X86_CR4_PAE)) {
|
|
|
hw_cr4 &= ~X86_CR4_PAE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!enable_unrestricted_guest && !is_paging(vcpu))
|
|
|
+ /*
|
|
|
+ * SMEP/SMAP is disabled if CPU is in non-paging mode in
|
|
|
+ * hardware. However KVM always uses paging mode without
|
|
|
+ * unrestricted guest.
|
|
|
+ * To emulate this behavior, SMEP/SMAP needs to be manually
|
|
|
+ * disabled when guest switches to non-paging mode.
|
|
|
+ */
|
|
|
+ hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
|
|
|
+
|
|
|
vmcs_writel(CR4_READ_SHADOW, cr4);
|
|
|
vmcs_writel(GUEST_CR4, hw_cr4);
|
|
|
return 0;
|