From f8f016eb6e50405668855020d414e8a2cf080fba Mon Sep 17 00:00:00 2001
From: Zhang Xiantao <xiantao.zhang@intel.com>
Date: Mon, 3 Dec 2007 15:30:45 +0800
Subject: [PATCH] kvm: qemu: split kvm_qemu_create_context.
This patche splits kvm_qemu_create_context and moves x86-specific
to qemu-kvm-x86.c. Temporarily set kvm_has_msr_star to a gloabal variant.
Signed-off-by: Zhang Xiantao <xiantao.zhang@intel.com>
---
 qemu/qemu-kvm-x86.c |   20 ++++++++++++++++++++
 qemu/qemu-kvm.c     |   18 ++++--------------
 qemu/qemu-kvm.h     |    1 +
 3 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
index 6c4cfb2..3916bbd 100644
--- a/qemu/qemu-kvm-x86.c
+++ b/qemu/qemu-kvm-x86.c
@@ -15,4 +15,24 @@ extern int kvm_irqchip;
 #include <pthread.h>
 #include <sys/utsname.h>
 
+static struct kvm_msr_list *kvm_msr_list;
+extern unsigned int kvm_shadow_memory;
+extern kvm_context_t kvm_context;
+extern int kvm_has_msr_star;
+
+int kvm_arch_qemu_create_context(void)
+{
+    int i;
+    if (kvm_shadow_memory)
+        kvm_set_shadow_pages(kvm_context, kvm_shadow_memory);
+
+    kvm_msr_list = kvm_get_msr_list(kvm_context);
+    if (!kvm_msr_list)
+		return -1;
+    for (i = 0; i < kvm_msr_list->nmsrs; ++i)
+	if (kvm_msr_list->indices[i] == MSR_STAR)
+	    kvm_has_msr_star = 1;
+	return 0;
+}
+
 #endif
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 73004c0..a18a2b8 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -27,11 +27,9 @@ int kvm_irqchip = 1;
 extern void perror(const char *s);
 
 kvm_context_t kvm_context;
-static struct kvm_msr_list *kvm_msr_list;
-static int kvm_has_msr_star;
+int kvm_has_msr_star;
 
 extern int smp_cpus;
-extern unsigned int kvm_shadow_memory;
 
 pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
 static __thread CPUState *vcpu_env;
@@ -1006,8 +1004,7 @@ int kvm_qemu_init()
 
 int kvm_qemu_create_context(void)
 {
-    int i;
-
+    int r;
     if (!kvm_irqchip) {
         kvm_disable_irqchip_creation(kvm_context);
     }
@@ -1015,16 +1012,9 @@ int kvm_qemu_create_context(void)
 	kvm_qemu_destroy();
 	return -1;
     }
-    if (kvm_shadow_memory)
-        kvm_set_shadow_pages(kvm_context, kvm_shadow_memory);
-    kvm_msr_list = kvm_get_msr_list(kvm_context);
-    if (!kvm_msr_list) {
+    r = kvm_arch_qemu_create_context();
+    if(r <0)
 	kvm_qemu_destroy();
-	return -1;
-    }
-    for (i = 0; i < kvm_msr_list->nmsrs; ++i)
-	if (kvm_msr_list->indices[i] == MSR_STAR)
-	    kvm_has_msr_star = 1;
     return 0;
 }
 
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index 57f70ec..61e3b0f 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -28,6 +28,7 @@ void kvm_update_interrupt_request(CPUState *env);
 void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr,
                                       unsigned long size,
                                       unsigned long phys_offset);
+int kvm_arch_qemu_create_context(void);
 
 #define ALIGN(x, y)  (((x)+(y)-1) & ~((y)-1))
 #define BITMAP_SIZE(m) (ALIGN(((m)>>TARGET_PAGE_BITS), HOST_LONG_BITS) / 8)
-- 
1.5.1.2

