From 18c1668e4fe99da6124b7228704008fe070f643d Mon Sep 17 00:00:00 2001
From: Zhang Xiantao <xiantao.zhang@intel.com>
Date: Mon, 3 Dec 2007 17:16:34 +0800
Subject: [PATCH] kvm: qemu: Using kvm_arch_try_push_interrupts to hold arch-sepcific stuff.
In this patch, kvm_arch_try_push_interrupts is used to handle arch-specific
operations for try_push_interrupts.
Signed-off-by: Zhang Xiantao <xiantao.zhang@intel.com>
---
 qemu/qemu-kvm-x86.c |   21 +++++++++++++++++++++
 qemu/qemu-kvm.c     |   17 +----------------
 qemu/qemu-kvm.h     |    2 ++
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
index bb11395..f2583a2 100644
--- a/qemu/qemu-kvm-x86.c
+++ b/qemu/qemu-kvm-x86.c
@@ -595,4 +595,25 @@ int kvm_arch_has_work(CPUState *env)
 	return 1;
     return 0;
 }
+
+int kvm_arch_try_push_interrupts(void *opaque)
+{
+    CPUState *env = cpu_single_env;
+    int r, irq;
+
+    if (env->ready_for_interrupt_injection &&
+        (env->interrupt_request & CPU_INTERRUPT_HARD) &&
+        (env->eflags & IF_MASK)) {
+            env->interrupt_request &= ~CPU_INTERRUPT_HARD;
+	    irq = cpu_get_pic_interrupt(env);
+	    if (irq >= 0) {
+		r = kvm_inject_irq(kvm_context, env->cpu_index, irq);
+		if (r < 0)
+		    printf("cpu %d fail inject %x\n", env->cpu_index, irq);
+	    }
+    }
+
+    return (env->interrupt_request & CPU_INTERRUPT_HARD) != 0;
+}
+
 #endif
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index ba02f49..91fa55f 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -90,22 +90,7 @@ void kvm_apic_init(CPUState *env)
 
 static int try_push_interrupts(void *opaque)
 {
-    CPUState *env = cpu_single_env;
-    int r, irq;
-
-    if (env->ready_for_interrupt_injection &&
-        (env->interrupt_request & CPU_INTERRUPT_HARD) &&
-        (env->eflags & IF_MASK)) {
-            env->interrupt_request &= ~CPU_INTERRUPT_HARD;
-	    irq = cpu_get_pic_interrupt(env);
-	    if (irq >= 0) {
-		r = kvm_inject_irq(kvm_context, env->cpu_index, irq);
-		if (r < 0)
-		    printf("cpu %d fail inject %x\n", env->cpu_index, irq);
-	    }
-    }
-
-    return (env->interrupt_request & CPU_INTERRUPT_HARD) != 0;
+    return kvm_arch_try_push_interrupts(opaque);
 }
 
 static void post_kvm_run(void *opaque, int vcpu)
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index a6d2ed0..fceb173 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -35,7 +35,9 @@ void kvm_arch_load_regs(CPUState *env);
 int kvm_arch_qemu_init_env(CPUState *cenv);
 int kvm_arch_halt(void *opaque, int vcpu);
 void kvm_arch_pre_kvm_run(void *opaque, int vcpu);
+void kvm_arch_post_kvm_run(void *opaque, int vcpu);
 int kvm_arch_has_work(CPUState *env);
+int kvm_arch_try_push_interrupts(void *opaque);
 
 #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

