hw/char/cmsdk-apb-uart.c: Correctly clear INTSTATUS bits on writes
authorPeter Maydell <peter.maydell@linaro.org>
Tue, 10 Apr 2018 13:42:03 +0000 (14:42 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Wed, 11 Apr 2018 16:00:49 +0000 (17:00 +0100)
The CMSDK APB UART INTSTATUS register bits are all write-one-to-clear.
We were getting this correct for the TXO and RXO bits (which need
special casing because their state lives in the STATE register),
but had forgotten to handle the normal bits for RX and TX which
we do store in our s->intstatus field.

Perform the W1C operation on the bits in s->intstatus too.

Fixes: https://bugs.launchpad.net/qemu/+bug/1760262
Cc: qemu-stable@nongnu.org
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20180410134203.17552-1-peter.maydell@linaro.org

hw/char/cmsdk-apb-uart.c

index 1ad1e14295238affd5f54bc51260117519df4f44..9c0929d8a243687e83a459c7e45b3f1c28e885f4 100644 (file)
@@ -274,6 +274,7 @@ static void uart_write(void *opaque, hwaddr offset, uint64_t value,
          * is then reflected into the intstatus value by the update function).
          */
         s->state &= ~(value & (R_INTSTATUS_TXO_MASK | R_INTSTATUS_RXO_MASK));
+        s->intstatus &= ~value;
         cmsdk_apb_uart_update(s);
         break;
     case A_BAUDDIV: