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