diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-04-24 18:03:45 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-04-24 18:03:45 +0000 |
commit | 8edac960a7deabd8c569fde189c2958e656d9115 (patch) | |
tree | 64bd70cb045b316a5ec0fcc16252540c5a7bd881 | |
parent | 0bf46a40a1fe22e35df344af1a8825f3b47a91e0 (diff) |
qemu: introduce qemu_cpu_kick (Marcelo Tosatti)
To notify cpu of pending interrupt.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7243 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | exec.c | 11 | ||||
-rw-r--r-- | qemu-common.h | 4 | ||||
-rw-r--r-- | vl.c | 10 |
3 files changed, 25 insertions, 0 deletions
@@ -1542,6 +1542,17 @@ void cpu_interrupt(CPUState *env, int mask) old_mask = env->interrupt_request; env->interrupt_request |= mask; +#ifndef CONFIG_USER_ONLY + /* + * If called from iothread context, wake the target cpu in + * case its halted. + */ + if (!qemu_cpu_self(env)) { + qemu_cpu_kick(env); + return; + } +#endif + if (use_icount) { env->icount_decr.u16.high = 0xffff; #ifndef CONFIG_USER_ONLY diff --git a/qemu-common.h b/qemu-common.h index e6a555e531..c90c3e3fd1 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -189,6 +189,10 @@ void qemu_service_io(void); /* Force QEMU to process pending events */ void qemu_notify_event(void); +/* Unblock cpu */ +void qemu_cpu_kick(void *env); +int qemu_cpu_self(void *env); + #ifdef CONFIG_USER_ONLY #define qemu_init_vcpu(env) do { } while (0) #else @@ -3740,6 +3740,16 @@ void qemu_init_vcpu(void *_env) return; } +int qemu_cpu_self(void *env) +{ + return 1; +} + +void qemu_cpu_kick(void *env) +{ + return; +} + #ifdef _WIN32 static void host_main_loop_wait(int *timeout) { |