On Thu, Jun 5, 2025 at 8:14 PM Florian Lugou <florian.lu...@provenrun.com> wrote: > > The current handler for TXFIFO writes schedules an async callback to > pop characters from the queue. When software writes to TXFIFO faster > than the async callback delay (100ns), the timer may be pushed back > while the previous character has not be dequeued yet. This happens in > particular when using -icount with small shift values. This is > especially worrysome when software repetitively issues amoor.w > instructions (as suggested by SiFive specification) and the FIFO is > full, leading to the callback being infinitly pushed back. > > This commit fixes the issue by never pushing back the timer, only > updating it if it is not already active. > > Signed-off-by: Florian Lugou <florian.lu...@provenrun.com>
Thanks! Applied to riscv-to-apply.next Alistair > --- > hw/char/sifive_uart.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/hw/char/sifive_uart.c b/hw/char/sifive_uart.c > index 0fc89e76d1..9bc697a67b 100644 > --- a/hw/char/sifive_uart.c > +++ b/hw/char/sifive_uart.c > @@ -128,8 +128,10 @@ static void sifive_uart_write_tx_fifo(SiFiveUARTState > *s, const uint8_t *buf, > s->txfifo |= SIFIVE_UART_TXFIFO_FULL; > } > > - timer_mod(s->fifo_trigger_handle, current_time + > - TX_INTERRUPT_TRIGGER_DELAY_NS); > + if (!timer_pending(s->fifo_trigger_handle)) { > + timer_mod(s->fifo_trigger_handle, current_time + > + TX_INTERRUPT_TRIGGER_DELAY_NS); > + } > } > > static uint64_t > -- > 2.43.0 > >