Normally QEMU kvm_arch_get_registers() reads registers and sets a dirty flag which prevents further registers reading from KVM till kvm_arch_put_registers() executes and resets the flag.
However if we run QEMU with "-S" ("suspended"), then execute "info cpus" from the QEMU monitor, we end up with not reading registers in rtas_start_cpu() as qmp_query_cpus() calls kvm_cpu_synchronize_state() which leaves @kvm_vcpu_dirty=true what prevents kvm_cpu_synchronize_state() from synchronizing registers and we loose the values. This resets @kvm_vcpu_dirty flag as we do not have content which we really want to keep at this point as the CPU is halted. Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> --- We could also reset @kvm_vcpu_dirty in qmp_query_cpus() but that would be racy. --- hw/ppc/spapr_rtas.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 1cb276d..3dade5e 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -185,6 +185,8 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, sPAPREnvironment *spapr, /* This will make sure qemu state is up to date with kvm, and * mark it dirty so our changes get flushed back before the * new cpu enters */ + + cs->kvm_vcpu_dirty = false; kvm_cpu_synchronize_state(cs); env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME); -- 1.8.4.rc4