From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH v2] KVM: x86: Fix DR7 mask on task-switch while debugging Date: Sun, 10 May 2015 17:27:31 +0200 Message-ID: <554F78E3.8040201@redhat.com> References: <2F075AB7-7D6A-4553-8E5F-AF2356F1F2EB@gmail.com> <1429467179-9270-1-git-send-email-namit@cs.technion.ac.il> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Nadav Amit Return-path: Received: from mx1.redhat.com ([209.132.183.28]:47165 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751381AbbEJP1g (ORCPT ); Sun, 10 May 2015 11:27:36 -0400 In-Reply-To: <1429467179-9270-1-git-send-email-namit@cs.technion.ac.il> Sender: kvm-owner@vger.kernel.org List-ID: On 19/04/2015 20:12, Nadav Amit wrote: > If the host sets hardware breakpoints to debug the guest, and a task-switch > occurs in the guest, the architectural DR7 will not be updated. The effective > DR7 would be updated instead. > > This fix puts the DR7 update during task-switch emulation, so it now uses the > standard DR setting mechanism instead of the one that was previously used. As a > bonus, the update of DR7 will now be effective for AMD as well. > > Signed-off-by: Nadav Amit > > --- > > v1 -> v2: > - Move the setting to emulate.c instead of x86.c > - Shorten title > --- > arch/x86/kvm/emulate.c | 6 +++++- > arch/x86/kvm/vmx.c | 3 --- > 2 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index 630bcb0..4a4555a 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > > #include "x86.h" > #include "tss.h" > @@ -2849,7 +2850,7 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, > ulong old_tss_base = > ops->get_cached_segment_base(ctxt, VCPU_SREG_TR); > u32 desc_limit; > - ulong desc_addr; > + ulong desc_addr, dr7; > > /* FIXME: old_tss_base == ~0 ? */ > > @@ -2934,6 +2935,9 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, > ret = em_push(ctxt); > } > > + ops->get_dr(ctxt, 7, &dr7); > + ops->set_dr(ctxt, 7, dr7 & ~(DR_LOCAL_ENABLE_MASK | DR_LOCAL_SLOWDOWN)); > + > return ret; > } > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index f7a0a7f..8f731c0 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -5703,9 +5703,6 @@ static int handle_task_switch(struct kvm_vcpu *vcpu) > return 0; > } > > - /* clear all local breakpoint enable flags */ > - vmcs_writel(GUEST_DR7, vmcs_readl(GUEST_DR7) & ~0x155); > - > /* > * TODO: What about debug traps on tss switch? > * Are we supposed to inject them and update dr6? > Applied, thanks. Paolo