Revision 452e4751 kvm-all.c

b/kvm-all.c
153 153
    }
154 154
}
155 155

  
156
static void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
157
{
158
    if (env == cpu_single_env) {
159
        func(data);
160
        return;
161
    }
162
    abort();
163
}
164

  
156 165
int kvm_init_vcpu(CPUState *env)
157 166
{
158 167
    KVMState *s = kvm_state;
......
901 910
    return !TAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
902 911
}
903 912

  
913
struct kvm_set_guest_debug_data {
914
    struct kvm_guest_debug dbg;
915
    CPUState *env;
916
    int err;
917
};
918

  
919
static void kvm_invoke_set_guest_debug(void *data)
920
{
921
    struct kvm_set_guest_debug_data *dbg_data = data;
922
    dbg_data->err = kvm_vcpu_ioctl(dbg_data->env, KVM_SET_GUEST_DEBUG, &dbg_data->dbg);
923
}
924

  
904 925
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
905 926
{
906
    struct kvm_guest_debug dbg;
927
    struct kvm_set_guest_debug_data data;
907 928

  
908
    dbg.control = 0;
929
    data.dbg.control = 0;
909 930
    if (env->singlestep_enabled)
910
        dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
931
        data.dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
911 932

  
912
    kvm_arch_update_guest_debug(env, &dbg);
913
    dbg.control |= reinject_trap;
933
    kvm_arch_update_guest_debug(env, &data.dbg);
934
    data.dbg.control |= reinject_trap;
935
    data.env = env;
914 936

  
915
    return kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg);
937
    on_vcpu(env, kvm_invoke_set_guest_debug, &data);
938
    return data.err;
916 939
}
917 940

  
918 941
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,

Also available in: Unified diff