From: Paolo Bonzini <pbonzini@redhat.com>
To: Jason Thorpe <thorpej@me.com>, qemu-devel@nongnu.org
Cc: richard.henderson@linaro.org, f4bug@amsat.org, mst@redhat.com
Subject: Re: [PATCH v2] mc146818rtc: Make PF independent of PIE
Date: Mon, 21 Jun 2021 16:46:05 +0200 [thread overview]
Message-ID: <b9e20dbc-fa5f-1e37-ad8a-5d433d77c4b0@redhat.com> (raw)
In-Reply-To: <20210619193849.27889-1-thorpej@me.com>
On 19/06/21 21:38, Jason Thorpe wrote:
> Make the PF flag behave like real hardware by always running the
> periodic timer without regard to the setting of the PIE bit, so
> that the PF will be set when the period expires even if an interrupt
> will not be raised. This behavior is documented on page 16 of the
> MC146818A advance information datasheet.
>
> Signed-off-by: Jason Thorpe <thorpej@me.com>
I agree that there's obviously a bug in QEMU. However, I'm worried of
two things with this patch.
First, the RTC device model has a complicated mechanism to deliver
missed ticks of the periodic timer. This is used with old versions of
Windows which lose track of time if periodic timer interrupts are not
delivered. This mechanism (implemented by rtc_coalesced_timer) right
now always triggers an interrupt. You need to change
periodic_timer_update to not activate this mechanism if PIE=0, by
checking for PIE=1 at the
if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW)
conditional.
Second, the firmware could set a nonzero period, and this would cause
continuous interruptions of the guest after the firmware stops, due to
s->periodic_timer firing. This is "optimized" by the bug that you are
fixing. To keep the optimization you could:
- do the timer_mod in periodic_timer_update only if !PF || (PIE &&
lost_tick_policy==SLEW)
- in cmos_ioport_read, if !timer_pending(s->periodic_timer) call
periodic_timer_update(s, qemu_clock_get_ns(rtc_clock),
s->period, true);
to update s->next_periodic_time for the next tick and ensure PF will be set.
Thanks,
Paolo
> ---
> hw/rtc/mc146818rtc.c | 21 ++++++++++++++++++---
> 1 file changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
> index 4fbafddb22..85abdfd9d1 100644
> --- a/hw/rtc/mc146818rtc.c
> +++ b/hw/rtc/mc146818rtc.c
> @@ -155,9 +155,24 @@ static uint32_t rtc_periodic_clock_ticks(RTCState *s)
> {
> int period_code;
>
> - if (!(s->cmos_data[RTC_REG_B] & REG_B_PIE)) {
> - return 0;
> - }
> + /*
> + * Quoting the data sheet "MC146818A Advance Information", 1984,
> + * page 16:
> + *
> + * <quote>
> + * PF - The periodic interrupt flag (PF) is a read-only bit which is
> + * set to a "1" when a particular edge is detected on the selected tap
> + * of the divider chain. The RS3 to RS0 bits establish the periodic
> + * rate. PF is set to "1" independent of the state of the PIE bit.
> + * PF initiates an ~IRQ signal and sets the IRQF bit when PIE is also
> + * a "1". The PF bit is cleared by a ~RESET or a software read of
> + * Register C.
> + * </quote>
> + *
> + * As such, we always run the timer irrespective if the state of
> + * either bit so as to always set PF at regular intervals regardless
> + * of when software reads it.
> + */
>
> period_code = s->cmos_data[RTC_REG_A] & 0x0f;
>
>
next prev parent reply other threads:[~2021-06-21 14:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-19 19:38 [PATCH v2] mc146818rtc: Make PF independent of PIE Jason Thorpe
2021-06-21 14:46 ` Paolo Bonzini [this message]
2021-06-23 14:24 ` Jason Thorpe
2021-06-24 22:09 ` 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=b9e20dbc-fa5f-1e37-ad8a-5d433d77c4b0@redhat.com \
--to=pbonzini@redhat.com \
--cc=f4bug@amsat.org \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thorpej@me.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).