]> xenbits.xensource.com Git - qemu-xen.git/commitdiff
kqemu_cpu_interrupt support for win32 (Filip Navara)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 3 Sep 2005 17:55:47 +0000 (17:55 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 3 Sep 2005 17:55:47 +0000 (17:55 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1566 c046a42c-6fe2-441c-8c8c-71466251a162

exec-all.h
kqemu.c
vl.c

index 33780660feee05b0921e16acf4fbc1adf0da0b93..045648c062c776d7c1d2b159c9ecd4a08d4a36e7 100644 (file)
@@ -611,6 +611,7 @@ int kqemu_cpu_exec(CPUState *env);
 void kqemu_flush_page(CPUState *env, target_ulong addr);
 void kqemu_flush(CPUState *env, int global);
 void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr);
+void kqemu_cpu_interrupt(CPUState *env);
 
 static inline int kqemu_is_ok(CPUState *env)
 {
diff --git a/kqemu.c b/kqemu.c
index 94792c09f95c5f6dbf12cfaeaa0aae360847c2f2..70cfe2879c3be07c048acc41b1544ccdc3690209 100644 (file)
--- a/kqemu.c
+++ b/kqemu.c
@@ -596,11 +596,14 @@ int kqemu_cpu_exec(CPUState *env)
     }
 
 #ifdef _WIN32
-    DeviceIoControl(kqemu_fd, KQEMU_EXEC,
-                   kenv, sizeof(struct kqemu_cpu_state),
-                   kenv, sizeof(struct kqemu_cpu_state),
-                   &temp, NULL);
-    ret = kenv->retval;
+    if (DeviceIoControl(kqemu_fd, KQEMU_EXEC,
+                        kenv, sizeof(struct kqemu_cpu_state),
+                        kenv, sizeof(struct kqemu_cpu_state),
+                        &temp, NULL)) {
+        ret = kenv->retval;
+    } else {
+        ret = -1;
+    }
 #else
 #if KQEMU_VERSION >= 0x010100
     ioctl(kqemu_fd, KQEMU_EXEC, kenv);
@@ -737,4 +740,13 @@ int kqemu_cpu_exec(CPUState *env)
     return 0;
 }
 
+void kqemu_cpu_interrupt(CPUState *env)
+{
+#if defined(_WIN32) && KQEMU_VERSION >= 0x010101
+    /* cancelling the I/O request causes KQEMU to finish executing the 
+       current block and successfully returning. */
+    CancelIo(kqemu_fd);
+#endif
+}
+
 #endif
diff --git a/vl.c b/vl.c
index 9819916a11f408e565c322557c4666f2ccd2b88e..ea46bdc9c15a96b422f8360ff2dd3e35bb0a34d5 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -875,6 +875,9 @@ static void host_alarm_handler(int host_signum)
                            qemu_get_clock(rt_clock))) {
         /* stop the cpu because a timer occured */
         cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
+#ifdef USE_KQEMU
+        kqemu_cpu_interrupt(global_env);
+#endif
     }
 }