Index: exec-all.h =================================================================== RCS file: /cvsroot/qemu/qemu/exec-all.h,v retrieving revision 1.34 diff -u -p -r1.34 exec-all.h --- exec-all.h 24 Jul 2005 14:14:53 -0000 1.34 +++ exec-all.h 27 Jul 2005 20:53:43 -0000 @@ -607,6 +607,7 @@ int kqemu_init(CPUState *env); int kqemu_cpu_exec(CPUState *env); void kqemu_flush_page(CPUState *env, target_ulong addr); void kqemu_flush(CPUState *env, int global); +void kqemu_cpu_interrupt(CPUState *env); static inline int kqemu_is_ok(CPUState *env) { Index: kqemu.c =================================================================== RCS file: /cvsroot/qemu/qemu/kqemu.c,v retrieving revision 1.4 diff -u -p -r1.4 kqemu.c --- kqemu.c 24 Apr 2005 18:03:37 -0000 1.4 +++ kqemu.c 27 Jul 2005 20:53:24 -0000 @@ -456,11 +456,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); @@ -544,6 +547,15 @@ int kqemu_cpu_exec(CPUState *env) exit(1); } 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 Index: vl.c =================================================================== RCS file: /cvsroot/qemu/qemu/vl.c,v retrieving revision 1.133 diff -u -p -r1.133 vl.c --- vl.c 24 Jul 2005 18:44:55 -0000 1.133 +++ vl.c 27 Jul 2005 20:54:26 -0000 @@ -875,6 +875,9 @@ static void host_alarm_handler(int host_ 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 } }