From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LVr5G-0007qU-1P for qemu-devel@nongnu.org; Sat, 07 Feb 2009 12:35:14 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LVr5E-0007pi-EX for qemu-devel@nongnu.org; Sat, 07 Feb 2009 12:35:13 -0500 Received: from [199.232.76.173] (port=57369 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LVr5E-0007pc-4G for qemu-devel@nongnu.org; Sat, 07 Feb 2009 12:35:12 -0500 Received: from sj-iport-2.cisco.com ([171.71.176.71]:28795) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.60) (envelope-from ) id 1LVr5D-00014c-Oe for qemu-devel@nongnu.org; Sat, 07 Feb 2009 12:35:12 -0500 Message-ID: <498DC63F.3050508@cisco.com> Date: Sat, 07 Feb 2009 10:34:55 -0700 From: "David S. Ahern" MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] fix use of host serial port Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Michael Tokarev I need to drive this to ground. Can I get this applied? Thanks, davd The following patch fixes use of a host serial port. My original post on the problem is: http://marc.info/?l=kvm&m=122995568009533&w=2 Michael Tokarev (mjt@tls.msk.ru) dug into the where the code was failing: http://marc.info/?l=kvm&m=123300124703645&w=2 and further suggested a solution on which this patch is based. The changed has been acked by Stefano Stabellini. Signed-off-by: David Ahern Index: trunk/qemu-char.c =================================================================== --- trunk/qemu-char.c (revision 6545) +++ trunk/qemu-char.c (working copy) @@ -1047,17 +1047,17 @@ int *targ = (int *)arg; ioctl(s->fd_in, TIOCMGET, &sarg); *targ = 0; - if (sarg | TIOCM_CTS) + if (sarg & TIOCM_CTS) *targ |= CHR_TIOCM_CTS; - if (sarg | TIOCM_CAR) + if (sarg & TIOCM_CAR) *targ |= CHR_TIOCM_CAR; - if (sarg | TIOCM_DSR) + if (sarg & TIOCM_DSR) *targ |= CHR_TIOCM_DSR; - if (sarg | TIOCM_RI) + if (sarg & TIOCM_RI) *targ |= CHR_TIOCM_RI; - if (sarg | TIOCM_DTR) + if (sarg & TIOCM_DTR) *targ |= CHR_TIOCM_DTR; - if (sarg | TIOCM_RTS) + if (sarg & TIOCM_RTS) *targ |= CHR_TIOCM_RTS; } break; @@ -1065,9 +1065,20 @@ { int sarg = *(int *)arg; int targ = 0; - if (sarg | CHR_TIOCM_DTR) + ioctl(s->fd_in, TIOCMGET, &targ); + targ &= ~(CHR_TIOCM_CTS | CHR_TIOCM_CAR | CHR_TIOCM_DSR + | CHR_TIOCM_RI | CHR_TIOCM_DTR | CHR_TIOCM_RTS); + if (sarg & CHR_TIOCM_CTS) + targ |= TIOCM_CTS; + if (sarg & CHR_TIOCM_CAR) + targ |= TIOCM_CAR; + if (sarg & CHR_TIOCM_DSR) + targ |= TIOCM_DSR; + if (sarg & CHR_TIOCM_RI) + targ |= TIOCM_RI; + if (sarg & CHR_TIOCM_DTR) targ |= TIOCM_DTR; - if (sarg | CHR_TIOCM_RTS) + if (sarg & CHR_TIOCM_RTS) targ |= TIOCM_RTS; ioctl(s->fd_in, TIOCMSET, &targ); }