hw/char/exynos4210_uart: Fix buffer size reporting with FIFO disabled
authorIris Johnson <iris@modwiz.com>
Thu, 28 Jan 2021 03:36:55 +0000 (03:36 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 2 Feb 2021 17:00:54 +0000 (17:00 +0000)
Currently the Exynos 4210 UART code always reports available FIFO space
when the backend checks for buffer space. When the FIFO is disabled this
is behavior causes the backend chardev code to replace the data before the
guest can read it.

This patch changes adds the logic to report the capacity properly when the
FIFO is not being used.

Buglink: https://bugs.launchpad.net/qemu/+bug/1913344
Signed-off-by: Iris Johnson <iris@modwiz.com>
Message-id: 20210128033655.1029577-1-iris@modwiz.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
hw/char/exynos4210_uart.c

index 6361df2ad3ccd2a966745d9d834e5798ddda3a50..9b21d201b3417fa88c1d63dac74eab468f4b0b80 100644 (file)
@@ -553,7 +553,11 @@ static int exynos4210_uart_can_receive(void *opaque)
 {
     Exynos4210UartState *s = (Exynos4210UartState *)opaque;
 
-    return fifo_empty_elements_number(&s->rx);
+    if (s->reg[I_(UFCON)] & UFCON_FIFO_ENABLE) {
+        return fifo_empty_elements_number(&s->rx);
+    } else {
+        return !(s->reg[I_(UTRSTAT)] & UTRSTAT_Rx_BUFFER_DATA_READY);
+    }
 }
 
 static void exynos4210_uart_receive(void *opaque, const uint8_t *buf, int size)