diff options
-rw-r--r-- | hw/i8254.c | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/hw/i8254.c b/hw/i8254.c index 44e453139b..6a8cd3ed18 100644 --- a/hw/i8254.c +++ b/hw/i8254.c @@ -389,35 +389,31 @@ static void pit_irq_timer(void *opaque) pit_irq_timer_update(s, s->next_transition_time); } -static void pit_save(QEMUFile *f, void *opaque) -{ - PITState *pit = opaque; - PITChannelState *s; - int i; - - for(i = 0; i < 3; i++) { - s = &pit->channels[i]; - qemu_put_be32(f, s->count); - qemu_put_be16s(f, &s->latched_count); - qemu_put_8s(f, &s->count_latched); - qemu_put_8s(f, &s->status_latched); - qemu_put_8s(f, &s->status); - qemu_put_8s(f, &s->read_state); - qemu_put_8s(f, &s->write_state); - qemu_put_8s(f, &s->write_latch); - qemu_put_8s(f, &s->rw_mode); - qemu_put_8s(f, &s->mode); - qemu_put_8s(f, &s->bcd); - qemu_put_8s(f, &s->gate); - qemu_put_be64(f, s->count_load_time); - if (s->irq_timer) { - qemu_put_be64(f, s->next_transition_time); - qemu_put_timer(f, s->irq_timer); - } +static const VMStateDescription vmstate_pit_channel = { + .name = "pit channel", + .version_id = 2, + .minimum_version_id = 2, + .minimum_version_id_old = 2, + .fields = (VMStateField []) { + VMSTATE_INT32(count, PITChannelState), + VMSTATE_UINT16(latched_count, PITChannelState), + VMSTATE_UINT8(count_latched, PITChannelState), + VMSTATE_UINT8(status_latched, PITChannelState), + VMSTATE_UINT8(status, PITChannelState), + VMSTATE_UINT8(read_state, PITChannelState), + VMSTATE_UINT8(write_state, PITChannelState), + VMSTATE_UINT8(write_latch, PITChannelState), + VMSTATE_UINT8(rw_mode, PITChannelState), + VMSTATE_UINT8(mode, PITChannelState), + VMSTATE_UINT8(bcd, PITChannelState), + VMSTATE_UINT8(gate, PITChannelState), + VMSTATE_INT64(count_load_time, PITChannelState), + VMSTATE_INT64(next_transition_time, PITChannelState), + VMSTATE_END_OF_LIST() } -} +}; -static int pit_load(QEMUFile *f, void *opaque, int version_id) +static int pit_load_old(QEMUFile *f, void *opaque, int version_id) { PITState *pit = opaque; PITChannelState *s; @@ -449,6 +445,19 @@ static int pit_load(QEMUFile *f, void *opaque, int version_id) return 0; } +static const VMStateDescription vmstate_pit = { + .name = "i8254", + .version_id = 2, + .minimum_version_id = 2, + .minimum_version_id_old = 1, + .load_state_old = pit_load_old, + .fields = (VMStateField []) { + VMSTATE_STRUCT_ARRAY(channels, PITState, 3, 2, vmstate_pit_channel, PITChannelState), + VMSTATE_TIMER(channels[0].irq_timer, PITState), + VMSTATE_END_OF_LIST() + } +}; + static void pit_reset(void *opaque) { PITState *pit = opaque; @@ -495,8 +504,7 @@ PITState *pit_init(int base, qemu_irq irq) s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); s->irq = irq; - register_savevm("i8254", base, 1, pit_save, pit_load, pit); - + vmstate_register(base, &vmstate_pit, pit); qemu_register_reset(pit_reset, pit); register_ioport_write(base, 4, 1, pit_ioport_write, pit); register_ioport_read(base, 3, 1, pit_ioport_read, pit); |