> Original Qemu serial.c uses non-waiting write. If it's bound to a
> physical serial port, there are chances that write need to wait for a
> while. In this occasion, the characters are lost. This patch adds an
up
> to 100ms wait for write. In addition, it turns off output processing.
Xiaowei,
Thanks for investigating this. A couple of questions:
diff -r 041be3f6b38e tools/ioemu/hw/serial.c
--- a/tools/ioemu/hw/serial.c Tue Sep 19 13:26:47 2006
+++ b/tools/ioemu/hw/serial.c Tue Sep 19 15:47:11 2006
@@ -160,7 +160,8 @@
s->lsr &= ~UART_LSR_THRE;
serial_update_irq(s);
ch = val;
- qemu_chr_write(s->chr, &ch, 1);
+ if (qemu_chr_write(s->chr, &ch, 1) == -1)
+ fprintf(logfile, "serial write error\n");
s->thr_ipending = 1;
s->lsr |= UART_LSR_THRE;
s->lsr |= UART_LSR_TEMT;
Doesn't the above mean we still drop the character? Shouldn't we be
storing the character somewhere and retrying it later? We should
probably also clear the tx ready bit (bit 5) in the UART's Line Status
Register. We should then retry the write in ~100ms, and set the tx ready
bit again.
diff -r 041be3f6b38e tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Tue Sep 19 13:26:47 2006
+++ b/tools/ioemu/vl.c Tue Sep 19 15:47:11 2006
@@ -1191,7 +1191,7 @@
FD_ZERO(&writefds);
FD_SET(fd, &writefds);
timeout.tv_sec = 0;
- timeout.tv_usec = 0;
+ timeout.tv_usec = 100000;
sel_ret = select(max_fd + 1, NULL, &writefds, 0, &timeout);
if (sel_ret <= 0) {
/* Timeout or select error */
@@ -1674,7 +1674,8 @@
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
|INLCR|IGNCR|ICRNL|IXON);
- tty.c_oflag |= OPOST;
+ tty.c_oflag &= ~OPOST;
+
tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS);
switch(data_bits) {
What does this part of the patch do? I don't know my tcsetattrs very
well.
Thanks,
Ian
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|