aboutsummaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2011-04-13 01:32:56 +0200
committerMarcelo Tosatti <mtosatti@redhat.com>2011-05-02 09:38:35 -0300
commit97ffbd8d9d54736dd73227e5330c7f5cdc2d7a96 (patch)
tree40ded5473182a30f3cd9b2e42d5c3e556a49b574 /exec.c
parent450fb75c478aa4134bc1e6b1655791c0a39ad141 (diff)
downloadqemu-97ffbd8d9d54736dd73227e5330c7f5cdc2d7a96.zip
qemu-97ffbd8d9d54736dd73227e5330c7f5cdc2d7a96.tar.gz
qemu-97ffbd8d9d54736dd73227e5330c7f5cdc2d7a96.tar.bz2
Break up user and system cpu_interrupt implementations
Both have only two lines in common, and we will convert the system service into a callback which is of no use for user mode operation. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> CC: Riku Voipio <riku.voipio@iki.fi> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/exec.c b/exec.c
index c3dc68a..d6d8a89 100644
--- a/exec.c
+++ b/exec.c
@@ -1629,6 +1629,7 @@ static void cpu_unlink_tb(CPUState *env)
spin_unlock(&interrupt_lock);
}
+#ifndef CONFIG_USER_ONLY
/* mask must never be zero, except for A20 change call */
void cpu_interrupt(CPUState *env, int mask)
{
@@ -1637,7 +1638,6 @@ 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.
@@ -1646,21 +1646,27 @@ void cpu_interrupt(CPUState *env, int mask)
qemu_cpu_kick(env);
return;
}
-#endif
if (use_icount) {
env->icount_decr.u16.high = 0xffff;
-#ifndef CONFIG_USER_ONLY
if (!can_do_io(env)
&& (mask & ~old_mask) != 0) {
cpu_abort(env, "Raised interrupt while not in I/O function");
}
-#endif
} else {
cpu_unlink_tb(env);
}
}
+#else /* CONFIG_USER_ONLY */
+
+void cpu_interrupt(CPUState *env, int mask)
+{
+ env->interrupt_request |= mask;
+ cpu_unlink_tb(env);
+}
+#endif /* CONFIG_USER_ONLY */
+
void cpu_reset_interrupt(CPUState *env, int mask)
{
env->interrupt_request &= ~mask;