From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: [PATCH] KVM: SVM: Cleanup NMI singlestep Date: Sun, 18 Oct 2009 13:52:51 +0200 Message-ID: <20091018115251.GA29477@redhat.com> References: <4ADAFB06.3040004@web.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Avi Kivity , Marcelo Tosatti , kvm-devel To: Jan Kiszka Return-path: Received: from mx1.redhat.com ([209.132.183.28]:18250 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753042AbZJRLws (ORCPT ); Sun, 18 Oct 2009 07:52:48 -0400 Content-Disposition: inline In-Reply-To: <4ADAFB06.3040004@web.de> Sender: kvm-owner@vger.kernel.org List-ID: On Sun, Oct 18, 2009 at 01:24:54PM +0200, Jan Kiszka wrote: > Push the NMI-related singlestep variable into vcpu_svm. It's dealing > with an AMD-specific deficit, nothing generic for x86. > > Signed-off-by: Jan Kiszka Acked-by: Gleb Natapov > --- > > arch/x86/include/asm/kvm_host.h | 1 - > arch/x86/kvm/svm.c | 12 +++++++----- > 2 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index c6094f1..097a492 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -354,7 +354,6 @@ struct kvm_vcpu_arch { > unsigned int time_offset; > struct page *time_page; > > - bool singlestep; /* guest is single stepped by KVM */ > bool nmi_pending; > bool nmi_injected; > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 170b2d9..ffa6ad2 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -107,6 +107,8 @@ struct vcpu_svm { > u32 *msrpm; > > struct nested_state nested; > + > + bool nmi_singlestep; > }; > > /* enable NPT for AMD64 and X86 with PAE */ > @@ -1050,7 +1052,7 @@ static void update_db_intercept(struct kvm_vcpu *vcpu) > svm->vmcb->control.intercept_exceptions &= > ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); > > - if (vcpu->arch.singlestep) > + if (svm->nmi_singlestep) > svm->vmcb->control.intercept_exceptions |= (1 << DB_VECTOR); > > if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { > @@ -1195,13 +1197,13 @@ static int db_interception(struct vcpu_svm *svm) > > if (!(svm->vcpu.guest_debug & > (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) && > - !svm->vcpu.arch.singlestep) { > + !svm->nmi_singlestep) { > kvm_queue_exception(&svm->vcpu, DB_VECTOR); > return 1; > } > > - if (svm->vcpu.arch.singlestep) { > - svm->vcpu.arch.singlestep = false; > + if (svm->nmi_singlestep) { > + svm->nmi_singlestep = false; > if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP)) > svm->vmcb->save.rflags &= > ~(X86_EFLAGS_TF | X86_EFLAGS_RF); > @@ -2543,7 +2545,7 @@ static void enable_nmi_window(struct kvm_vcpu *vcpu) > /* Something prevents NMI from been injected. Single step over > possible problem (IRET or exception injection or interrupt > shadow) */ > - vcpu->arch.singlestep = true; > + svm->nmi_singlestep = true; > svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); > update_db_intercept(vcpu); > } > -- Gleb.