On Mon, 6 Sept 2021 at 03:47, Duo jia <jiaduo19920...@gmail.com> wrote: > > Thank you for your explanation. > >> And finishing the execution of the interrupt routine will automatically >> allow a pending second interrupt to be taken immediately > > > I think this is a hardware feature. But how to achieve it with qemu
That is what my explanation was trying to tell you how to do. In a bit more detail: * your interrupt controller device should assert the irq line to the CPU for as long as there is any pending interrupt (regardless of its priority). It should deassert it when there is no longer a pending interrupt (ie when the guest writes to the interrupt status register to clear the pending status of an interrupt, if that was the only pending interrupt then the interrupt controller should stop asserting the irq line). * your stm8_cpu_set_irq function should set and clear the CPU_INTERRUPT_HARD flag in interrupt_request so that it follows the irq line value * your .cpu_exec_interrupt function should only take the interrupt if the CCR.I1/I0 bits permit it. Otherwise it should return false (telling the QEMU core code that there was no interrupt taken). cpu_exec_interrupt should *not* clear the CPU_INTERRUPT_HARD flag, whether it decides to take an interrupt or not. * your do_interrupt function should set CCR.I1/I0 from the ITC_SPRx registers (as well as doing everything else that interrupt entry needs to do) * your implementation of iret should reload the CCR.I1/I0 bits, the way the spec describes There are other ways to structure this (mostly involving tying the interrupt controller model and the CPU model together more closely), but the above is the "classic" and probably simplest way of doing it. -- PMM