aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx.c
diff options
context:
space:
mode:
authorEugene Korenevsky <ekorenevsky@gmail.com>2014-12-16 14:35:53 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2015-01-08 16:45:16 -0500
commit19d5f10b3ad08f596d2682404af9a3a9030aa684 (patch)
tree0852fe1b555324a82c49ade591e137bd15f17fb8 /arch/x86/kvm/vmx.c
parente9ac033e6b6970c7061725fc6824b3933eb5a0e7 (diff)
KVM: nVMX: consult PFEC_MASK and PFEC_MATCH when generating #PF VM-exit
When generating #PF VM-exit, check equality: (PFEC & PFEC_MASK) == PFEC_MATCH If there is equality, the 14 bit of exception bitmap is used to take decision about generating #PF VM-exit. If there is inequality, inverted 14 bit is used. Signed-off-by: Eugene Korenevsky <ekorenevsky@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r--arch/x86/kvm/vmx.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 70bdcf946f95..e14c96e574ff 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8206,6 +8206,18 @@ static void nested_ept_uninit_mmu_context(struct kvm_vcpu *vcpu)
8206 vcpu->arch.walk_mmu = &vcpu->arch.mmu; 8206 vcpu->arch.walk_mmu = &vcpu->arch.mmu;
8207} 8207}
8208 8208
8209static bool nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12,
8210 u16 error_code)
8211{
8212 bool inequality, bit;
8213
8214 bit = (vmcs12->exception_bitmap & (1u << PF_VECTOR)) != 0;
8215 inequality =
8216 (error_code & vmcs12->page_fault_error_code_mask) !=
8217 vmcs12->page_fault_error_code_match;
8218 return inequality ^ bit;
8219}
8220
8209static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu, 8221static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
8210 struct x86_exception *fault) 8222 struct x86_exception *fault)
8211{ 8223{
@@ -8213,8 +8225,7 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
8213 8225
8214 WARN_ON(!is_guest_mode(vcpu)); 8226 WARN_ON(!is_guest_mode(vcpu));
8215 8227
8216 /* TODO: also check PFEC_MATCH/MASK, not just EB.PF. */ 8228 if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code))
8217 if (vmcs12->exception_bitmap & (1u << PF_VECTOR))
8218 nested_vmx_vmexit(vcpu, to_vmx(vcpu)->exit_reason, 8229 nested_vmx_vmexit(vcpu, to_vmx(vcpu)->exit_reason,
8219 vmcs_read32(VM_EXIT_INTR_INFO), 8230 vmcs_read32(VM_EXIT_INTR_INFO),
8220 vmcs_readl(EXIT_QUALIFICATION)); 8231 vmcs_readl(EXIT_QUALIFICATION));