Revision ff44f1a3
b/kvm-all.c | ||
---|---|---|
64 | 64 |
int migration_log; |
65 | 65 |
int vcpu_events; |
66 | 66 |
int robust_singlestep; |
67 |
int debugregs; |
|
67 | 68 |
#ifdef KVM_CAP_SET_GUEST_DEBUG |
68 | 69 |
struct kvm_sw_breakpoint_head kvm_sw_breakpoints; |
69 | 70 |
#endif |
... | ... | |
664 | 665 |
kvm_check_extension(s, KVM_CAP_X86_ROBUST_SINGLESTEP); |
665 | 666 |
#endif |
666 | 667 |
|
668 |
s->debugregs = 0; |
|
669 |
#ifdef KVM_CAP_DEBUGREGS |
|
670 |
s->debugregs = kvm_check_extension(s, KVM_CAP_DEBUGREGS); |
|
671 |
#endif |
|
672 |
|
|
667 | 673 |
ret = kvm_arch_init(s, smp_cpus); |
668 | 674 |
if (ret < 0) |
669 | 675 |
goto err; |
... | ... | |
939 | 945 |
return kvm_state->robust_singlestep; |
940 | 946 |
} |
941 | 947 |
|
948 |
int kvm_has_debugregs(void) |
|
949 |
{ |
|
950 |
return kvm_state->debugregs; |
|
951 |
} |
|
952 |
|
|
942 | 953 |
void kvm_setup_guest_memory(void *start, size_t size) |
943 | 954 |
{ |
944 | 955 |
if (!kvm_has_sync_mmu()) { |
b/kvm.h | ||
---|---|---|
40 | 40 |
int kvm_has_sync_mmu(void); |
41 | 41 |
int kvm_has_vcpu_events(void); |
42 | 42 |
int kvm_has_robust_singlestep(void); |
43 |
int kvm_has_debugregs(void); |
|
43 | 44 |
|
44 | 45 |
#ifdef NEED_CPU_H |
45 | 46 |
int kvm_init_vcpu(CPUState *env); |
b/target-i386/kvm.c | ||
---|---|---|
874 | 874 |
return ret; |
875 | 875 |
} |
876 | 876 |
|
877 |
static int kvm_put_debugregs(CPUState *env) |
|
878 |
{ |
|
879 |
#ifdef KVM_CAP_DEBUGREGS |
|
880 |
struct kvm_debugregs dbgregs; |
|
881 |
int i; |
|
882 |
|
|
883 |
if (!kvm_has_debugregs()) { |
|
884 |
return 0; |
|
885 |
} |
|
886 |
|
|
887 |
for (i = 0; i < 4; i++) { |
|
888 |
dbgregs.db[i] = env->dr[i]; |
|
889 |
} |
|
890 |
dbgregs.dr6 = env->dr[6]; |
|
891 |
dbgregs.dr7 = env->dr[7]; |
|
892 |
dbgregs.flags = 0; |
|
893 |
|
|
894 |
return kvm_vcpu_ioctl(env, KVM_SET_DEBUGREGS, &dbgregs); |
|
895 |
#else |
|
896 |
return 0; |
|
897 |
#endif |
|
898 |
} |
|
899 |
|
|
900 |
static int kvm_get_debugregs(CPUState *env) |
|
901 |
{ |
|
902 |
#ifdef KVM_CAP_DEBUGREGS |
|
903 |
struct kvm_debugregs dbgregs; |
|
904 |
int i, ret; |
|
905 |
|
|
906 |
if (!kvm_has_debugregs()) { |
|
907 |
return 0; |
|
908 |
} |
|
909 |
|
|
910 |
ret = kvm_vcpu_ioctl(env, KVM_GET_DEBUGREGS, &dbgregs); |
|
911 |
if (ret < 0) { |
|
912 |
return ret; |
|
913 |
} |
|
914 |
for (i = 0; i < 4; i++) { |
|
915 |
env->dr[i] = dbgregs.db[i]; |
|
916 |
} |
|
917 |
env->dr[4] = env->dr[6] = dbgregs.dr6; |
|
918 |
env->dr[5] = env->dr[7] = dbgregs.dr7; |
|
919 |
#endif |
|
920 |
|
|
921 |
return 0; |
|
922 |
} |
|
923 |
|
|
877 | 924 |
int kvm_arch_put_registers(CPUState *env, int level) |
878 | 925 |
{ |
879 | 926 |
int ret; |
... | ... | |
909 | 956 |
if (ret < 0) |
910 | 957 |
return ret; |
911 | 958 |
|
959 |
ret = kvm_put_debugregs(env); |
|
960 |
if (ret < 0) |
|
961 |
return ret; |
|
962 |
|
|
912 | 963 |
return 0; |
913 | 964 |
} |
914 | 965 |
|
... | ... | |
940 | 991 |
if (ret < 0) |
941 | 992 |
return ret; |
942 | 993 |
|
994 |
ret = kvm_get_debugregs(env); |
|
995 |
if (ret < 0) |
|
996 |
return ret; |
|
997 |
|
|
943 | 998 |
return 0; |
944 | 999 |
} |
945 | 1000 |
|
Also available in: Unified diff