On 29 January 2018 at 12:18, Wei Xu <xuw...@hisilicon.com> wrote: > On 2018/1/26 18:01, Peter Maydell wrote: >> No, that's not right either. int_level should already have the >> RX bit set, because pl011_put_fifo() sets that bit when it gets a >> character from QEMU and puts it into the FIFO. >> >> Does something else clear the int_level between the character >> going into the FIFO from QEMU and the guest enabling >> interrupts? > > Yes. When the guest enabling the interrupts, the pl011 driver in > the kernel will clear the RX interrupts[1]. > And pasted the code below to make it easy to read. > > static void pl011_enable_interrupts(struct uart_amba_port *uap) > { > spin_lock_irq(&uap->port.lock); > > /* Clear out any spuriously appearing RX interrupts */ > pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR); > uap->im = UART011_RTIM; > if (!pl011_dma_rx_running(uap)) > uap->im |= UART011_RXIM; > pl011_write(uap->im, uap, REG_IMSC); > spin_unlock_irq(&uap->port.lock); > } >
This seems at first glance like a kernel driver bug to me -- if it is explicitly killing off the pending interrupt without handling it then it's naturally going to get stuck if characters come in in the window before it does that. (It wouldn't surprise me if there's something in the driver init sequence that has the effect of clearing the FIFO on real hardware but not QEMU, which would mean that on real h/w the window where this can happen would be small, but it's still there.) thanks -- PMM