All of lore.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org
Subject: [PATCH 34/42] KVM: x86: Refactor guest debug IOCTL handling
Date: Mon, 16 Nov 2009 14:19:35 +0200	[thread overview]
Message-ID: <1258373983-8693-35-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1258373983-8693-1-git-send-email-avi@redhat.com>

From: Jan Kiszka <jan.kiszka@web.de>

Much of so far vendor-specific code for setting up guest debug can
actually be handled by the generic code. This also fixes a minor deficit
in the SVM part /wrt processing KVM_GUESTDBG_ENABLE.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/include/asm/kvm_host.h |    4 ++--
 arch/x86/kvm/svm.c              |   14 ++------------
 arch/x86/kvm/vmx.c              |   18 +-----------------
 arch/x86/kvm/x86.c              |   28 +++++++++++++++++++++-------
 4 files changed, 26 insertions(+), 38 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 295c7c4..e7f8708 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -475,8 +475,8 @@ struct kvm_x86_ops {
 	void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu);
 	void (*vcpu_put)(struct kvm_vcpu *vcpu);
 
-	int (*set_guest_debug)(struct kvm_vcpu *vcpu,
-			       struct kvm_guest_debug *dbg);
+	void (*set_guest_debug)(struct kvm_vcpu *vcpu,
+				struct kvm_guest_debug *dbg);
 	int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata);
 	int (*set_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 data);
 	u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg);
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 02a4269..279a2ae 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1065,26 +1065,16 @@ static void update_db_intercept(struct kvm_vcpu *vcpu)
 		vcpu->guest_debug = 0;
 }
 
-static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg)
+static void svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg)
 {
-	int old_debug = vcpu->guest_debug;
 	struct vcpu_svm *svm = to_svm(vcpu);
 
-	vcpu->guest_debug = dbg->control;
-
-	update_db_intercept(vcpu);
-
 	if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)
 		svm->vmcb->save.dr7 = dbg->arch.debugreg[7];
 	else
 		svm->vmcb->save.dr7 = vcpu->arch.dr7;
 
-	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
-		svm->vmcb->save.rflags |= X86_EFLAGS_TF | X86_EFLAGS_RF;
-	else if (old_debug & KVM_GUESTDBG_SINGLESTEP)
-		svm->vmcb->save.rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
-
-	return 0;
+	update_db_intercept(vcpu);
 }
 
 static void load_host_msrs(struct kvm_vcpu *vcpu)
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 97f4265..70020e5 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -1096,30 +1096,14 @@ static void vmx_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg)
 	}
 }
 
-static int set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg)
+static void set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg)
 {
-	int old_debug = vcpu->guest_debug;
-	unsigned long flags;
-
-	vcpu->guest_debug = dbg->control;
-	if (!(vcpu->guest_debug & KVM_GUESTDBG_ENABLE))
-		vcpu->guest_debug = 0;
-
 	if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)
 		vmcs_writel(GUEST_DR7, dbg->arch.debugreg[7]);
 	else
 		vmcs_writel(GUEST_DR7, vcpu->arch.dr7);
 
-	flags = vmcs_readl(GUEST_RFLAGS);
-	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
-		flags |= X86_EFLAGS_TF | X86_EFLAGS_RF;
-	else if (old_debug & KVM_GUESTDBG_SINGLESTEP)
-		flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
-	vmcs_writel(GUEST_RFLAGS, flags);
-
 	update_exception_bitmap(vcpu);
-
-	return 0;
 }
 
 static __init int cpu_has_kvm_support(void)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 5f44d56..a06f88e 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4472,12 +4472,19 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
 					struct kvm_guest_debug *dbg)
 {
-	int i, r;
+	unsigned long rflags;
+	int old_debug;
+	int i;
 
 	vcpu_load(vcpu);
 
-	if ((dbg->control & (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) ==
-	    (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) {
+	old_debug = vcpu->guest_debug;
+
+	vcpu->guest_debug = dbg->control;
+	if (!(vcpu->guest_debug & KVM_GUESTDBG_ENABLE))
+		vcpu->guest_debug = 0;
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) {
 		for (i = 0; i < KVM_NR_DB_REGS; ++i)
 			vcpu->arch.eff_db[i] = dbg->arch.debugreg[i];
 		vcpu->arch.switch_db_regs =
@@ -4488,16 +4495,23 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
 		vcpu->arch.switch_db_regs = (vcpu->arch.dr7 & DR7_BP_EN_MASK);
 	}
 
-	r = kvm_x86_ops->set_guest_debug(vcpu, dbg);
+	rflags = kvm_x86_ops->get_rflags(vcpu);
+	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
+		rflags |= X86_EFLAGS_TF | X86_EFLAGS_RF;
+	else if (old_debug & KVM_GUESTDBG_SINGLESTEP)
+		rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
+	kvm_x86_ops->set_rflags(vcpu, rflags);
 
-	if (dbg->control & KVM_GUESTDBG_INJECT_DB)
+	kvm_x86_ops->set_guest_debug(vcpu, dbg);
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_INJECT_DB)
 		kvm_queue_exception(vcpu, DB_VECTOR);
-	else if (dbg->control & KVM_GUESTDBG_INJECT_BP)
+	else if (vcpu->guest_debug & KVM_GUESTDBG_INJECT_BP)
 		kvm_queue_exception(vcpu, BP_VECTOR);
 
 	vcpu_put(vcpu);
 
-	return r;
+	return 0;
 }
 
 /*
-- 
1.6.5.2


  parent reply	other threads:[~2009-11-16 12:22 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-16 12:19 [PATCH 00/42] KVM updates for the 2.6.33 merge window (batch 1/2) Avi Kivity
2009-11-16 12:19 ` [PATCH 01/42] core, x86: Add user return notifiers Avi Kivity
2009-11-16 12:19 ` [PATCH 02/42] x86: Fix user return notifier build Avi Kivity
2009-11-16 12:19 ` [PATCH 03/42] x86: Fix user return notifier put_cpu_var() invocation Avi Kivity
2009-11-16 12:19 ` [PATCH 04/42] KVM: Don't wrap schedule() with vcpu_put()/vcpu_load() Avi Kivity
2009-11-16 12:19 ` [PATCH 05/42] KVM: x86 emulator: Add 'push/pop sreg' instructions Avi Kivity
2009-11-16 12:19 ` [PATCH 06/42] KVM: x86 emulator: Introduce No64 decode option Avi Kivity
2009-11-16 12:19 ` [PATCH 07/42] KVM: Don't pass kvm_run arguments Avi Kivity
2009-11-16 12:19 ` [PATCH 08/42] KVM: Call pic_clear_isr() on pic reset to reuse logic there Avi Kivity
2009-11-16 12:19 ` [PATCH 09/42] KVM: Move irq sharing information to irqchip level Avi Kivity
2009-11-16 12:19 ` [PATCH 10/42] KVM: Change irq routing table to use gsi indexed array Avi Kivity
2009-11-16 12:19 ` [PATCH 11/42] KVM: Maintain back mapping from irqchip/pin to gsi Avi Kivity
2009-11-16 12:19 ` [PATCH 12/42] KVM: Move irq routing data structure to rcu locking Avi Kivity
2009-11-16 12:19 ` [PATCH 13/42] KVM: Move irq ack notifier list to arch independent code Avi Kivity
2009-11-16 12:19 ` [PATCH 14/42] KVM: Convert irq notifiers lists to RCU locking Avi Kivity
2009-11-16 12:19 ` [PATCH 15/42] KVM: Move IO APIC to its own lock Avi Kivity
2009-11-16 12:19 ` [PATCH 16/42] KVM: Drop kvm->irq_lock lock from irq injection path Avi Kivity
2009-11-16 12:19 ` [PATCH 17/42] KVM: Return -ENOTTY on unrecognized ioctls Avi Kivity
2009-11-16 12:19 ` [PATCH 18/42] KVM: Move assigned device code to own file Avi Kivity
2009-11-16 12:19 ` [PATCH 19/42] KVM: x86 emulator: Add missing decoder flags for 'or' instructions Avi Kivity
2009-11-16 12:19 ` [PATCH 20/42] KVM: x86 emulator: Add pusha and popa instructions Avi Kivity
2009-11-16 12:19 ` [PATCH 21/42] KVM: VMX: Enhance invalid guest state emulation Avi Kivity
2009-11-16 12:19 ` [PATCH 22/42] KVM: SVM: remove needless mmap_sem acquision from nested_svm_map Avi Kivity
2009-11-16 12:19 ` [PATCH 23/42] KVM: Activate Virtualization On Demand Avi Kivity
2010-03-17 21:57   ` Dieter Ries
2010-03-17 22:02     ` Alexander Graf
2010-03-17 22:40       ` Dieter Ries
2010-03-17 22:47         ` Alexander Graf
2010-03-18  7:11           ` Dieter Ries
2010-03-18  7:17             ` Alexander Graf
2010-03-19  2:26               ` Dieter Ries
2010-08-08 12:02               ` Serge Belyshev
2010-08-16 13:24                 ` Alexander Graf
2010-08-16 13:49                   ` Serge Belyshev
2010-08-16 14:13                     ` Alexander Graf
2010-03-18  5:41         ` Michael Tokarev
2010-03-18  7:04           ` Dieter Ries
2009-11-16 12:19 ` [PATCH 24/42] KVM: remove duplicated #include Avi Kivity
2009-11-16 12:19 ` [PATCH 25/42] KVM: SVM: reorganize svm_interrupt_allowed Avi Kivity
2009-11-16 12:19 ` [PATCH 26/42] KVM: SVM: don't copy exit_int_info on nested vmrun Avi Kivity
2009-11-16 12:19 ` [PATCH 27/42] KVM: SVM: Remove remaining occurences of rdtscll Avi Kivity
2009-11-16 12:19 ` [PATCH 28/42] KVM: fix lock imbalance in kvm_*_irq_source_id() Avi Kivity
2009-11-16 12:19 ` [PATCH 29/42] KVM: Separate timer intialization into an indepedent function Avi Kivity
2009-11-16 12:19 ` [PATCH 30/42] KVM: Kill the confusing tsc_ref_khz and ref_freq variables Avi Kivity
2009-11-16 12:19 ` [PATCH 31/42] KVM: Fix printk name error in svm.c Avi Kivity
2009-11-16 12:19 ` [PATCH 32/42] KVM: Fix hotplug of CPUs Avi Kivity
2009-11-16 12:19 ` [PATCH 33/42] KVM: remove pre_task_link setting in save_state_to_tss16 Avi Kivity
2009-11-16 12:19 ` Avi Kivity [this message]
2009-11-16 12:19 ` [PATCH 35/42] KVM: x86: disable paravirt mmu reporting Avi Kivity
2009-11-16 12:19 ` [PATCH 36/42] KVM: x86: Rework guest single-step flag injection and filtering Avi Kivity
2009-11-16 12:19 ` [PATCH 37/42] KVM: x86: include pvclock MSRs in msrs_to_save Avi Kivity
2009-11-16 12:19 ` [PATCH 38/42] KVM: SVM: Notify nested hypervisor of lost event injections Avi Kivity
2009-11-16 12:19 ` [PATCH 39/42] KVM: SVM: Move INTR vmexit out of atomic code Avi Kivity
2009-11-16 12:19 ` [PATCH 40/42] KVM: SVM: Add tracepoint for nested vmrun Avi Kivity
2009-11-16 12:19 ` [PATCH 41/42] KVM: SVM: Add tracepoint for nested #vmexit Avi Kivity
2009-11-16 12:19 ` [PATCH 42/42] KVM: SVM: Add tracepoint for injected #vmexit Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1258373983-8693-35-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.