Sorry, this issue only occur in qemu-system-arm (vexpress-a9). In hw/char/pl011.c, qemu_chr_fe_write function is called directly and EAGAIN isn't handled.
http://git.qemu.org/?p=qemu.git;a=blob;f=hw/char/pl011.c;h=210c87b4c2bd000d80c359ca5c05d43c64210677;hb=bfc766d38e1fae5767d43845c15c79ac8fa6d6af#l148
So I use following a patch.
---- diff --git a/hw/char/pl011.c b/hw/char/pl011.c index c0fbf8a..6e29db8 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -146,7 +146,7 @@ static void pl011_write(void *opaque, hwaddr offset, /* ??? Check if transmitter is enabled. */ ch = value; if (s->chr) - qemu_chr_fe_write(s->chr, &ch, 1); + qemu_chr_fe_write_all(s->chr, &ch, 1); s->int_level |= PL011_INT_TX; pl011_update(s); break; ----
qemu_chr_fe_write_all function handles EAGAIN.
Sorry, this issue only occur in qemu-system-arm (vexpress-a9).
In hw/char/pl011.c, qemu_chr_fe_write function is called directly and EAGAIN isn't handled.
http:// git.qemu. org/?p= qemu.git; a=blob; f=hw/char/ pl011.c; h=210c87b4c2bd0 00d80c359ca5c05 d43c64210677; hb=bfc766d38e1f ae5767d43845c15 c79ac8fa6d6af# l148
So I use following a patch.
---- fe_write( s->chr, &ch, 1); fe_write_ all(s-> chr, &ch, 1);
s->int_ level |= PL011_INT_TX;
pl011_ update( s);
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index c0fbf8a..6e29db8 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -146,7 +146,7 @@ static void pl011_write(void *opaque, hwaddr offset,
/* ??? Check if transmitter is enabled. */
ch = value;
if (s->chr)
- qemu_chr_
+ qemu_chr_
break;
----
qemu_chr_ fe_write_ all function handles EAGAIN.