From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: imammedo@redhat.com, andrey@xdel.ru, qemu-devel@nongnu.org,
batuzovk@ispras.ru
Subject: Re: [Qemu-devel] [PATCH v3 4/4] serial: only resample THR interrupt on rising edge of IER.THRI
Date: Mon, 15 Dec 2014 16:05:38 +0000 [thread overview]
Message-ID: <20141215160538.GJ5502@work-vm> (raw)
In-Reply-To: <1418388243-1886-5-git-send-email-pbonzini@redhat.com>
* Paolo Bonzini (pbonzini@redhat.com) wrote:
> There is disagreement on whether LSR.THRE should be resampled when
> IER.THRI goes from 1 to 1. Bochs only does it if IER.THRI goes from 0
> to 1; PCE does it even if IER.THRI is unchanged. But the Windows driver
> seems to always go from 1 to 0 and back to 1, so do things in agreement
> with Bochs, because the handling of thr_ipending was reported in 2010
> (https://lists.gnu.org/archive/html/qemu-devel/2010-03/msg01914.html)
> as breaking DR-DOS Plus.
>
> Reported-by: Roy Tam <roytam@gmail.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> hw/char/serial.c | 25 ++++++++++++++++---------
> 1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 0a6747c..5488900 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -336,10 +336,12 @@ static void serial_ioport_write(void *opaque, hwaddr addr, uint64_t val,
> s->divider = (s->divider & 0x00ff) | (val << 8);
> serial_update_parameters(s);
> } else {
> + int changed = (s->ier ^ val) & 0x0f;
uint8_t perhaps?
> s->ier = val & 0x0f;
> /* If the backend device is a real serial port, turn polling of the modem
> - status lines on physical port on or off depending on UART_IER_MSI state */
> - if (s->poll_msl >= 0) {
> + * status lines on physical port on or off depending on UART_IER_MSI state.
> + */
> + if ((changed & UART_IER_MSI) && s->poll_msl >= 0) {
> if (s->ier & UART_IER_MSI) {
> s->poll_msl = 1;
> serial_update_msl(s);
This MSI stuff, this change is just intended to do the same as you're
doing for THRI and making it change based? The commit message and title
doens't mention it.
> @@ -354,18 +356,23 @@ static void serial_ioport_write(void *opaque, hwaddr addr, uint64_t val,
> * This is not in the datasheet, but Windows relies on it. It is
> * unclear if THRE has to be resampled every time THRI becomes
> * 1, or only on the rising edge. Bochs does the latter, and Windows
> - * always toggles IER to all zeroes and back to all ones. But for
> - * now leave it as it has always been in QEMU.
> + * always toggles IER to all zeroes and back to all ones, so do the
> + * same.
> *
> * If IER.THRI is zero, thr_ipending is not used. Set it to zero
> * so that the thr_ipending subsection is not migrated.
> */
> - if ((s->ier & UART_IER_THRI) && (s->lsr & UART_LSR_THRE)) {
> - s->thr_ipending = 1;
> - } else {
> - s->thr_ipending = 0;
> + if (changed & UART_IER_THRI) {
> + if ((s->ier & UART_IER_THRI) && (s->lsr & UART_LSR_THRE)) {
> + s->thr_ipending = 1;
> + } else {
> + s->thr_ipending = 0;
> + }
> + }
> +
> + if (changed) {
> + serial_update_irq(s);
> }
> - serial_update_irq(s);
> }
> break;
But the rest of this looks OK.
Dave
> case 2:
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2014-12-15 16:05 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-12 12:43 [Qemu-devel] [PATCH v3 0/4] serial fixes, including 2.2->2.1 migration Paolo Bonzini
2014-12-12 12:44 ` [Qemu-devel] [PATCH v3 1/4] serial: reset thri_pending on IER writes with THRI=0 Paolo Bonzini
2014-12-15 10:46 ` Dr. David Alan Gilbert
2014-12-15 11:51 ` Paolo Bonzini
2014-12-15 13:30 ` Dr. David Alan Gilbert
2014-12-15 13:34 ` Paolo Bonzini
2014-12-15 13:37 ` Dr. David Alan Gilbert
2014-12-15 13:45 ` Paolo Bonzini
2014-12-12 12:44 ` [Qemu-devel] [PATCH v3 2/4] serial: clean up THRE/TEMT handling Paolo Bonzini
2014-12-15 11:40 ` Dr. David Alan Gilbert
2014-12-15 12:03 ` Paolo Bonzini
2014-12-15 15:21 ` Dr. David Alan Gilbert
2014-12-15 15:26 ` Paolo Bonzini
2014-12-15 15:29 ` Dr. David Alan Gilbert
2014-12-12 12:44 ` [Qemu-devel] [PATCH v3 3/4] serial: update LSR on enabling/disabling FIFOs Paolo Bonzini
2014-12-15 15:50 ` Dr. David Alan Gilbert
2014-12-15 15:52 ` Paolo Bonzini
2014-12-12 12:44 ` [Qemu-devel] [PATCH v3 4/4] serial: only resample THR interrupt on rising edge of IER.THRI Paolo Bonzini
2014-12-15 16:05 ` Dr. David Alan Gilbert [this message]
2014-12-15 16:10 ` Paolo Bonzini
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=20141215160538.GJ5502@work-vm \
--to=dgilbert@redhat.com \
--cc=andrey@xdel.ru \
--cc=batuzovk@ispras.ru \
--cc=imammedo@redhat.com \
--cc=pbonzini@redhat.com \
--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.