mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
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>
This commit is contained in:
1 parent
82ec83c425
commit
ecaa2629f2
2 files changed
+10
-6
No files matched your search
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -114,6 +114,7 @@ typedef struct RTCState {
|
||||
struct periodic_time pt;
|
||||
s_time_t start_time;
|
||||
int pt_code;
|
||||
uint8_t pt_dead_ticks;
|
||||
uint32_t use_timer;
|
||||
spinlock_t lock;
|
||||
} RTCState;
|
||||
|
||||