diff options
Diffstat (limited to '0001-KVM-x86-nVMX-fix-x2APIC-VTPR-read-intercept.patch')
-rw-r--r-- | 0001-KVM-x86-nVMX-fix-x2APIC-VTPR-read-intercept.patch | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/0001-KVM-x86-nVMX-fix-x2APIC-VTPR-read-intercept.patch b/0001-KVM-x86-nVMX-fix-x2APIC-VTPR-read-intercept.patch new file mode 100644 index 000000000..f73a7f336 --- /dev/null +++ b/0001-KVM-x86-nVMX-fix-x2APIC-VTPR-read-intercept.patch @@ -0,0 +1,46 @@ +From c73f4c998e1fd4249b9edfa39e23f4fda2b9b041 Mon Sep 17 00:00:00 2001 +From: Marc Orr <marcorr@google.com> +Date: Mon, 1 Apr 2019 23:56:00 -0700 +Subject: [PATCH] KVM: x86: nVMX: fix x2APIC VTPR read intercept + +Referring to the "VIRTUALIZING MSR-BASED APIC ACCESSES" chapter of the +SDM, when "virtualize x2APIC mode" is 1 and "APIC-register +virtualization" is 0, a RDMSR of 808H should return the VTPR from the +virtual APIC page. + +However, for nested, KVM currently fails to disable the read intercept +for this MSR. This means that a RDMSR exit takes precedence over +"virtualize x2APIC mode", and KVM passes through L1's TPR to L2, +instead of sourcing the value from L2's virtual APIC page. + +This patch fixes the issue by disabling the read intercept, in VMCS02, +for the VTPR when "APIC-register virtualization" is 0. + +The issue described above and fix prescribed here, were verified with +a related patch in kvm-unit-tests titled "Test VMX's virtualize x2APIC +mode w/ nested". + +Signed-off-by: Marc Orr <marcorr@google.com> +Reviewed-by: Jim Mattson <jmattson@google.com> +Fixes: c992384bde84f ("KVM: vmx: speed up MSR bitmap merge") +Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> +--- + arch/x86/kvm/vmx/nested.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c +index 897d70e3d291..7ec9bb1dd723 100644 +--- a/arch/x86/kvm/vmx/nested.c ++++ b/arch/x86/kvm/vmx/nested.c +@@ -578,7 +578,7 @@ static inline bool nested_vmx_prepare_msr_bitmap(struct kvm_vcpu *vcpu, + nested_vmx_disable_intercept_for_msr( + msr_bitmap_l1, msr_bitmap_l0, + X2APIC_MSR(APIC_TASKPRI), +- MSR_TYPE_W); ++ MSR_TYPE_R | MSR_TYPE_W); + + if (nested_cpu_has_vid(vmcs12)) { + nested_vmx_disable_intercept_for_msr( +-- +2.20.1 + |