]> git.proxmox.com Git - qemu.git/commitdiff
serial: fix lost character after sysrq
authorJason Wessel <jason.wessel@windriver.com>
Mon, 18 May 2009 15:00:27 +0000 (10:00 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Thu, 28 May 2009 07:04:20 +0000 (02:04 -0500)
After creating an automated regression test to test the sysrq
responses while running a linux image in qemu, I found that the
simulated uart was eating the character right after the sysrq about
75% of the time.

The problem is that the qemu sets the LSR_DR (data ready) bit on a
serial break.  The automated tests can send a break and the sysrq
character quickly enough that the qemu serial fifo has a real
character available. When there is valid character in the fifo, it
gets consumed by the serial driver in the guest OS.

The real hardware also appears to set the LSR_DR but always appears to
have a null byte in this condition.  This patch changes the qemu
behavior to match the tested characteristics of a real 16550 chip.

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hw/serial.c

index ac089fce66ed57bf777e8cfd30aa6bfda2bc993f..113829c20de123699eb2f41c4e01a271b7941d96 100644 (file)
@@ -586,6 +586,8 @@ static int serial_can_receive(SerialState *s)
 static void serial_receive_break(SerialState *s)
 {
     s->rbr = 0;
+    /* When the LSR_DR is set a null byte is pushed into the fifo */
+    fifo_put(s, RECV_FIFO, '\0');
     s->lsr |= UART_LSR_BI | UART_LSR_DR;
     serial_update_irq(s);
 }