qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/4] cpu model corrections/updates: add kvm_early_in


From: john cooper
Subject: [Qemu-devel] [PATCH 2/4] cpu model corrections/updates: add kvm_early_init_vcpu()
Date: Wed, 24 Nov 2010 17:44:45 -0500
User-agent: Thunderbird 2.0.0.9 (X11/20071115)

Allow an optional qemu_early_init_vcpu() such that
kvm_arch_get_supported_cpuid() can be used from
cpu_x86_register().  Without this minimal setup
kvm_arch_get_supported_cpuid() gags kvm_ioctl() via
passing a NULL initialized KVMState *.

Signed-off-by: john cooper <address@hidden>
---

diff --git a/cpus.c b/cpus.c
index 91a0fb1..a871856 100644
--- a/cpus.c
+++ b/cpus.c
@@ -260,6 +260,14 @@ void qemu_main_loop_start(void)
 {
 }
 
+void qemu_early_init_vcpu(void *_env)
+{
+    CPUState *env = _env;
+
+    if (kvm_enabled())
+        kvm_early_init_vcpu(env);
+}
+
 void qemu_init_vcpu(void *_env)
 {
     CPUState *env = _env;
diff --git a/kvm-all.c b/kvm-all.c
index 37b99c7..5a91353 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -188,25 +188,48 @@ int kvm_pit_in_kernel(void)
 }
 
 
-int kvm_init_vcpu(CPUState *env)
+/* env->kvm_state is needed early by kvm_check_extension()
+ * break it out so it may be setup early where needed
+ */
+int kvm_early_init_vcpu(CPUState *env)
 {
     KVMState *s = kvm_state;
-    long mmap_size;
     int ret;
 
-    DPRINTF("kvm_init_vcpu\n");
+    DPRINTF("kvm_early_init_vcpu\n");
+
+    if (env->kvm_state) {      /* already setup */
+        return 0;
+    }
 
     ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
     if (ret < 0) {
         DPRINTF("kvm_create_vcpu failed\n");
-        goto err;
     }
+    else {
+        env->kvm_fd = ret;
+        env->kvm_state = s;
+    }
+    return ret;
+}
 
-    env->kvm_fd = ret;
-    env->kvm_state = s;
+int kvm_init_vcpu(CPUState *env)
+{
+    KVMState *s;
+    long mmap_size;
+    int ret;
+
+    DPRINTF("kvm_init_vcpu\n");
+
+    ret = kvm_early_init_vcpu(env);
+    if (ret < 0) {
+        goto err;
+    }
 
+    s = env->kvm_state;
     mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
     if (mmap_size < 0) {
+        ret = mmap_size;
         DPRINTF("KVM_GET_VCPU_MMAP_SIZE failed\n");
         goto err;
     }
diff --git a/kvm.h b/kvm.h
index 60a9b42..c8548f9 100644
--- a/kvm.h
+++ b/kvm.h
@@ -44,6 +44,7 @@ int kvm_has_xsave(void);
 int kvm_has_xcrs(void);
 
 #ifdef NEED_CPU_H
+int kvm_early_init_vcpu(CPUState *env);
 int kvm_init_vcpu(CPUState *env);
 
 int kvm_cpu_exec(CPUState *env);
diff --git a/qemu-common.h b/qemu-common.h
index b3957f1..7403761 100644
--- a/qemu-common.h
+++ b/qemu-common.h
@@ -285,8 +285,10 @@ struct qemu_work_item {
 };
 
 #ifdef CONFIG_USER_ONLY
+#define qemu_early_init_vcpu(env) do { } while (0)
 #define qemu_init_vcpu(env) do { } while (0)
 #else
+void qemu_early_init_vcpu(void *env);
 void qemu_init_vcpu(void *env);
 #endif
 
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 26ea1e5..057ee90 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -1139,6 +1139,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
             cpu_set_debug_excp_handler(breakpoint_handler);
 #endif
     }
+    qemu_early_init_vcpu(env);
     if (cpu_x86_register(env, cpu_model) < 0) {
         cpu_x86_close(env);
         return NULL;

-- 
address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]