|
@@ -685,6 +685,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+#ifndef CONFIG_USER_ONLY
|
|
|
/*
|
|
|
* CPU_INTERRUPT_POLL is a virtual event which gets converted into a
|
|
|
* "real" interrupt event later. It does not need to be recorded for
|
|
@@ -698,12 +699,11 @@ static inline bool need_replay_interrupt(int interrupt_request)
|
|
|
return true;
|
|
|
#endif
|
|
|
}
|
|
|
+#endif /* !CONFIG_USER_ONLY */
|
|
|
|
|
|
static inline bool cpu_handle_interrupt(CPUState *cpu,
|
|
|
TranslationBlock **last_tb)
|
|
|
{
|
|
|
- CPUClass *cc = CPU_GET_CLASS(cpu);
|
|
|
-
|
|
|
/* Clear the interrupt flag now since we're processing
|
|
|
* cpu->interrupt_request and cpu->exit_request.
|
|
|
* Ensure zeroing happens before reading cpu->exit_request or
|
|
@@ -725,6 +725,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
|
|
|
qemu_mutex_unlock_iothread();
|
|
|
return true;
|
|
|
}
|
|
|
+#if !defined(CONFIG_USER_ONLY)
|
|
|
if (replay_mode == REPLAY_MODE_PLAY && !replay_has_interrupt()) {
|
|
|
/* Do nothing */
|
|
|
} else if (interrupt_request & CPU_INTERRUPT_HALT) {
|
|
@@ -753,12 +754,14 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
|
|
|
qemu_mutex_unlock_iothread();
|
|
|
return true;
|
|
|
}
|
|
|
-#endif
|
|
|
+#endif /* !TARGET_I386 */
|
|
|
/* The target hook has 3 exit conditions:
|
|
|
False when the interrupt isn't processed,
|
|
|
True when it is, and we should restart on a new TB,
|
|
|
and via longjmp via cpu_loop_exit. */
|
|
|
else {
|
|
|
+ CPUClass *cc = CPU_GET_CLASS(cpu);
|
|
|
+
|
|
|
if (cc->tcg_ops->cpu_exec_interrupt &&
|
|
|
cc->tcg_ops->cpu_exec_interrupt(cpu, interrupt_request)) {
|
|
|
if (need_replay_interrupt(interrupt_request)) {
|
|
@@ -777,6 +780,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
|
|
|
* reload the 'interrupt_request' value */
|
|
|
interrupt_request = cpu->interrupt_request;
|
|
|
}
|
|
|
+#endif /* !CONFIG_USER_ONLY */
|
|
|
if (interrupt_request & CPU_INTERRUPT_EXITTB) {
|
|
|
cpu->interrupt_request &= ~CPU_INTERRUPT_EXITTB;
|
|
|
/* ensure that no TB jump will be modified as
|