Paolo Bonzini <pbonz...@redhat.com> wrote: > From: Yang Zhang <yang.z.zh...@intel.com> > > Calculate guest RTC based on the time of the last update, instead of > using timers. The formula is > > (base_rtc + guest_time_now - guest_time_last_update + offset) > > Base_rtc is the RTC value when the RTC was last updated. > Guest_time_now is the guest time when the access happens. > Guest_time_last_update was the guest time when the RTC was last updated. > Offset is used when divider reset happens or the set bit is toggled. > > The timer is kept in order to signal interrupts, but it only needs to > run when either UF or AF is cleared. When the bits are both set, the > timer does not run. > > UIP is now synthesized when reading register A. If the timer is not set, > or if there is more than one second before it (as is the case at the > end of this series), the leading edge of UIP is computed and the rising > edge occurs 220us later. If the update timer occurs within one second, > however, the rising edge of the AF and UF bits should coincide withe > the falling edge of UIP. We do not know exactly when this will happen > because there could be delays in the servicing of the timer. Hence, in > this case reading register A only computes for the rising edge of UIP, > and latches the bit until the timer is fired and clears it. > > Signed-off-by: Yang Zhang <yang.z.zh...@intel.com> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> > static const VMStateDescription vmstate_rtc = { > .name = "mc146818rtc", > - .version_id = 2, > - .minimum_version_id = 1, > - .minimum_version_id_old = 1, > + .version_id = 3, > + .minimum_version_id = 3, > + .minimum_version_id_old = 3, > .post_load = rtc_post_load, > .fields = (VMStateField []) { > VMSTATE_BUFFER(cmos_data, RTCState), > @@ -542,11 +595,12 @@ static const VMStateDescription vmstate_rtc = { > VMSTATE_INT32(current_tm.tm_year, RTCState), > VMSTATE_TIMER(periodic_timer, RTCState), > VMSTATE_INT64(next_periodic_time, RTCState), > - VMSTATE_INT64(next_second_time, RTCState), > - VMSTATE_TIMER(second_timer, RTCState), > - VMSTATE_TIMER(second_timer2, RTCState), > VMSTATE_UINT32_V(irq_coalesced, RTCState, 2), > VMSTATE_UINT32_V(period, RTCState, 2), > + VMSTATE_UINT64_V(base_rtc, RTCState, 3), > + VMSTATE_UINT64_V(last_update, RTCState, 3), > + VMSTATE_INT64_V(offset, RTCState, 3), > + VMSTATE_TIMER_V(update_timer, RTCState, 3), > VMSTATE_END_OF_LIST() > } > }; Why did you remove all the migration from previous versions? You can't migrate now from version{1,2}, and we used to be able to do it? Why did you remove it? Later, Juan.