qemu/hw/char
Florian Lugou 61240e3a06 hw/char: sifive_uart: Avoid infinite delay of async xmit function
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.lugou@provenrun.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20250605101255.797162-1-florian.lugou@provenrun.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2025-07-04 21:09:48 +10:00
..
avr_usart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
bcm2835_aux.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
cadence_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
cmsdk-apb-uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
debugcon.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
digic-uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
diva-gsp.c hw/char/serial: Remove unused prog_if compat property 2025-05-02 21:49:32 +02:00
escc.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
exynos4210_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
goldfish_tty.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
grlib_apbuart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
ibex_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
imx_serial.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
ipoctal232.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
Kconfig rust: Kconfig: Factor out whether PL011 is Rust or C 2025-03-20 09:23:18 +01:00
mcf_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
mchp_pfsoc_mmuart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
meson.build rust: Kconfig: Factor out whether PL011 is Rust or C 2025-03-20 09:23:18 +01:00
nrf51_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
omap_uart.c include/system: Move exec/address-spaces.h to system/address-spaces.h 2025-04-23 14:08:21 -07:00
parallel-isa.c include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
parallel.c qom: Make InterfaceInfo[] uses const 2025-04-25 17:00:41 +02:00
pl011.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
renesas_sci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
riscv_htif.c include/system: Move exec/address-spaces.h to system/address-spaces.h 2025-04-23 14:08:21 -07:00
sclpconsole-lm.c hw/char/sclpconsole-lm: skip automatic zero-init of large array 2025-06-12 13:40:15 -04:00
sclpconsole.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
serial-isa.c qom: Make InterfaceInfo[] uses const 2025-04-25 17:00:41 +02:00
serial-mm.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
serial-pci-multi.c hw/char/serial: Remove unused prog_if compat property 2025-05-02 21:49:32 +02:00
serial-pci.c hw/char/serial: Remove unused prog_if compat property 2025-05-02 21:49:32 +02:00
serial.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
sh_serial.c hw/char/sh_serial: Convert to TypeInfo 2025-06-10 10:58:59 +02:00
shakti_uart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
sifive_uart.c hw/char: sifive_uart: Avoid infinite delay of async xmit function 2025-07-04 21:09:48 +10:00
spapr_vty.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
stm32f2xx_usart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
stm32l4x5_usart.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
terminal3270.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
trace-events hw/char/pl011: Improve RX flow tracing events 2025-03-04 14:45:34 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
virtio-console.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-serial-bus.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
xen_console.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
xilinx_uartlite.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00