qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] hw/char/escc: Lower irq when transmit buffer is filled
@ 2019-03-05  5:10 Stephen Checkoway
  2019-03-06 11:01 ` Paolo Bonzini
  0 siblings, 1 reply; 8+ messages in thread
From: Stephen Checkoway @ 2019-03-05  5:10 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-trivial, Stephen Checkoway, Marc-André Lureau,
	Paolo Bonzini

The SCC/ESCC will briefly stop asserting an interrupt when the
transmit FIFO is filled.

This code doesn't model the transmit FIFO/shift register so the
pending transmit interrupt is never deasserted which means that an
edge-triggered interrupt controller will never see the low-to-high
transition it needs to raise another interrupt. The practical
consequence of this is that guest firmware with an interrupt service
routine for the ESCC that does not send all of the data it has
immediately will stop sending data if the following sequence of
events occurs:
1. Disable processor interrupts
2. Write a character to the ESCC
3. Add additional characters to a buffer which is drained by the ISR
4. Enable processor interrupts

In this case, the first character will be sent, the interrupt will
fire and the ISR will output the second character. Since the pending
transmit interrupt remains asserted, no additional interrupts will
ever fire.

This fixes that situation by explicitly lowering the IRQ when a
character is written to the buffer.

Signed-off-by: Stephen Checkoway <stephen.checkoway@oberlin.edu>
---
 hw/char/escc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/char/escc.c b/hw/char/escc.c
index 628f5f81f7..bea55ad8da 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -509,6 +509,7 @@ static void escc_mem_write(void *opaque, hwaddr addr,
         break;
     case SERIAL_DATA:
         trace_escc_mem_writeb_data(CHN_C(s), val);
+        qemu_irq_lower(s->irq);
         s->tx = val;
         if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled
             if (qemu_chr_fe_backend_connected(&s->chr)) {
-- 
2.17.2 (Apple Git-113)

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-04-17  0:56 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-05  5:10 [Qemu-devel] [PATCH] hw/char/escc: Lower irq when transmit buffer is filled Stephen Checkoway
2019-03-06 11:01 ` Paolo Bonzini
2019-04-10 20:01   ` Philippe Mathieu-Daudé
2019-04-10 20:01     ` Philippe Mathieu-Daudé
2019-04-10 21:22     ` Stephen Checkoway
2019-04-10 21:22       ` Stephen Checkoway
2019-04-17  0:55     ` Stephen Checkoway
2019-04-17  0:55       ` Stephen Checkoway

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).