x86/hvm: fix RTC setting. When the guest writes one field of the RTC time, we must bring all the other fields up to date for the current second before calculating the new RTC time. Signed-off-by: Tim Deegan diff -r d81f9832a082 xen/arch/x86/hvm/rtc.c --- a/xen/arch/x86/hvm/rtc.c Thu Jan 17 15:55:02 2013 +0000 +++ b/xen/arch/x86/hvm/rtc.c Thu Jan 17 16:31:09 2013 +0000 @@ -399,10 +399,17 @@ static int rtc_ioport_write(void *opaque case RTC_DAY_OF_MONTH: case RTC_MONTH: case RTC_YEAR: - s->hw.cmos_data[s->hw.cmos_index] = data; - /* if in set mode, do not update the time */ - if ( !(s->hw.cmos_data[RTC_REG_B] & RTC_SET) ) + /* if in set mode, just write the register */ + if ( (s->hw.cmos_data[RTC_REG_B] & RTC_SET) ) + s->hw.cmos_data[s->hw.cmos_index] = data; + else + { + /* Fetch the current time and update just this field. */ + s->current_tm = gmtime(get_localtime(d)); + rtc_copy_date(s); + s->hw.cmos_data[s->hw.cmos_index] = data; rtc_set_time(s); + } alarm_timer_update(s); break; case RTC_REG_A: