Message ID | 20170516224721.13832-5-aurelien@aurel32.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 05/16/2017 07:47 PM, Aurelien Jarno wrote: > Delay slots are indivisible, therefore avoid scheduling an interrupt in > the delay slot. However exceptions are possible. > > Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > target/sh4/helper.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/target/sh4/helper.c b/target/sh4/helper.c > index d420931530..19d4ec5fb5 100644 > --- a/target/sh4/helper.c > +++ b/target/sh4/helper.c > @@ -871,8 +871,16 @@ int cpu_sh4_is_cached(CPUSH4State * env, target_ulong addr) > bool superh_cpu_exec_interrupt(CPUState *cs, int interrupt_request) > { > if (interrupt_request & CPU_INTERRUPT_HARD) { > - superh_cpu_do_interrupt(cs); > - return true; > + SuperHCPU *cpu = SUPERH_CPU(cs); > + 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; > } >
On 05/16/2017 03:47 PM, Aurelien Jarno wrote: > Delay slots are indivisible, therefore avoid scheduling an interrupt in > the delay slot. However exceptions are possible. > > Signed-off-by: Aurelien Jarno<aurelien@aurel32.net> > --- > target/sh4/helper.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) Reviewed-by: Richard Henderson <rth@twiddle.net> r~
diff --git a/target/sh4/helper.c b/target/sh4/helper.c index d420931530..19d4ec5fb5 100644 --- a/target/sh4/helper.c +++ b/target/sh4/helper.c @@ -871,8 +871,16 @@ int cpu_sh4_is_cached(CPUSH4State * env, target_ulong addr) bool superh_cpu_exec_interrupt(CPUState *cs, int interrupt_request) { if (interrupt_request & CPU_INTERRUPT_HARD) { - superh_cpu_do_interrupt(cs); - return true; + SuperHCPU *cpu = SUPERH_CPU(cs); + 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; }
Delay slots are indivisible, therefore avoid scheduling an interrupt in the delay slot. However exceptions are possible. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> --- target/sh4/helper.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)