forked from Minki/linux
42dbaa5a05
So far KVM only had basic x86 debug register support, once introduced to realize guest debugging that way. The guest itself was not able to use those registers. This patch now adds (almost) full support for guest self-debugging via hardware registers. It refactors the code, moving generic parts out of SVM (VMX was already cleaned up by the KVM_SET_GUEST_DEBUG patches), and it ensures that the registers are properly switched between host and guest. This patch also prepares debug register usage by the host. The latter will (once wired-up by the following patch) allow for hardware breakpoints/watchpoints in guest code. If this is enabled, the guest will only see faked debug registers without functionality, but with content reflecting the guest's modifications. Tested on Intel only, but SVM /should/ work as well, but who knows... Known limitations: Trapping on tss switch won't work - most probably on Intel. Credits also go to Joerg Roedel - I used his once posted debugging series as platform for this patch. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Avi Kivity <avi@redhat.com>
52 lines
953 B
C
52 lines
953 B
C
#ifndef __KVM_SVM_H
|
|
#define __KVM_SVM_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/list.h>
|
|
#include <linux/kvm_host.h>
|
|
#include <asm/msr.h>
|
|
|
|
#include <asm/svm.h>
|
|
|
|
static const u32 host_save_user_msrs[] = {
|
|
#ifdef CONFIG_X86_64
|
|
MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE,
|
|
MSR_FS_BASE,
|
|
#endif
|
|
MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP,
|
|
};
|
|
|
|
#define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs)
|
|
|
|
struct kvm_vcpu;
|
|
|
|
struct vcpu_svm {
|
|
struct kvm_vcpu vcpu;
|
|
struct vmcb *vmcb;
|
|
unsigned long vmcb_pa;
|
|
struct svm_cpu_data *svm_data;
|
|
uint64_t asid_generation;
|
|
|
|
u64 next_rip;
|
|
|
|
u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS];
|
|
u64 host_gs_base;
|
|
unsigned long host_cr2;
|
|
|
|
u32 *msrpm;
|
|
struct vmcb *hsave;
|
|
u64 hsave_msr;
|
|
|
|
u64 nested_vmcb;
|
|
|
|
/* These are the merged vectors */
|
|
u32 *nested_msrpm;
|
|
|
|
/* gpa pointers to the real vectors */
|
|
u64 nested_vmcb_msrpm;
|
|
};
|
|
|
|
#endif
|
|
|