On 21 March 2017 at 17:48, Jiahuan Zhang <jiahuanzhan...@gmail.com> wrote: > The guest program is as follows. > > While (*UART_FR & PL011_RXFE); //wait until fifo not empty > for (i=0;i <16;i++){ > data [i] = (unsigned char) *UART_DR; //read from the data register. > }
This is buggy. You must check RXFE every time, because RXFE will be cleared as soon as even a single byte is in the FIFO. It does not mean "FIFO full", it just means "FIFO not empty". (You should also check that you're correctly using 'volatile' or some other mechanism for ensuring that the C compiler does not decide that it can collapse away accesses to hardware registers because it thinks they're just memory and won't change value.) > But what I met is that, when the receiving data is small, > no data is knocking the door of the fifo by ReadFile (), > then pl011_read can starts. > When the data is large, after the fifo is full, there are still > data requesting to get into the fifo. Then the device is busy > with pl011_can_receive. Are you saying that QEMU is looping round indefinitely calling pl011_can_receive() and never running the guest at all? That would be a QEMU bug, but it seems unlikely or we'd have noticed it before. What chardev backend are you connecting to the pl011 to feed data to it? thanks -- PMM