From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [v2 PATCH] KVM: nVMX: consult PFEC_MASK and PFEC_MATCH when generating #PF VM-exit Date: Thu, 18 Dec 2014 09:46:05 +0100 Message-ID: <5492944D.9090502@redhat.com> References: <20141216193553.GA13643@gnote> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit To: Eugene Korenevsky , kvm@vger.kernel.org Return-path: Received: from mail-wg0-f45.google.com ([74.125.82.45]:45404 "EHLO mail-wg0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751240AbaLRIqK (ORCPT ); Thu, 18 Dec 2014 03:46:10 -0500 Received: by mail-wg0-f45.google.com with SMTP id b13so960643wgh.18 for ; Thu, 18 Dec 2014 00:46:08 -0800 (PST) In-Reply-To: <20141216193553.GA13643@gnote> Sender: kvm-owner@vger.kernel.org List-ID: On 16/12/2014 20:35, Eugene Korenevsky wrote: > 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 > --- > arch/x86/kvm/vmx.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 09ccf6c..a8ef8265 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) > vcpu->arch.walk_mmu = &vcpu->arch.mmu; > } > > +static bool nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12, > + u16 error_code) > +{ > + bool inequality, bit; > + > + bit = (vmcs12->exception_bitmap & (1u << PF_VECTOR)) != 0; > + inequality = > + (error_code & vmcs12->page_fault_error_code_mask) != > + vmcs12->page_fault_error_code_match; > + return inequality ^ bit; > +} > + > static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu, > struct x86_exception *fault) > { > @@ -8213,8 +8225,7 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu, > > WARN_ON(!is_guest_mode(vcpu)); > > - /* TODO: also check PFEC_MATCH/MASK, not just EB.PF. */ > - if (vmcs12->exception_bitmap & (1u << PF_VECTOR)) > + if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) > nested_vmx_vmexit(vcpu, to_vmx(vcpu)->exit_reason, > vmcs_read32(VM_EXIT_INTR_INFO), > vmcs_readl(EXIT_QUALIFICATION)); > Applied to kvm/queue, thanks. Paolo