mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
x86/hvm: Run the RTC periodic timer on a consistent time series.
When the RTC periodic timer gets restarted, align it to the VM's boot time, not to whatever time it is now. Otherwise every read of REG_C will restart the current period Signed-off-by: Tim Deegan <tim@xen.org> Acked-by: Keir Fraser <keir@xen.org> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
5082cc1952
commit
58afa7ef12
2 files changed
+6
-3
No files matched your search
@@ -80,7 +80,7 @@ void rtc_periodic_interrupt(void *opaque)
|
||||
* RTC_RATE_SELECT settings */
|
||||
static void rtc_timer_update(RTCState *s)
|
||||
{
|
||||
int period_code, period;
|
||||
int period_code, period, delta;
|
||||
struct vcpu *v = vrtc_vcpu(s);
|
||||
|
||||
ASSERT(spin_is_locked(&s->lock));
|
||||
@@ -98,7 +98,8 @@ static void rtc_timer_update(RTCState *s)
|
||||
{
|
||||
period = 1 << (period_code - 1); /* period in 32 Khz cycles */
|
||||
period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */
|
||||
create_periodic_time(v, &s->pt, period, period, RTC_IRQ, NULL, s);
|
||||
delta = period - ((NOW() - s->start_time) % period);
|
||||
create_periodic_time(v, &s->pt, delta, period, RTC_IRQ, NULL, s);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
@@ -740,6 +741,7 @@ void rtc_init(struct domain *d)
|
||||
s->hw.cmos_data[RTC_REG_D] = RTC_VRT;
|
||||
|
||||
s->current_tm = gmtime(get_localtime(d));
|
||||
s->start_time = NOW();
|
||||
|
||||
rtc_copy_date(s);
|
||||
|
||||
|
||||
@@ -104,8 +104,9 @@ typedef struct RTCState {
|
||||
struct hvm_hw_rtc hw;
|
||||
/* RTC's idea of the current time */
|
||||
struct tm current_tm;
|
||||
/* periodic timer */
|
||||
s_time_t start_time;
|
||||
/* second update */
|
||||
int64_t next_second_time;
|
||||
struct periodic_time pt;
|
||||
/* update-ended timer */
|
||||
struct timer update_timer;
|
||||
|
||||