aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec.c11
-rw-r--r--qemu-common.h4
-rw-r--r--vl.c10
3 files changed, 25 insertions, 0 deletions
diff --git a/exec.c b/exec.c
index 8245ac0409..23013fbd13 100644
--- a/exec.c
+++ b/exec.c
@@ -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
diff --git a/vl.c b/vl.c
index 74404647d4..92f3014418 100644
--- a/vl.c
+++ b/vl.c
@@ -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)
{