mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
target/nios2: Rewrite interrupt handling
Previously, we would avoid setting CPU_INTERRUPT_HARD when interrupts are disabled at a particular point in time, instead queuing the value into cpu->irq_pending. This is more complicated than required. Instead, set CPU_INTERRUPT_HARD any time there is a pending interrupt, and exclusively check for interrupts disabled in nios2_cpu_exec_interrupt. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
8d8d73b551
commit
b72c9d5951
5 changed files with 9 additions and 36 deletions
|
@ -491,19 +491,15 @@ static void wrctl(DisasContext *dc, uint32_t code, uint32_t flags)
|
|||
case CR_IPENDING:
|
||||
/* ipending is read only, writes ignored. */
|
||||
break;
|
||||
case CR_STATUS:
|
||||
case CR_IENABLE:
|
||||
/* If interrupts were enabled using WRCTL, trigger them. */
|
||||
dc->base.is_jmp = DISAS_UPDATE;
|
||||
/* fall through */
|
||||
default:
|
||||
tcg_gen_mov_tl(cpu_R[instr.imm5 + CR_BASE], v);
|
||||
break;
|
||||
}
|
||||
|
||||
/* If interrupts were enabled using WRCTL, trigger them. */
|
||||
if ((instr.imm5 + CR_BASE) == CR_STATUS) {
|
||||
if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
gen_helper_check_interrupts(cpu_env);
|
||||
dc->base.is_jmp = DISAS_UPDATE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue