diff mbox

[08/19] qemu-kvm: Use upstream kvm_arch_get/put_registers

Message ID ee2e8c12602cdbf753fcbbcfc81cec9c925a2129.1304538230.git.jan.kiszka@web.de (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Kiszka May 4, 2011, 7:43 p.m. UTC
From: Jan Kiszka <jan.kiszka@siemens.com>

Having two implementations of these services used to be a source of
constant pain in the past. Now they are almost equivalent, and we can
switch to upstream's versions. We just need to import the APIC bits into
the upstream code until they are merge as well.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm-ia64.c   |    4 +-
 qemu-kvm-x86.c    |   67 -----------------------------------------------------
 qemu-kvm.c        |    8 +++---
 qemu-kvm.h        |    2 -
 target-i386/kvm.c |   12 +++++++--
 5 files changed, 15 insertions(+), 78 deletions(-)
diff mbox

Patch

diff --git a/qemu-kvm-ia64.c b/qemu-kvm-ia64.c
index c3c7918..bda57b6 100644
--- a/qemu-kvm-ia64.c
+++ b/qemu-kvm-ia64.c
@@ -16,12 +16,12 @@  int kvm_arch_qemu_create_context(void)
     return 0;
 }
 
-void kvm_arch_load_regs(CPUState *env, int level)
+void kvm_arch_put_registers(CPUState *env, int level)
 {
 }
 
 
-void kvm_arch_save_regs(CPUState *env)
+void kvm_arch_get_registers(CPUState *env)
 {
 }
 
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 9d546d0..f7cd30d 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -474,73 +474,6 @@  int kvm_arch_qemu_create_context(void)
     return 0;
 }
 
-#define XSAVE_CWD_RIP     2
-#define XSAVE_CWD_RDP     4
-#define XSAVE_MXCSR       6
-#define XSAVE_ST_SPACE    8
-#define XSAVE_XMM_SPACE   40
-#define XSAVE_XSTATE_BV   128
-#define XSAVE_YMMH_SPACE  144
-
-void kvm_arch_load_regs(CPUState *env, int level)
-{
-    int rc;
-
-    assert(kvm_cpu_is_stopped(env) || qemu_cpu_is_self(env));
-
-    kvm_getput_regs(env, 1);
-
-    kvm_put_xsave(env);
-    kvm_put_xcrs(env);
-
-    kvm_put_sregs(env);
-
-    rc = kvm_put_msrs(env, level);
-    if (rc < 0) {
-        perror("kvm__msrs FAILED");
-    }
-
-    if (level >= KVM_PUT_RESET_STATE) {
-        kvm_put_mp_state(env);
-        kvm_load_lapic(env);
-    }
-    if (level == KVM_PUT_FULL_STATE) {
-        if (env->kvm_vcpu_update_vapic) {
-            kvm_tpr_enable_vapic(env);
-        }
-    }
-
-    kvm_put_vcpu_events(env, level);
-    kvm_put_debugregs(env);
-
-    /* must be last */
-    kvm_guest_debug_workarounds(env);
-}
-
-void kvm_arch_save_regs(CPUState *env)
-{
-    int rc;
-
-    assert(kvm_cpu_is_stopped(env) || qemu_cpu_is_self(env));
-
-    kvm_getput_regs(env, 0);
-
-    kvm_get_xsave(env);
-    kvm_get_xcrs(env);
-
-    kvm_get_sregs(env);
-
-    rc = kvm_get_msrs(env);
-    if (rc < 0) {
-        perror("kvm_get_msrs FAILED");
-    }
-
-    kvm_get_mp_state(env);
-    kvm_save_lapic(env);
-    kvm_get_vcpu_events(env);
-    kvm_get_debugregs(env);
-}
-
 static int _kvm_arch_init_vcpu(CPUState *env)
 {
     kvm_arch_reset_vcpu(env);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index d86fdcc..508580e 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -483,7 +483,7 @@  int kvm_run(CPUState *env)
 
   again:
     if (env->kvm_vcpu_dirty) {
-        kvm_arch_load_regs(env, KVM_PUT_RUNTIME_STATE);
+        kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
         env->kvm_vcpu_dirty = 0;
     }
     push_nmi(kvm);
@@ -1102,7 +1102,7 @@  static void do_kvm_cpu_synchronize_state(void *_env)
     CPUState *env = _env;
 
     if (!env->kvm_vcpu_dirty) {
-        kvm_arch_save_regs(env);
+        kvm_arch_get_registers(env);
         env->kvm_vcpu_dirty = 1;
     }
 }
@@ -1116,13 +1116,13 @@  void kvm_cpu_synchronize_state(CPUState *env)
 
 void kvm_cpu_synchronize_post_reset(CPUState *env)
 {
-    kvm_arch_load_regs(env, KVM_PUT_RESET_STATE);
+    kvm_arch_put_registers(env, KVM_PUT_RESET_STATE);
     env->kvm_vcpu_dirty = 0;
 }
 
 void kvm_cpu_synchronize_post_init(CPUState *env)
 {
-    kvm_arch_load_regs(env, KVM_PUT_FULL_STATE);
+    kvm_arch_put_registers(env, KVM_PUT_FULL_STATE);
     env->kvm_vcpu_dirty = 0;
 }
 
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 79eb90d..654ea2e 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -657,8 +657,6 @@  int kvm_qemu_destroy_memory_alias(uint64_t phys_start);
 
 int kvm_arch_qemu_create_context(void);
 
-void kvm_arch_save_regs(CPUState *env);
-void kvm_arch_load_regs(CPUState *env, int level);
 int kvm_arch_has_work(CPUState *env);
 void kvm_arch_process_irqchip_events(CPUState *env);
 int kvm_arch_try_push_interrupts(void *opaque);
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 7974e62..bbc324b 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -331,7 +331,6 @@  int kvm_arch_on_sigbus(int code, void *addr)
     return 0;
 }
 
-#ifdef OBSOLETE_KVM_IMPL
 static int kvm_inject_mce_oldstyle(CPUState *env)
 {
 #ifdef KVM_CAP_MCE
@@ -363,7 +362,6 @@  static int kvm_inject_mce_oldstyle(CPUState *env)
 #endif /* KVM_CAP_MCE */
     return 0;
 }
-#endif
 
 static void cpu_update_state(void *opaque, int running, int reason)
 {
@@ -1454,7 +1452,6 @@  static int kvm_get_debugregs(CPUState *env)
     return 0;
 }
 
-#ifdef OBSOLETE_KVM_IMPL
 int kvm_arch_put_registers(CPUState *env, int level)
 {
     int ret;
@@ -1491,6 +1488,8 @@  int kvm_arch_put_registers(CPUState *env, int level)
         if (ret < 0) {
             return ret;
         }
+
+        kvm_load_lapic(env);
     }
     ret = kvm_put_vcpu_events(env, level);
     if (ret < 0) {
@@ -1500,6 +1499,11 @@  int kvm_arch_put_registers(CPUState *env, int level)
     if (ret < 0) {
         return ret;
     }
+    if (level == KVM_PUT_FULL_STATE) {
+        if (env->kvm_vcpu_update_vapic) {
+            kvm_tpr_enable_vapic(env);
+        }
+    }
     /* must be last */
     ret = kvm_guest_debug_workarounds(env);
     if (ret < 0) {
@@ -1538,6 +1542,7 @@  int kvm_arch_get_registers(CPUState *env)
     if (ret < 0) {
         return ret;
     }
+    kvm_save_lapic(env);
     ret = kvm_get_vcpu_events(env);
     if (ret < 0) {
         return ret;
@@ -1549,6 +1554,7 @@  int kvm_arch_get_registers(CPUState *env)
     return 0;
 }
 
+#ifdef OBSOLETE_KVM_IMPL
 void kvm_arch_pre_run(CPUState *env, struct kvm_run *run)
 {
     int ret;