On Fri, Jul 20, 2012 at 12:53:53PM +0200, Paolo Bonzini wrote: > From: "Zhang, Yang Z" <yang.z.zh...@intel.com> > > The new logic is compatible with old, and it should not block migration > from old QEMU. However, the new version cannot migrate to the old one.
Do we not plan to support 1.2 -> 1.1 with -M pc-1.1? I'm not sure what the "official" stance is, but I think we could do it by making the behavior configurable and defaulting to the old behavior for -M pc-1.1, and using VMSTATE_*_TEST(..., rtc_on_demand_enabled) to send the new fields conditionally. > > Cc: Juan Quintela <quint...@redhat.com> > Signed-off-by: Yang Zhang <yang.z.zh...@intel.com> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > hw/mc146818rtc.c | 42 +++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 39 insertions(+), 3 deletions(-) > > diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c > index f0b75cb..d3871d8 100644 > --- a/hw/mc146818rtc.c > +++ b/hw/mc146818rtc.c > @@ -697,11 +697,47 @@ static int rtc_post_load(void *opaque, int version_id) > return 0; > } > > +static int rtc_load_old(QEMUFile *f, void *opaque, int version_id) > +{ > + RTCState *s = opaque; > + uint8_t buf[77]; > + > + if (version_id > 2) { > + return -EINVAL; > + } > + > + qemu_get_buffer(f, s->cmos_data, sizeof(s->cmos_data)); > + qemu_get_8s(f, &s->cmos_index); > + > + /* Skip loading of s->current_tm, we already have the > + * information in cmos_data. > + */ > + qemu_get_buffer(f, buf, 7*4); > + > + qemu_get_timer(f, s->periodic_timer); > + s->next_periodic_time = qemu_get_be64(f); > + > + /* Skip loading of next_second_time, second_timer, second_timer2. */ > + qemu_get_buffer(f, buf, 3*8); > + > + rtc_set_time(s); > + s->offset = 0; > + check_update_timer(s); > + > + if (version_id >= 2) { > + s->irq_coalesced = qemu_get_be32(f); > + s->period = qemu_get_be32(f); > + } > + > + return rtc_post_load(opaque, version_id); > +} > + > static const VMStateDescription vmstate_rtc = { > .name = "mc146818rtc", > - .version_id = 2, > - .minimum_version_id = 1, > + .version_id = 3, > + .minimum_version_id = 3, > .minimum_version_id_old = 1, > + .load_state_old = rtc_load_old, > .post_load = rtc_post_load, > .fields = (VMStateField []) { > VMSTATE_BUFFER(cmos_data, RTCState), > @@ -837,7 +873,7 @@ static int rtc_initfn(ISADevice *dev) > memory_region_init_io(&s->io, &cmos_ops, s, "rtc", 2); > isa_register_ioport(dev, &s->io, base); > > - qdev_set_legacy_instance_id(&dev->qdev, base, 2); > + qdev_set_legacy_instance_id(&dev->qdev, base, 3); > qemu_register_reset(rtc_reset, s); > > object_property_add(OBJECT(s), "date", "struct tm", > -- > 1.7.10.2 > >