aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@web.de>2009-10-02 18:31:21 -0400
committerAvi Kivity <avi@redhat.com>2009-12-03 02:32:14 -0500
commit355be0b9300579e02275d7d19374806a974ce622 (patch)
treefaa52bac7a0d1d83c7a0a8f1bec01088b77a68fb /arch/x86/kvm/x86.c
parent201d945bcfb0d53e67c9c081f7c28532eb4669c7 (diff)
KVM: x86: Refactor guest debug IOCTL handling
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>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 5f44d565cc9b..a06f88e66c89 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,
4472int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, 4472int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
4473 struct kvm_guest_debug *dbg) 4473 struct kvm_guest_debug *dbg)
4474{ 4474{
4475 int i, r; 4475 unsigned long rflags;
4476 int old_debug;
4477 int i;
4476 4478
4477 vcpu_load(vcpu); 4479 vcpu_load(vcpu);
4478 4480
4479 if ((dbg->control & (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) == 4481 old_debug = vcpu->guest_debug;
4480 (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) { 4482
4483 vcpu->guest_debug = dbg->control;
4484 if (!(vcpu->guest_debug & KVM_GUESTDBG_ENABLE))
4485 vcpu->guest_debug = 0;
4486
4487 if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) {
4481 for (i = 0; i < KVM_NR_DB_REGS; ++i) 4488 for (i = 0; i < KVM_NR_DB_REGS; ++i)
4482 vcpu->arch.eff_db[i] = dbg->arch.debugreg[i]; 4489 vcpu->arch.eff_db[i] = dbg->arch.debugreg[i];
4483 vcpu->arch.switch_db_regs = 4490 vcpu->arch.switch_db_regs =
@@ -4488,16 +4495,23 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
4488 vcpu->arch.switch_db_regs = (vcpu->arch.dr7 & DR7_BP_EN_MASK); 4495 vcpu->arch.switch_db_regs = (vcpu->arch.dr7 & DR7_BP_EN_MASK);
4489 } 4496 }
4490 4497
4491 r = kvm_x86_ops->set_guest_debug(vcpu, dbg); 4498 rflags = kvm_x86_ops->get_rflags(vcpu);
4499 if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
4500 rflags |= X86_EFLAGS_TF | X86_EFLAGS_RF;
4501 else if (old_debug & KVM_GUESTDBG_SINGLESTEP)
4502 rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
4503 kvm_x86_ops->set_rflags(vcpu, rflags);
4492 4504
4493 if (dbg->control & KVM_GUESTDBG_INJECT_DB) 4505 kvm_x86_ops->set_guest_debug(vcpu, dbg);
4506
4507 if (vcpu->guest_debug & KVM_GUESTDBG_INJECT_DB)
4494 kvm_queue_exception(vcpu, DB_VECTOR); 4508 kvm_queue_exception(vcpu, DB_VECTOR);
4495 else if (dbg->control & KVM_GUESTDBG_INJECT_BP) 4509 else if (vcpu->guest_debug & KVM_GUESTDBG_INJECT_BP)
4496 kvm_queue_exception(vcpu, BP_VECTOR); 4510 kvm_queue_exception(vcpu, BP_VECTOR);
4497 4511
4498 vcpu_put(vcpu); 4512 vcpu_put(vcpu);
4499 4513
4500 return r; 4514 return 0;
4501} 4515}
4502 4516
4503/* 4517/*