aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2008-12-15 07:52:10 -0500
committerAvi Kivity <avi@redhat.com>2009-03-24 05:02:49 -0400
commitd0bfb940ecabf0b44fb1fd80d8d60594e569e5ec (patch)
treeb5927d44937a54ec23d2a28d59db06a0262c0412 /arch/x86/kvm/x86.c
parent8ab2d2e231062814bd89bba2d6d92563190aa2bb (diff)
KVM: New guest debug interface
This rips out the support for KVM_DEBUG_GUEST and introduces a new IOCTL instead: KVM_SET_GUEST_DEBUG. The IOCTL payload consists of a generic part, controlling the "main switch" and the single-step feature. The arch specific part adds an x86 interface for intercepting both types of debug exceptions separately and re-injecting them when the host was not interested. Moveover, the foundation for guest debugging via debug registers is layed. To signal breakpoint events properly back to userland, an arch-specific data block is now returned along KVM_EXIT_DEBUG. For x86, the arch block contains the PC, the debug exception, and relevant debug registers to tell debug events properly apart. The availability of this new interface is signaled by KVM_CAP_SET_GUEST_DEBUG. Empty stubs for not yet supported archs are provided. Note that both SVM and VTX are supported, but only the latter was tested yet. Based on the experience with all those VTX corner case, I would be fairly surprised if SVM will work out of the box. 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.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index b5e9932e0f62..e990d164b56d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3005,9 +3005,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
3005 goto out; 3005 goto out;
3006 } 3006 }
3007 3007
3008 if (vcpu->guest_debug.enabled)
3009 kvm_x86_ops->guest_debug_pre(vcpu);
3010
3011 vcpu->guest_mode = 1; 3008 vcpu->guest_mode = 1;
3012 /* 3009 /*
3013 * Make sure that guest_mode assignment won't happen after 3010 * Make sure that guest_mode assignment won't happen after
@@ -3218,7 +3215,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
3218 /* 3215 /*
3219 * Don't leak debug flags in case they were set for guest debugging 3216 * Don't leak debug flags in case they were set for guest debugging
3220 */ 3217 */
3221 if (vcpu->guest_debug.enabled && vcpu->guest_debug.singlestep) 3218 if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
3222 regs->rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); 3219 regs->rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF);
3223 3220
3224 vcpu_put(vcpu); 3221 vcpu_put(vcpu);
@@ -3837,8 +3834,8 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
3837 return 0; 3834 return 0;
3838} 3835}
3839 3836
3840int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, 3837int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
3841 struct kvm_debug_guest *dbg) 3838 struct kvm_guest_debug *dbg)
3842{ 3839{
3843 int r; 3840 int r;
3844 3841
@@ -3846,6 +3843,11 @@ int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu,
3846 3843
3847 r = kvm_x86_ops->set_guest_debug(vcpu, dbg); 3844 r = kvm_x86_ops->set_guest_debug(vcpu, dbg);
3848 3845
3846 if (dbg->control & KVM_GUESTDBG_INJECT_DB)
3847 kvm_queue_exception(vcpu, DB_VECTOR);
3848 else if (dbg->control & KVM_GUESTDBG_INJECT_BP)
3849 kvm_queue_exception(vcpu, BP_VECTOR);
3850
3849 vcpu_put(vcpu); 3851 vcpu_put(vcpu);
3850 3852
3851 return r; 3853 return r;