diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c index 99aa7d1dd0..67a9a233c6 100644 --- a/hw/usb-uhci.c +++ b/hw/usb-uhci.c @@ -351,57 +351,46 @@ static void uhci_reset(void *opaque) uhci_async_cancel_all(s); } -static void uhci_save(QEMUFile *f, void *opaque) +static void uhci_pre_save(void *opaque) { UHCIState *s = opaque; - int i; uhci_async_cancel_all(s); - - pci_device_save(&s->dev, f); - - qemu_put_8s(f, &s->num_ports_vmstate); - for (i = 0; i < s->num_ports_vmstate; ++i) - qemu_put_be16s(f, &s->ports[i].ctrl); - qemu_put_be16s(f, &s->cmd); - qemu_put_be16s(f, &s->status); - qemu_put_be16s(f, &s->intr); - qemu_put_be16s(f, &s->frnum); - qemu_put_be32s(f, &s->fl_base_addr); - qemu_put_8s(f, &s->sof_timing); - qemu_put_8s(f, &s->status2); - qemu_put_timer(f, s->frame_timer); } -static int uhci_load(QEMUFile *f, void *opaque, int version_id) -{ - UHCIState *s = opaque; - int i, ret; +static const VMStateDescription vmstate_uhci_port = { + .name = "uhci port", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField []) { + VMSTATE_UINT16(ctrl, UHCIPort), + VMSTATE_END_OF_LIST() + } +}; - if (version_id > 1) - return -EINVAL; - - ret = pci_device_load(&s->dev, f); - if (ret < 0) - return ret; - - qemu_get_8s(f, &s->num_ports_vmstate); - if (s->num_ports_vmstate != NB_PORTS) - return -EINVAL; - - for (i = 0; i < s->num_ports_vmstate; ++i) - qemu_get_be16s(f, &s->ports[i].ctrl); - qemu_get_be16s(f, &s->cmd); - qemu_get_be16s(f, &s->status); - qemu_get_be16s(f, &s->intr); - qemu_get_be16s(f, &s->frnum); - qemu_get_be32s(f, &s->fl_base_addr); - qemu_get_8s(f, &s->sof_timing); - qemu_get_8s(f, &s->status2); - qemu_get_timer(f, s->frame_timer); - - return 0; -} +static const VMStateDescription vmstate_uhci = { + .name = "uhci", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .pre_save = uhci_pre_save, + .fields = (VMStateField []) { + VMSTATE_PCI_DEVICE(dev, UHCIState), + VMSTATE_UINT8_EQUAL(num_ports_vmstate, UHCIState), + VMSTATE_STRUCT_ARRAY(ports, UHCIState, NB_PORTS, 1, + vmstate_uhci_port, UHCIPort), + VMSTATE_UINT16(cmd, UHCIState), + VMSTATE_UINT16(status, UHCIState), + VMSTATE_UINT16(intr, UHCIState), + VMSTATE_UINT16(frnum, UHCIState), + VMSTATE_UINT32(fl_base_addr, UHCIState), + VMSTATE_UINT8(sof_timing, UHCIState), + VMSTATE_UINT8(status2, UHCIState), + VMSTATE_TIMER(frame_timer, UHCIState), + VMSTATE_END_OF_LIST() + } +}; static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) { @@ -1097,7 +1086,7 @@ static int usb_uhci_common_initfn(UHCIState *s) pci_register_bar(&s->dev, 4, 0x20, PCI_ADDRESS_SPACE_IO, uhci_map); - register_savevm("uhci", 0, 1, uhci_save, uhci_load, s); + vmstate_register(0, &vmstate_uhci, s); return 0; }