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