Patchwork [v2] cpu: Move cpu state syncs up into cpu_dump_state()

login
register
mail settings
Submitter James Hogan
Date Aug. 27, 2013, 11:19 a.m.
Message ID <1377602350-32004-1-git-send-email-james.hogan@imgtec.com>
Download mbox | patch
Permalink /patch/270088/
State New
Headers show

Comments

James Hogan - Aug. 27, 2013, 11:19 a.m.
The x86 and ppc targets call cpu_synchronize_state() from their
*_cpu_dump_state() callbacks to ensure that up to date state is dumped
when KVM is enabled (for example when a KVM internal error occurs).

Move this call up into the generic cpu_dump_state() function so that
other KVM targets (namely MIPS) can take advantage of it.

This requires kvm_cpu_synchronize_state() and cpu_synchronize_state() to
be moved out of the #ifdef NEED_CPU_H in <sysemu/kvm.h> so that they're
accessible to qom/cpu.c.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Andreas Färber <afaerber@suse.de>
Cc: Alexander Graf <agraf@suse.de>
Cc: Gleb Natapov <gleb@redhat.com>
Cc: qemu-ppc@nongnu.org
Cc: kvm@vger.kernel.org
---
Changes in v2 (was kvm: sync cpu state on internal error before dump)
 - rewrite to fix in cpu_dump_state() (Gleb Natapov)
---
 include/sysemu/kvm.h   | 20 ++++++++++----------
 qom/cpu.c              |  1 +
 target-i386/helper.c   |  2 --
 target-ppc/translate.c |  2 --
 4 files changed, 11 insertions(+), 14 deletions(-)
Gleb Natapov - Sept. 1, 2013, 9:53 a.m.
On Tue, Aug 27, 2013 at 12:19:10PM +0100, James Hogan wrote:
> The x86 and ppc targets call cpu_synchronize_state() from their
> *_cpu_dump_state() callbacks to ensure that up to date state is dumped
> when KVM is enabled (for example when a KVM internal error occurs).
> 
> Move this call up into the generic cpu_dump_state() function so that
> other KVM targets (namely MIPS) can take advantage of it.
> 
> This requires kvm_cpu_synchronize_state() and cpu_synchronize_state() to
> be moved out of the #ifdef NEED_CPU_H in <sysemu/kvm.h> so that they're
> accessible to qom/cpu.c.
> 
Applied, thanks.

> Signed-off-by: James Hogan <james.hogan@imgtec.com>
> Cc: Andreas Färber <afaerber@suse.de>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Gleb Natapov <gleb@redhat.com>
> Cc: qemu-ppc@nongnu.org
> Cc: kvm@vger.kernel.org
> ---
> Changes in v2 (was kvm: sync cpu state on internal error before dump)
>  - rewrite to fix in cpu_dump_state() (Gleb Natapov)
> ---
>  include/sysemu/kvm.h   | 20 ++++++++++----------
>  qom/cpu.c              |  1 +
>  target-i386/helper.c   |  2 --
>  target-ppc/translate.c |  2 --
>  4 files changed, 11 insertions(+), 14 deletions(-)
> 
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index de74411..71a0186 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -270,16 +270,6 @@ int kvm_check_extension(KVMState *s, unsigned int extension);
>  
>  uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
>                                        uint32_t index, int reg);
> -void kvm_cpu_synchronize_state(CPUState *cpu);
> -
> -/* generic hooks - to be moved/refactored once there are more users */
> -
> -static inline void cpu_synchronize_state(CPUState *cpu)
> -{
> -    if (kvm_enabled()) {
> -        kvm_cpu_synchronize_state(cpu);
> -    }
> -}
>  
>  #if !defined(CONFIG_USER_ONLY)
>  int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
> @@ -288,9 +278,19 @@ int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
>  
>  #endif /* NEED_CPU_H */
>  
> +void kvm_cpu_synchronize_state(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)
> +{
> +    if (kvm_enabled()) {
> +        kvm_cpu_synchronize_state(cpu);
> +    }
> +}
> +
>  static inline void cpu_synchronize_post_reset(CPUState *cpu)
>  {
>      if (kvm_enabled()) {
> diff --git a/qom/cpu.c b/qom/cpu.c
> index aa95108..cfe7e24 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -174,6 +174,7 @@ void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
>      CPUClass *cc = CPU_GET_CLASS(cpu);
>  
>      if (cc->dump_state) {
> +        cpu_synchronize_state(cpu);
>          cc->dump_state(cpu, f, cpu_fprintf, flags);
>      }
>  }
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index bf3e2ac..2aecfd0 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -188,8 +188,6 @@ void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
>      char cc_op_name[32];
>      static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" };
>  
> -    cpu_synchronize_state(cs);
> -
>      eflags = cpu_compute_eflags(env);
>  #ifdef TARGET_X86_64
>      if (env->hflags & HF_CS64_MASK) {
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index f07d70d..c6a6ff8 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -9536,8 +9536,6 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
>      CPUPPCState *env = &cpu->env;
>      int i;
>  
> -    cpu_synchronize_state(cs);
> -
>      cpu_fprintf(f, "NIP " TARGET_FMT_lx "   LR " TARGET_FMT_lx " CTR "
>                  TARGET_FMT_lx " XER " TARGET_FMT_lx "\n",
>                  env->nip, env->lr, env->ctr, cpu_read_xer(env));
> -- 
> 1.8.1.2
> 

--
			Gleb.

Patch

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index de74411..71a0186 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -270,16 +270,6 @@  int kvm_check_extension(KVMState *s, unsigned int extension);
 
 uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
                                       uint32_t index, int reg);
-void kvm_cpu_synchronize_state(CPUState *cpu);
-
-/* generic hooks - to be moved/refactored once there are more users */
-
-static inline void cpu_synchronize_state(CPUState *cpu)
-{
-    if (kvm_enabled()) {
-        kvm_cpu_synchronize_state(cpu);
-    }
-}
 
 #if !defined(CONFIG_USER_ONLY)
 int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
@@ -288,9 +278,19 @@  int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
 
 #endif /* NEED_CPU_H */
 
+void kvm_cpu_synchronize_state(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)
+{
+    if (kvm_enabled()) {
+        kvm_cpu_synchronize_state(cpu);
+    }
+}
+
 static inline void cpu_synchronize_post_reset(CPUState *cpu)
 {
     if (kvm_enabled()) {
diff --git a/qom/cpu.c b/qom/cpu.c
index aa95108..cfe7e24 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -174,6 +174,7 @@  void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
     CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->dump_state) {
+        cpu_synchronize_state(cpu);
         cc->dump_state(cpu, f, cpu_fprintf, flags);
     }
 }
diff --git a/target-i386/helper.c b/target-i386/helper.c
index bf3e2ac..2aecfd0 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -188,8 +188,6 @@  void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
     char cc_op_name[32];
     static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" };
 
-    cpu_synchronize_state(cs);
-
     eflags = cpu_compute_eflags(env);
 #ifdef TARGET_X86_64
     if (env->hflags & HF_CS64_MASK) {
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index f07d70d..c6a6ff8 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -9536,8 +9536,6 @@  void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
     CPUPPCState *env = &cpu->env;
     int i;
 
-    cpu_synchronize_state(cs);
-
     cpu_fprintf(f, "NIP " TARGET_FMT_lx "   LR " TARGET_FMT_lx " CTR "
                 TARGET_FMT_lx " XER " TARGET_FMT_lx "\n",
                 env->nip, env->lr, env->ctr, cpu_read_xer(env));