From: "David S. Ahern" <daahern@cisco.com>
To: KVM list <kvm@vger.kernel.org>, qemu-devel@nongnu.org
Cc: Michael Tokarev <mjt@tls.msk.ru>
Subject: Re: more about serial ports: do they even work?
Date: Mon, 02 Feb 2009 14:27:35 -0700 [thread overview]
Message-ID: <49876547.1080904@cisco.com> (raw)
In-Reply-To: <497E1F7D.90300@msgid.tls.msk.ru>
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
WARNING: multiple messages have this Message-ID (diff)
From: "David S. Ahern" <daahern@cisco.com>
To: KVM list <kvm@vger.kernel.org>, qemu-devel@nongnu.org
Cc: Michael Tokarev <mjt@tls.msk.ru>
Subject: [Qemu-devel] Re: more about serial ports: do they even work?
Date: Mon, 02 Feb 2009 14:27:35 -0700 [thread overview]
Message-ID: <49876547.1080904@cisco.com> (raw)
In-Reply-To: <497E1F7D.90300@msgid.tls.msk.ru>
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
next prev parent reply other threads:[~2009-02-02 21:27 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-26 20:20 more about serial ports: do they even work? Michael Tokarev
2009-01-26 20:39 ` Michael Tokarev
2009-02-02 21:27 ` David S. Ahern [this message]
2009-02-02 21:27 ` [Qemu-devel] " David S. Ahern
2009-02-02 21:32 ` Michael Tokarev
2009-02-02 21:32 ` [Qemu-devel] " Michael Tokarev
2009-02-02 21:36 ` David S. Ahern
2009-02-02 21:36 ` [Qemu-devel] " David S. Ahern
2009-02-03 8:13 ` Michael Tokarev
2009-02-03 8:13 ` [Qemu-devel] " Michael Tokarev
2009-02-03 8:41 ` Mark Marshall
2009-02-03 8:41 ` [Qemu-devel] " Mark Marshall
2009-02-04 8:09 ` Marcelo Tosatti
2009-02-04 8:09 ` [Qemu-devel] " Marcelo Tosatti
2009-02-04 8:37 ` Michael Tokarev
2009-02-04 8:37 ` [Qemu-devel] " Michael Tokarev
2009-02-04 8:52 ` Marcelo Tosatti
2009-02-04 8:52 ` [Qemu-devel] " Marcelo Tosatti
2009-02-04 8:56 ` Michael Tokarev
2009-02-04 8:56 ` [Qemu-devel] " Michael Tokarev
2009-02-04 11:09 ` Stefano Stabellini
2009-02-04 11:09 ` [Qemu-devel] " Stefano Stabellini
2009-02-05 18:36 ` David S. Ahern
2009-02-05 18:36 ` [Qemu-devel] " David S. Ahern
2009-02-05 20:50 ` Stefano Stabellini
2009-02-05 20:50 ` [Qemu-devel] " Stefano Stabellini
2009-02-04 11:17 ` Stefano Stabellini
2009-02-04 11:17 ` Stefano Stabellini
2009-02-05 18:33 ` [PATCH, finally]: " Michael Tokarev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49876547.1080904@cisco.com \
--to=daahern@cisco.com \
--cc=kvm@vger.kernel.org \
--cc=mjt@tls.msk.ru \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.