diff options
author | Jan Kiszka <jan.kiszka@web.de> | 2009-10-02 18:31:21 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-03 02:32:14 -0500 |
commit | 355be0b9300579e02275d7d19374806a974ce622 (patch) | |
tree | faa52bac7a0d1d83c7a0a8f1bec01088b77a68fb /arch/x86/kvm/x86.c | |
parent | 201d945bcfb0d53e67c9c081f7c28532eb4669c7 (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.c | 28 |
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, | |||
4472 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, | 4472 | int 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 | /* |