diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2008-12-15 07:52:10 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-03-24 05:02:49 -0400 |
commit | d0bfb940ecabf0b44fb1fd80d8d60594e569e5ec (patch) | |
tree | b5927d44937a54ec23d2a28d59db06a0262c0412 /arch/x86/include/asm/kvm.h | |
parent | 8ab2d2e231062814bd89bba2d6d92563190aa2bb (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/include/asm/kvm.h')
-rw-r--r-- | arch/x86/include/asm/kvm.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86/include/asm/kvm.h b/arch/x86/include/asm/kvm.h index 886c9402ec45..32eb96c7ca27 100644 --- a/arch/x86/include/asm/kvm.h +++ b/arch/x86/include/asm/kvm.h | |||
@@ -212,6 +212,24 @@ struct kvm_pit_channel_state { | |||
212 | __s64 count_load_time; | 212 | __s64 count_load_time; |
213 | }; | 213 | }; |
214 | 214 | ||
215 | struct kvm_debug_exit_arch { | ||
216 | __u32 exception; | ||
217 | __u32 pad; | ||
218 | __u64 pc; | ||
219 | __u64 dr6; | ||
220 | __u64 dr7; | ||
221 | }; | ||
222 | |||
223 | #define KVM_GUESTDBG_USE_SW_BP 0x00010000 | ||
224 | #define KVM_GUESTDBG_USE_HW_BP 0x00020000 | ||
225 | #define KVM_GUESTDBG_INJECT_DB 0x00040000 | ||
226 | #define KVM_GUESTDBG_INJECT_BP 0x00080000 | ||
227 | |||
228 | /* for KVM_SET_GUEST_DEBUG */ | ||
229 | struct kvm_guest_debug_arch { | ||
230 | __u64 debugreg[8]; | ||
231 | }; | ||
232 | |||
215 | struct kvm_pit_state { | 233 | struct kvm_pit_state { |
216 | struct kvm_pit_channel_state channels[3]; | 234 | struct kvm_pit_channel_state channels[3]; |
217 | }; | 235 | }; |