From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tim Deegan Subject: [PATCH 4/4] x86/hvm: Let the guest miss a few ticks before resetting the timer. Date: Thu, 28 Mar 2013 13:22:16 +0000 Message-ID: <1364476936-15824-5-git-send-email-tim@xen.org> References: <1364476936-15824-1-git-send-email-tim@xen.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1364476936-15824-1-git-send-email-tim@xen.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: suravee.suthikulpanit@amd.com, JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org Signed-off-by: Tim Deegan --- xen/arch/x86/hvm/rtc.c | 15 +++++++++------ xen/include/asm-x86/hvm/vpt.h | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c index ecc9916..4c0e7d4 100644 --- a/xen/arch/x86/hvm/rtc.c +++ b/xen/arch/x86/hvm/rtc.c @@ -77,16 +77,17 @@ 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_active = 0; - } - else + if ( !(s->hw.cmos_data[RTC_REG_C] & RTC_PF) ) { s->hw.cmos_data[RTC_REG_C] |= RTC_PF; rtc_update_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_active = 0; + } spin_unlock(&s->lock); } @@ -99,6 +100,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 ) { diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h index 76a83a1..4d274d3 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -115,6 +115,7 @@ typedef struct RTCState { s_time_t start_time; int period; bool_t pt_active; + uint8_t pt_dead_ticks; uint32_t use_timer; spinlock_t lock; } RTCState; -- 1.7.10.4