From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=37260 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pkduu-0002SH-Pv for qemu-devel@nongnu.org; Wed, 02 Feb 2011 09:42:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PkZAo-0002jY-Al for qemu-devel@nongnu.org; Wed, 02 Feb 2011 04:38:51 -0500 Received: from goliath.siemens.de ([192.35.17.28]:23009) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PkZAn-0002h0-Vl for qemu-devel@nongnu.org; Wed, 02 Feb 2011 04:38:50 -0500 From: Jan Kiszka Date: Wed, 2 Feb 2011 10:38:44 +0100 Message-Id: In-Reply-To: References: In-Reply-To: References: Subject: [Qemu-devel] [0.14+master][PATCH 3/3] mc146818rtc: Handle host clock warps List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Anthony Liguori Cc: Zachary Amsden , Gleb Natapov Make use of the new warp notifier to update the RTC whenever rtc_clock is the host clock and that happens to jump backward. This avoids that the RTC stalls for the period the host clock was set back. Signed-off-by: Jan Kiszka --- hw/mc146818rtc.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index a1b0e31..04da794 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -572,6 +572,21 @@ static const VMStateDescription vmstate_rtc = { } }; +static void rtc_clock_warp(QEMUClock *clock, int64_t now, void *opaque) +{ + RTCState *s = opaque; + + rtc_set_date_from_host(&s->dev); + s->next_second_time = now + (get_ticks_per_sec() * 99) / 100; + qemu_mod_timer(s->second_timer2, s->next_second_time); + rtc_timer_update(s, now); +#ifdef TARGET_I386 + if (rtc_td_hack) { + rtc_coalesced_timer_update(s); + } +#endif +} + static void rtc_reset(void *opaque) { RTCState *s = opaque; @@ -608,6 +623,8 @@ static int rtc_initfn(ISADevice *dev) s->second_timer = qemu_new_timer(rtc_clock, rtc_update_second, s); s->second_timer2 = qemu_new_timer(rtc_clock, rtc_update_second2, s); + qemu_register_clock_warp(rtc_clock, rtc_clock_warp, s); + s->next_second_time = qemu_get_clock(rtc_clock) + (get_ticks_per_sec() * 99) / 100; qemu_mod_timer(s->second_timer2, s->next_second_time); -- 1.7.1