mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/HVM: RTC periodic timer emulation adjustments
- don't call rtc_timer_update() on REG_A writes when the value didn't change (doing the call always was reported to cause wall clock time lagging with the JVM running on Windows) - don't call rtc_timer_update() on REG_B writes when RTC_PIE didn't change Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
aa1c1f4c57
commit
f129790418
1 file changed
+7
-4
@@ -365,6 +365,7 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data)
|
||||
{
|
||||
RTCState *s = opaque;
|
||||
struct domain *d = vrtc_domain(s);
|
||||
uint32_t orig;
|
||||
|
||||
spin_lock(&s->lock);
|
||||
|
||||
@@ -382,6 +383,7 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
orig = s->hw.cmos_data[s->hw.cmos_index];
|
||||
switch ( s->hw.cmos_index )
|
||||
{
|
||||
case RTC_SECONDS_ALARM:
|
||||
@@ -405,9 +407,9 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data)
|
||||
break;
|
||||
case RTC_REG_A:
|
||||
/* UIP bit is read only */
|
||||
s->hw.cmos_data[RTC_REG_A] = (data & ~RTC_UIP) |
|
||||
(s->hw.cmos_data[RTC_REG_A] & RTC_UIP);
|
||||
rtc_timer_update(s);
|
||||
s->hw.cmos_data[RTC_REG_A] = (data & ~RTC_UIP) | (orig & RTC_UIP);
|
||||
if ( (data ^ orig) & ~RTC_UIP )
|
||||
rtc_timer_update(s);
|
||||
break;
|
||||
case RTC_REG_B:
|
||||
if ( data & RTC_SET )
|
||||
@@ -436,7 +438,8 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data)
|
||||
hvm_isa_irq_assert(d, RTC_IRQ);
|
||||
}
|
||||
s->hw.cmos_data[RTC_REG_B] = data;
|
||||
rtc_timer_update(s);
|
||||
if ( (data ^ orig) & RTC_PIE )
|
||||
rtc_timer_update(s);
|
||||
check_update_timer(s);
|
||||
alarm_timer_update(s);
|
||||
break;
|
||||
|
||||