From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45144) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W3IYH-0006QH-U3 for qemu-devel@nongnu.org; Tue, 14 Jan 2014 23:58:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W3IY5-0000km-AY for qemu-devel@nongnu.org; Tue, 14 Jan 2014 23:58:05 -0500 Received: from e23smtp02.au.ibm.com ([202.81.31.144]:52909) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W3IY4-0000kW-Hb for qemu-devel@nongnu.org; Tue, 14 Jan 2014 23:57:53 -0500 Received: from /spool/local by e23smtp02.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 15 Jan 2014 14:57:43 +1000 From: Alexey Kardashevskiy Date: Wed, 15 Jan 2014 15:57:39 +1100 Message-Id: <1389761859-10150-1-git-send-email-aik@ozlabs.ru> Subject: [Qemu-devel] [PATCH] spapr: reset @kvm_vcpu_dirty before starting CPU List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexey Kardashevskiy , Paolo Bonzini , qemu-ppc@nongnu.org, =?UTF-8?q?Andreas=20F=C3=A4rber?= , Alexander Graf 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 --- 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