diff options
author | Gleb Natapov <gleb@redhat.com> | 2013-09-25 05:51:35 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-09-30 03:14:24 -0400 |
commit | e011c663b9c786d115c0f45e5b0bfae0c39428d4 (patch) | |
tree | 1900293a084b8b8490a1affe65fcd9059c953ec2 | |
parent | 851eb6677cb14f7fada8735041b12f5add0c247e (diff) |
KVM: nVMX: Check all exceptions for intercept during delivery to L2
All exceptions should be checked for intercept during delivery to L2,
but we check only #PF currently. Drop nested_run_pending while we are
at it since exception cannot be injected during vmentry anyway.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
[Renamed the nested_vmx_check_exception function. - Paolo]
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | arch/x86/kvm/vmx.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 663bc5e4d7da..ac9ded4d4257 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -1898,16 +1898,12 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | |||
1898 | /* | 1898 | /* |
1899 | * KVM wants to inject page-faults which it got to the guest. This function | 1899 | * KVM wants to inject page-faults which it got to the guest. This function |
1900 | * checks whether in a nested guest, we need to inject them to L1 or L2. | 1900 | * checks whether in a nested guest, we need to inject them to L1 or L2. |
1901 | * This function assumes it is called with the exit reason in vmcs02 being | ||
1902 | * a #PF exception (this is the only case in which KVM injects a #PF when L2 | ||
1903 | * is running). | ||
1904 | */ | 1901 | */ |
1905 | static int nested_pf_handled(struct kvm_vcpu *vcpu) | 1902 | static int nested_vmx_check_exception(struct kvm_vcpu *vcpu, unsigned nr) |
1906 | { | 1903 | { |
1907 | struct vmcs12 *vmcs12 = get_vmcs12(vcpu); | 1904 | struct vmcs12 *vmcs12 = get_vmcs12(vcpu); |
1908 | 1905 | ||
1909 | /* TODO: also check PFEC_MATCH/MASK, not just EB.PF. */ | 1906 | if (!(vmcs12->exception_bitmap & (1u << nr))) |
1910 | if (!(vmcs12->exception_bitmap & (1u << PF_VECTOR))) | ||
1911 | return 0; | 1907 | return 0; |
1912 | 1908 | ||
1913 | nested_vmx_vmexit(vcpu); | 1909 | nested_vmx_vmexit(vcpu); |
@@ -1921,8 +1917,8 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, | |||
1921 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 1917 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
1922 | u32 intr_info = nr | INTR_INFO_VALID_MASK; | 1918 | u32 intr_info = nr | INTR_INFO_VALID_MASK; |
1923 | 1919 | ||
1924 | if (!reinject && nr == PF_VECTOR && is_guest_mode(vcpu) && | 1920 | if (!reinject && is_guest_mode(vcpu) && |
1925 | !vmx->nested.nested_run_pending && nested_pf_handled(vcpu)) | 1921 | nested_vmx_check_exception(vcpu, nr)) |
1926 | return; | 1922 | return; |
1927 | 1923 | ||
1928 | if (has_error_code) { | 1924 | if (has_error_code) { |