From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LU6KU-0005FN-J9 for qemu-devel@nongnu.org; Mon, 02 Feb 2009 16:27:42 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LU6KT-0005F8-2N for qemu-devel@nongnu.org; Mon, 02 Feb 2009 16:27:42 -0500 Received: from [199.232.76.173] (port=38747 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LU6KS-0005F5-Oh for qemu-devel@nongnu.org; Mon, 02 Feb 2009 16:27:40 -0500 Received: from sj-iport-6.cisco.com ([171.71.176.117]:41315) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.60) (envelope-from ) id 1LU6KS-0001A4-9W for qemu-devel@nongnu.org; Mon, 02 Feb 2009 16:27:40 -0500 Message-ID: <49876547.1080904@cisco.com> Date: Mon, 02 Feb 2009 14:27:35 -0700 From: "David S. Ahern" MIME-Version: 1.0 References: <497E1B15.2090908@msgid.tls.msk.ru> <497E1F7D.90300@msgid.tls.msk.ru> In-Reply-To: <497E1F7D.90300@msgid.tls.msk.ru> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: more about serial ports: do they even work? Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: KVM list , qemu-devel@nongnu.org Cc: Michael Tokarev I don't recall seeing a followup to this post. To put Michael's second suggestion into patch form, the following fixes the problem for me: --- kvm-81.orig/qemu/qemu-char.c 2008-12-14 06:16:27.000000000 -0700 +++ kvm-81/qemu/qemu-char.c 2009-02-02 14:12:20.000000000 -0700 @@ -1078,20 +1078,21 @@ if (sarg | TIOCM_DTR) *targ |= CHR_TIOCM_DTR; if (sarg | TIOCM_RTS) *targ |= CHR_TIOCM_RTS; } break; case CHR_IOCTL_SERIAL_SET_TIOCM: { int sarg = *(int *)arg; int targ = 0; + ioctl(s->fd_in, TIOCMGET, &targ); if (sarg | CHR_TIOCM_DTR) targ |= TIOCM_DTR; if (sarg | CHR_TIOCM_RTS) targ |= TIOCM_RTS; ioctl(s->fd_in, TIOCMSET, &targ); } break; default: return -ENOTSUP; } Is this approach palatable to folks? david Michael Tokarev wrote: > Michael Tokarev ?????: >> After some debugging and debugging, with a help >> Hollis Blanchard on #kvm@freenode, I discovered >> that kvm (or, rather, qemu) does not work correctly >> with serial ports, at least on linux. One problem >> report has already here, author Cc'd -- see e.g. >> http://marc.info/?l=kvm&m=122995568009533&w=2 . >> >> Here's what's going on. >> >> When opening a host's port, kvm resets the status >> lines, doing this: >> >> ioctl(13, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CTS|TIOCM_DSR|0x4000]) >> ioctl(13, TIOCMSET, [TIOCM_DTR|TIOCM_RTS]) >> >> which results in the following set >> >> ioctl(13, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CTS|TIOCM_DSR]) > > Here's the possible solution (NotAPAtch(tm)): > > In kvm-xx/qemu/qemu-char.c: > > case CHR_IOCTL_SERIAL_SET_TIOCM: > { > int sarg = *(int *)arg; > int targ = 0; <==== change this 0 to 0x4000 > if (sarg | CHR_TIOCM_DTR) > targ |= TIOCM_DTR; > if (sarg | CHR_TIOCM_RTS) > targ |= TIOCM_RTS; > ioctl(s->fd_in, TIOCMSET, &targ); > } > break; > > This is obviously a hack, esp. since this bit is not > always present even on linux (after reading 8250.c > driver). > > Real fix will be, I guess, to read the full set > first, and combine it with DTR|RTS received from > guest, something like this: > > case > { > int sarg = *(int *)arg; > int targ = 0; > ioctl(s->fd_in, TIOCMGET, &targ); > if (!(sarg | CHR_TIOCM_DTR)) > targ &= ~TIOCM_DTR; > if (!(sarg | CHR_TIOCM_RTS)) > targ ~= ~TIOCM_RTS; > ioctl(s->fd_in, TIOCMSET, &targ); > } > break; > > I.e., to always keep all the other bits, but > allow changing DTR and RTS. > > Again, I don't know how it's linux-specific, but > it seems the solution above should work on other > platforms just fine. > > /mjt