Commit a332e112b73d641ca603066e46bb5b05d6c054fc
1 parent
ca0d1734
kqemu_cpu_interrupt support for win32 (Filip Navara)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1566 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
21 additions
and
5 deletions
exec-all.h
... | ... | @@ -611,6 +611,7 @@ int kqemu_cpu_exec(CPUState *env); |
611 | 611 | void kqemu_flush_page(CPUState *env, target_ulong addr); |
612 | 612 | void kqemu_flush(CPUState *env, int global); |
613 | 613 | void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr); |
614 | +void kqemu_cpu_interrupt(CPUState *env); | |
614 | 615 | |
615 | 616 | static inline int kqemu_is_ok(CPUState *env) |
616 | 617 | { | ... | ... |
kqemu.c
... | ... | @@ -596,11 +596,14 @@ int kqemu_cpu_exec(CPUState *env) |
596 | 596 | } |
597 | 597 | |
598 | 598 | #ifdef _WIN32 |
599 | - DeviceIoControl(kqemu_fd, KQEMU_EXEC, | |
600 | - kenv, sizeof(struct kqemu_cpu_state), | |
601 | - kenv, sizeof(struct kqemu_cpu_state), | |
602 | - &temp, NULL); | |
603 | - ret = kenv->retval; | |
599 | + if (DeviceIoControl(kqemu_fd, KQEMU_EXEC, | |
600 | + kenv, sizeof(struct kqemu_cpu_state), | |
601 | + kenv, sizeof(struct kqemu_cpu_state), | |
602 | + &temp, NULL)) { | |
603 | + ret = kenv->retval; | |
604 | + } else { | |
605 | + ret = -1; | |
606 | + } | |
604 | 607 | #else |
605 | 608 | #if KQEMU_VERSION >= 0x010100 |
606 | 609 | ioctl(kqemu_fd, KQEMU_EXEC, kenv); |
... | ... | @@ -737,4 +740,13 @@ int kqemu_cpu_exec(CPUState *env) |
737 | 740 | return 0; |
738 | 741 | } |
739 | 742 | |
743 | +void kqemu_cpu_interrupt(CPUState *env) | |
744 | +{ | |
745 | +#if defined(_WIN32) && KQEMU_VERSION >= 0x010101 | |
746 | + /* cancelling the I/O request causes KQEMU to finish executing the | |
747 | + current block and successfully returning. */ | |
748 | + CancelIo(kqemu_fd); | |
749 | +#endif | |
750 | +} | |
751 | + | |
740 | 752 | #endif | ... | ... |
vl.c
... | ... | @@ -875,6 +875,9 @@ static void host_alarm_handler(int host_signum) |
875 | 875 | qemu_get_clock(rt_clock))) { |
876 | 876 | /* stop the cpu because a timer occured */ |
877 | 877 | cpu_interrupt(global_env, CPU_INTERRUPT_EXIT); |
878 | +#ifdef USE_KQEMU | |
879 | + kqemu_cpu_interrupt(global_env); | |
880 | +#endif | |
878 | 881 | } |
879 | 882 | } |
880 | 883 | ... | ... |