diff -ru qemu-2.1.0-rc2/cpus.c qemu-2.1.0-rc2-fixed/cpus.c --- qemu-2.1.0-rc2/cpus.c 2014-07-15 23:49:14.000000000 +0200 +++ qemu-2.1.0-rc2-fixed/cpus.c 2014-07-17 15:09:09.306696284 +0200 @@ -505,6 +505,15 @@ } } +void cpu_synchronize_all_states_always(void) +{ + CPUState *cpu; + + CPU_FOREACH(cpu) { + cpu_synchronize_state_always(cpu); + } +} + void cpu_synchronize_all_post_reset(void) { CPUState *cpu; diff -ru qemu-2.1.0-rc2/hw/i386/kvm/clock.c qemu-2.1.0-rc2-fixed/hw/i386/kvm/clock.c --- qemu-2.1.0-rc2/hw/i386/kvm/clock.c 2014-07-15 23:49:14.000000000 +0200 +++ qemu-2.1.0-rc2-fixed/hw/i386/kvm/clock.c 2014-07-17 15:08:25.627063756 +0200 @@ -126,7 +126,7 @@ return; } - cpu_synchronize_all_states(); + cpu_synchronize_all_states_always(); ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data); if (ret < 0) { fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret)); diff -ru qemu-2.1.0-rc2/include/sysemu/cpus.h qemu-2.1.0-rc2-fixed/include/sysemu/cpus.h --- qemu-2.1.0-rc2/include/sysemu/cpus.h 2014-07-15 23:49:14.000000000 +0200 +++ qemu-2.1.0-rc2-fixed/include/sysemu/cpus.h 2014-07-17 15:09:23.256578916 +0200 @@ -7,6 +7,7 @@ void pause_all_vcpus(void); void cpu_stop_current(void); +void cpu_synchronize_all_states_always(void); void cpu_synchronize_all_states(void); void cpu_synchronize_all_post_reset(void); void cpu_synchronize_all_post_init(void); diff -ru qemu-2.1.0-rc2/include/sysemu/kvm.h qemu-2.1.0-rc2-fixed/include/sysemu/kvm.h --- qemu-2.1.0-rc2/include/sysemu/kvm.h 2014-07-15 23:49:14.000000000 +0200 +++ qemu-2.1.0-rc2-fixed/include/sysemu/kvm.h 2014-07-17 15:11:54.855303171 +0200 @@ -346,9 +346,11 @@ #endif /* NEED_CPU_H */ void kvm_cpu_synchronize_state(CPUState *cpu); +void kvm_cpu_synchronize_state_always(CPUState *cpu); void kvm_cpu_synchronize_post_reset(CPUState *cpu); void kvm_cpu_synchronize_post_init(CPUState *cpu); + /* generic hooks - to be moved/refactored once there are more users */ static inline void cpu_synchronize_state(CPUState *cpu) @@ -358,6 +360,13 @@ } } +static inline void cpu_synchronize_state_always(CPUState *cpu) +{ + if (kvm_enabled()) { + kvm_cpu_synchronize_state_always(cpu); + } +} + static inline void cpu_synchronize_post_reset(CPUState *cpu) { if (kvm_enabled()) { diff -ru qemu-2.1.0-rc2/kvm-all.c qemu-2.1.0-rc2-fixed/kvm-all.c --- qemu-2.1.0-rc2/kvm-all.c 2014-07-15 23:49:14.000000000 +0200 +++ qemu-2.1.0-rc2-fixed/kvm-all.c 2014-07-17 15:14:04.884208826 +0200 @@ -1652,6 +1652,13 @@ s->coalesced_flush_in_progress = false; } +static void do_kvm_cpu_synchronize_state_always(void *arg) +{ + CPUState *cpu = arg; + + kvm_arch_get_registers(cpu); +} + static void do_kvm_cpu_synchronize_state(void *arg) { CPUState *cpu = arg; @@ -1669,6 +1676,11 @@ } } +void kvm_cpu_synchronize_state_always(CPUState *cpu) +{ + run_on_cpu(cpu, do_kvm_cpu_synchronize_state_always, cpu); +} + void kvm_cpu_synchronize_post_reset(CPUState *cpu) { kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE);