usb device haven't save&&restore in ioemu-remote.
patch for that:
diff -r 21508368a9db tools/ioemu-remote/hw/usb-hid.c --- a/tools/ioemu-remote/hw/usb-hid.c Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/hw/usb-hid.c Wed Mar 04 11:55:39 2009 +0800 @@ -870,6 +870,60 @@ qemu_free(s); } +void usb_mouse_save(QEMUFile *f, void *opaque) +{ + USBHIDState *hs = (USBHIDState *)opaque; + USBPointerState *s = &hs->ptr; + USBPointerEvent *e; + if (s->head == s->tail) + /* use the last report */ + s->head = (s->head - 1) & QUEUEINDEXMASK; + e = &s->queue[s->head]; + + /* save usb dev */ + generic_usb_save(f, &hs->dev); + + qemu_put_be32(f, e->xdx); + qemu_put_be32(f, e->ydy); + qemu_put_be32(f, e->dz); + qemu_put_be32(f, e->buttons_state); + qemu_put_be32(f, hs->kind); + qemu_put_be32(f, s->mouse_grabbed); + qemu_put_be32(f, s->xyrel); + qemu_put_be32(f, hs->protocol); + +} + +int usb_mouse_load(QEMUFile *f, void *opaque, int version_id) +{ + USBHIDState *hs = (USBHIDState *)opaque; + USBPointerState *s = &hs->ptr; + USBPointerEvent *e; + + if (version_id != 1) + return -EINVAL; + + if (s->head == s->tail) + /* use the last report */ + s->head = (s->head - 1) & QUEUEINDEXMASK; + e = &s->queue[s->head]; + + /* load usb dev */ + generic_usb_save(f, &hs->dev); + + qemu_get_be32s(f,&e->xdx); + qemu_get_be32s(f,&e->ydy); + qemu_get_be32s(f, &e->dz); + qemu_get_be32s(f, &e->buttons_state); + qemu_get_be32s(f, &hs->kind); + qemu_get_be32s(f, &s->mouse_grabbed); + qemu_get_be32s(f,&s->xyrel); + qemu_get_be32s(f,&hs->protocol); + + qemu_add_mouse_event_handler(usb_pointer_event, hs,!s->xyrel, "QEMU USB Pointer"); + return 0; +} + static USBDevice *usb_pointer_init(int kind, int xyrel, const char *devname) { USBHIDState *s; @@ -894,6 +948,7 @@ s->ptr.tail = 1; pstrcpy(s->dev.devname, sizeof(s->dev.devname), devname); + register_savevm("USB_mouse_dev", 0, 1, usb_mouse_save, usb_mouse_load, s); return (USBDevice *)s; } diff -r 21508368a9db tools/ioemu-remote/hw/usb-ohci.c --- a/tools/ioemu-remote/hw/usb-ohci.c Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/hw/usb-ohci.c Wed Mar 04 11:55:39 2009 +0800 @@ -1634,6 +1634,20 @@ OHCIState state; } OHCIPCIState; +static void ohci_usb_save(QEMUFile *f, void *opaque) +{ + OHCIPCIState *ohci_pci = (OHCIPCIState *)opaque; + + pci_device_save(&ohci_pci->pci_dev, f); +} + +static int ohci_usb_load(QEMUFile *f, void *opaque, int version_id) +{ + OHCIPCIState *ohci_pci = (OHCIPCIState *)opaque; + + return pci_device_load(&ohci_pci->pci_dev, f); +} + static void ohci_mapfunc(PCIDevice *pci_dev, int i, uint32_t addr, uint32_t size, int type) { @@ -1669,6 +1683,7 @@ pci_register_io_region((struct PCIDevice *)ohci, 0, 256, PCI_ADDRESS_SPACE_MEM, ohci_mapfunc); + register_savevm("OHCI USB", 0, 1, ohci_usb_save, ohci_usb_load, ohci); } void usb_ohci_init_pxa(target_phys_addr_t base, int num_ports, int devfn, diff -r 21508368a9db tools/ioemu-remote/hw/usb-uhci.c --- a/tools/ioemu-remote/hw/usb-uhci.c Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/hw/usb-uhci.c Wed Mar 04 11:55:39 2009 +0800 @@ -902,6 +902,57 @@ register_ioport_read(addr, 32, 1, uhci_ioport_readb, s); } +void uhci_usb_save(QEMUFile *f, void *opaque) +{ + int i; + UHCIState *s = (UHCIState*)opaque; + + pci_device_save(&s->dev,f); + + 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); + + for(i = 0; i < NB_PORTS; i++) { + qemu_put_be16s(f, &s->ports[i].ctrl); + } + + qemu_put_timer(f, s->frame_timer); +} + +int uhci_usb_load(QEMUFile *f, void *opaque, int version_id) +{ + int i,ret; + UHCIState *s = (UHCIState*)opaque; + + if (version_id != 1) + return -EINVAL; + + ret = pci_device_load(&s->dev, f); + if (ret < 0) + return ret; + + 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); + + for(i = 0; i < NB_PORTS; i++) { + qemu_get_be16s(f, &s->ports[i].ctrl); + } + + qemu_get_timer(f, s->frame_timer); + + return 0; +} + void usb_uhci_piix3_init(PCIBus *bus, int devfn) { UHCIState *s; @@ -935,6 +986,7 @@ to rely on this. */ pci_register_io_region(&s->dev, 4, 0x20, PCI_ADDRESS_SPACE_IO, uhci_map); + register_savevm("UHCI_usb_controller", 0, 1, uhci_usb_save, uhci_usb_load, s); } void usb_uhci_piix4_init(PCIBus *bus, int devfn) @@ -970,4 +1022,5 @@ to rely on this. */ pci_register_io_region(&s->dev, 4, 0x20, PCI_ADDRESS_SPACE_IO, uhci_map); + register_savevm("UHCI_usb_controller", 0, 1, uhci_usb_save, uhci_usb_load, s); } diff -r 21508368a9db tools/ioemu-remote/hw/usb.c --- a/tools/ioemu-remote/hw/usb.c Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/hw/usb.c Wed Mar 04 11:55:39 2009 +0800 @@ -23,6 +23,7 @@ */ #include "qemu-common.h" #include "usb.h" +#include "hw.h" void usb_attach(USBPort *port, USBDevice *dev) { @@ -202,3 +203,43 @@ dev->handle_packet(dev, &p); } +void generic_usb_save(QEMUFile* f, void *opaque) +{ + USBDevice *s = (USBDevice*)opaque; + + qemu_put_be32s(f, &s->speed); + qemu_put_8s(f, &s->addr); + qemu_put_be32s(f, &s->state); + + qemu_put_buffer(f, s->setup_buf, 8); + qemu_put_buffer(f, s->data_buf, 1024); + + qemu_put_be32s(f, &s->remote_wakeup); + qemu_put_be32s(f, &s->setup_state); + qemu_put_be32s(f, &s->setup_len); + qemu_put_be32s(f, &s->setup_index); + +} + +int generic_usb_load(QEMUFile* f, void *opaque, int version_id) +{ + USBDevice *s = (USBDevice*)opaque; + + if (version_id != 1) + return -EINVAL; + + qemu_get_be32s(f, &s->speed); + qemu_get_8s(f, &s->addr); + qemu_get_be32s(f, &s->state); + + qemu_get_buffer(f, s->setup_buf, 8); + qemu_get_buffer(f, s->data_buf, 1024); + + qemu_get_be32s(f, &s->remote_wakeup); + qemu_get_be32s(f, &s->setup_state); + qemu_get_be32s(f, &s->setup_len); + qemu_get_be32s(f, &s->setup_index); + + return 0; +} + diff -r 21508368a9db tools/ioemu-remote/hw/usb.h --- a/tools/ioemu-remote/hw/usb.h Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/hw/usb.h Wed Mar 04 11:55:39 2009 +0800 @@ -257,3 +257,6 @@ uint32_t musb_core_intr_get(struct musb_s *s); void musb_core_intr_clear(struct musb_s *s, uint32_t mask); void musb_set_size(struct musb_s *s, int epnum, int size, int is_tx); + +void generic_usb_save(QEMUFile* f, void *opaque); +int generic_usb_load(QEMUFile* f, void *opaque, int version_id); diff -r 21508368a9db tools/ioemu-remote/vl.c --- a/tools/ioemu-remote/vl.c Fri Feb 20 21:14:55 2009 +0800 +++ b/tools/ioemu-remote/vl.c Wed Mar 04 11:55:39 2009 +0800 @@ -5504,6 +5504,7 @@ const char *p; USBDevice *dev; USBPort *port; + char usb_name[256] = "USB "; if (!free_usb_ports) return -1; @@ -5549,6 +5550,11 @@ port = free_usb_ports; } + pstrcpy(usb_name + strlen(usb_name), + sizeof(usb_name) - strlen(usb_name), + devname); + register_savevm(usb_name, 0, 1, generic_usb_save, generic_usb_load, dev); + free_usb_ports = port->next; port->next = used_usb_ports; used_usb_ports = port;
thanks
James Song ( Song Wei )
|