target/sh4: ignore interrupts in a delay slot
Delay slots are indivisible, therefore avoid scheduling an interrupt in the delay slot. However exceptions are possible. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
9a562ae7ba
commit
5c6f3eb7db
|
@ -871,8 +871,16 @@ int cpu_sh4_is_cached(CPUSH4State * env, target_ulong addr)
|
||||||
bool superh_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
bool superh_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
||||||
{
|
{
|
||||||
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
||||||
superh_cpu_do_interrupt(cs);
|
SuperHCPU *cpu = SUPERH_CPU(cs);
|
||||||
return true;
|
CPUSH4State *env = &cpu->env;
|
||||||
|
|
||||||
|
/* Delay slots are indivisible, ignore interrupts */
|
||||||
|
if (env->flags & DELAY_SLOT_MASK) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
superh_cpu_do_interrupt(cs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue