]> xenbits.xensource.com Git - xen.git/commitdiff
x86/hvm: fix RTC setting.
authorTim Deegan <tim@xen.org>
Fri, 18 Jan 2013 11:31:57 +0000 (12:31 +0100)
committerTim Deegan <tim@xen.org>
Fri, 18 Jan 2013 11:31:57 +0000 (12:31 +0100)
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 <tim@xen.org>
Tested-by: Phil Evans <Phil.Evans@m247.com>
Committed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/hvm/rtc.c

index ea5179a4b4b076cebf21e5464429f2e09fb41ebc..b994e99ad94e36f5dfb6a774f7e2748226c50956 100644 (file)
@@ -399,10 +399,17 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data)
     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: