63 lines
2.2 KiB
Diff
63 lines
2.2 KiB
Diff
|
# Commit 5e02972646132ad98c365ebfcfcb43b40a0dde36
|
|||
|
# Date 2016-06-13 12:44:32 +0100
|
|||
|
# Author Euan Harris <euan.harris@citrix.com>
|
|||
|
# Committer Andrew Cooper <andrew.cooper3@citrix.com>
|
|||
|
nested vmx: Validate host VMX MSRs before accessing them
|
|||
|
|
|||
|
Some VMX MSRs may not exist on certain processor models, or may
|
|||
|
be disabled because of configuration settings. It is only safe to
|
|||
|
access these MSRs if configuration flags in other MSRs are set. These
|
|||
|
prerequisites are listed in the Intel 64 and IA-32 Architectures
|
|||
|
Software Developer’s Manual, Vol 3, Appendix A.
|
|||
|
|
|||
|
nvmx_msr_read_intercept() does not check the prerequisites before
|
|||
|
accessing MSR_IA32_VMX_PROCBASED_CTLS2, MSR_IA32_VMX_EPT_VPID_CAP,
|
|||
|
MSR_IA32_VMX_VMFUNC on the host. Accessing these MSRs from a nested
|
|||
|
VMX guest running on a host which does not support them will cause
|
|||
|
Xen to crash with a GPF.
|
|||
|
|
|||
|
Signed-off-by: Euan Harris <euan.harris@citrix.com>
|
|||
|
Acked-by: Kevin Tian <kevin.tian@intel.com>
|
|||
|
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
|||
|
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
|||
|
|
|||
|
--- a/xen/arch/x86/hvm/vmx/vvmx.c
|
|||
|
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
|
|||
|
@@ -1820,11 +1820,22 @@ int nvmx_msr_read_intercept(unsigned int
|
|||
|
return 0;
|
|||
|
|
|||
|
/*
|
|||
|
- * Those MSRs are available only when bit 55 of
|
|||
|
- * MSR_IA32_VMX_BASIC is set.
|
|||
|
+ * These MSRs are only available when flags in other MSRs are set.
|
|||
|
+ * These prerequisites are listed in the Intel 64 and IA-32
|
|||
|
+ * Architectures Software Developer’s Manual, Vol 3, Appendix A.
|
|||
|
*/
|
|||
|
switch ( msr )
|
|||
|
{
|
|||
|
+ case MSR_IA32_VMX_PROCBASED_CTLS2:
|
|||
|
+ if ( !cpu_has_vmx_secondary_exec_control )
|
|||
|
+ return 0;
|
|||
|
+ break;
|
|||
|
+
|
|||
|
+ case MSR_IA32_VMX_EPT_VPID_CAP:
|
|||
|
+ if ( !(cpu_has_vmx_ept || cpu_has_vmx_vpid) )
|
|||
|
+ return 0;
|
|||
|
+ break;
|
|||
|
+
|
|||
|
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
|
|||
|
case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
|
|||
|
case MSR_IA32_VMX_TRUE_EXIT_CTLS:
|
|||
|
@@ -1832,6 +1843,11 @@ int nvmx_msr_read_intercept(unsigned int
|
|||
|
if ( !(vmx_basic_msr & VMX_BASIC_DEFAULT1_ZERO) )
|
|||
|
return 0;
|
|||
|
break;
|
|||
|
+
|
|||
|
+ case MSR_IA32_VMX_VMFUNC:
|
|||
|
+ if ( !cpu_has_vmx_vmfunc )
|
|||
|
+ return 0;
|
|||
|
+ break;
|
|||
|
}
|
|||
|
|
|||
|
rdmsrl(msr, host_data);
|