Instead of having special case in vcpu event loop.

Signed-off-by: Gleb Natapov <[email protected]>
---
 cpu-defs.h |    2 --
 qemu-kvm.c |   51 +++++++++++++++++----------------------------------
 2 files changed, 17 insertions(+), 36 deletions(-)

diff --git a/cpu-defs.h b/cpu-defs.h
index e17209a..7570096 100644
--- a/cpu-defs.h
+++ b/cpu-defs.h
@@ -140,8 +140,6 @@ typedef struct CPUWatchpoint {
 struct qemu_work_item;
 
 struct KVMCPUState {
-    int sipi_needed;
-    int init;
     pthread_t thread;
     int signalled;
     int stop;
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 5fa7154..af3fd91 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -134,19 +134,6 @@ void kvm_update_interrupt_request(CPUState *env)
     }
 }
 
-void kvm_update_after_sipi(CPUState *env)
-{
-    env->kvm_cpu_state.sipi_needed = 1;
-    kvm_update_interrupt_request(env);
-}
-
-void kvm_apic_init(CPUState *env)
-{
-    if (env->cpu_index != 0)
-       env->kvm_cpu_state.init = 1;
-    kvm_update_interrupt_request(env);
-}
-
 #include <signal.h>
 
 static int kvm_try_push_interrupts(void *opaque)
@@ -331,30 +318,32 @@ static void kvm_vm_state_change_handler(void *context, 
int running, int reason)
        pause_all_threads();
 }
 
-static void update_regs_for_sipi(CPUState *env)
+static void update_regs_for_sipi(void *data)
 {
-    kvm_arch_update_regs_for_sipi(env);
-    env->kvm_cpu_state.sipi_needed = 0;
+    kvm_arch_update_regs_for_sipi(data);
 }
 
-static void update_regs_for_init(CPUState *env)
+void kvm_update_after_sipi(CPUState *env)
 {
-#ifdef TARGET_I386
-    SegmentCache cs = env->segs[R_CS];
-#endif
-
-    cpu_reset(env);
+    on_vcpu(env, update_regs_for_sipi, env);
+}
 
-#ifdef TARGET_I386
-    /* restore SIPI vector */
-    if(env->kvm_cpu_state.sipi_needed)
-        env->segs[R_CS] = cs;
-#endif
+static void update_regs_for_init(void *data)
+{
+    CPUState *env = data;
 
-    env->kvm_cpu_state.init = 0;
     kvm_arch_load_regs(env);
 }
 
+void kvm_apic_init(CPUState *env)
+{
+    if (env->cpu_index != 0) {
+        if (env->kvm_cpu_state.created)
+            on_vcpu(env, update_regs_for_init, env);
+    } else
+        kvm_update_interrupt_request(env);
+}
+
 static void setup_kernel_sigmask(CPUState *env)
 {
     sigset_t set;
@@ -406,12 +395,6 @@ static int kvm_main_loop_cpu(CPUState *env)
            kvm_main_loop_wait(env, 1000);
        if (env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI))
            env->halted = 0;
-    if (!kvm_irqchip_in_kernel(kvm_context)) {
-           if (env->kvm_cpu_state.init)
-               update_regs_for_init(env);
-           if (env->kvm_cpu_state.sipi_needed)
-               update_regs_for_sipi(env);
-    }
        if (!env->halted || kvm_irqchip_in_kernel(kvm_context))
            kvm_cpu_exec(env);
        env->exit_request = 0;
-- 
1.6.2.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to