diff options
author | Tim Deegan <tim@xen.org> | 2013-03-28 13:07:06 +0000 |
---|---|---|
committer | Tim Deegan <tim@xen.org> | 2013-03-29 09:43:17 +0000 |
commit | ecaa2629f2eb90048a18bcc1df430328cc0371be (patch) | |
tree | ad4851a23311337c4926b6d413d61fe4344b6f2c /xen/arch/x86/hvm/rtc.c | |
parent | 82ec83c425af79823d9fdb818ece44bae1298578 (diff) | |
download | xen-ecaa2629f2eb90048a18bcc1df430328cc0371be.tar.gz xen-ecaa2629f2eb90048a18bcc1df430328cc0371be.tar.bz2 xen-ecaa2629f2eb90048a18bcc1df430328cc0371be.zip |
x86/hvm: Let the guest miss a few ticks before resetting the timer.
Signed-off-by: Tim Deegan <tim@xen.org>
Acked-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/rtc.c')
-rw-r--r-- | xen/arch/x86/hvm/rtc.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c index 8d9195fa49..88cacd1caf 100644 --- a/xen/arch/x86/hvm/rtc.c +++ b/xen/arch/x86/hvm/rtc.c @@ -65,17 +65,18 @@ void rtc_periodic_interrupt(void *opaque) RTCState *s = opaque; spin_lock(&s->lock); - if ( s->hw.cmos_data[RTC_REG_C] & RTC_PF ) - { - destroy_periodic_time(&s->pt); - s->pt_code = 0; - } - else + if ( !(s->hw.cmos_data[RTC_REG_C] & RTC_PF) ) { s->hw.cmos_data[RTC_REG_C] |= RTC_PF; if ( s->hw.cmos_data[RTC_REG_B] & RTC_PIE ) rtc_toggle_irq(s); } + else if ( ++(s->pt_dead_ticks) >= 10 ) + { + /* VM is ignoring its RTC; no point in running the timer */ + destroy_periodic_time(&s->pt); + s->pt_code = 0; + } spin_unlock(&s->lock); } @@ -88,6 +89,8 @@ static void rtc_timer_update(RTCState *s) ASSERT(spin_is_locked(&s->lock)); + s->pt_dead_ticks = 0; + period_code = s->hw.cmos_data[RTC_REG_A] & RTC_RATE_SELECT; switch ( s->hw.cmos_data[RTC_REG_A] & RTC_DIV_CTL ) { |