📄 ioemu-save-restore-usb
字号:
Index: ioemu/hw/usb-hid.c===================================================================--- ioemu.orig/hw/usb-hid.c 2007-05-09 14:10:50.000000000 +0100+++ ioemu/hw/usb-hid.c 2007-05-09 14:11:27.000000000 +0100@@ -510,6 +510,51 @@ qemu_free(s); } +void usb_mouse_save(QEMUFile *f, void *opaque)+{+ USBMouseState *s = (USBMouseState*)opaque;++ qemu_put_be32s(f, &s->dx);+ qemu_put_be32s(f, &s->dy);+ qemu_put_be32s(f, &s->dz);+ qemu_put_be32s(f, &s->buttons_state);+ qemu_put_be32s(f, &s->x);+ qemu_put_be32s(f, &s->y);+ qemu_put_be32s(f, &s->kind);+ qemu_put_be32s(f, &s->mouse_grabbed);+ qemu_put_be32s(f, &s->status_changed);++}++int usb_mouse_load(QEMUFile *f, void *opaque, int version_id)+{+ USBMouseState *s = (USBMouseState*)opaque;++ if (version_id != 1)+ return -EINVAL;++ qemu_get_be32s(f, &s->dx);+ qemu_get_be32s(f, &s->dy);+ qemu_get_be32s(f, &s->dz);+ qemu_get_be32s(f, &s->buttons_state);+ qemu_get_be32s(f, &s->x);+ qemu_get_be32s(f, &s->y);+ qemu_get_be32s(f, &s->kind);+ qemu_get_be32s(f, &s->mouse_grabbed);+ qemu_get_be32s(f, &s->status_changed);++ if ( s->kind == USB_TABLET) {+ fprintf(logfile, "usb_mouse_load:add usb_tablet_event.\n");+ qemu_add_mouse_event_handler(usb_tablet_event, s, 1, "QEMU USB Tablet");+ } else if ( s->kind == USB_MOUSE) {+ fprintf(logfile, "usb_mouse_load:add usb_mouse_event.\n");+ qemu_add_mouse_event_handler(usb_mouse_event, s, 0, "QEMU USB MOUSE");+ }++ return 0;+}++ USBDevice *usb_tablet_init(void) { USBMouseState *s;@@ -528,6 +573,8 @@ pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet"); + register_savevm("USB tablet dev", 0, 1, usb_mouse_save, usb_mouse_load, s);+ return (USBDevice *)s; } @@ -549,5 +596,7 @@ pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse"); + register_savevm("USB mouse dev", 0, 1, usb_mouse_save, usb_mouse_load, s);+ return (USBDevice *)s; }Index: ioemu/vl.c===================================================================--- ioemu.orig/vl.c 2007-05-09 14:10:50.000000000 +0100+++ ioemu/vl.c 2007-05-09 14:11:19.000000000 +0100@@ -4076,6 +4076,7 @@ const char *p; USBDevice *dev; USBPort *port;+ char usb_name[256] = "USB "; if (!free_usb_ports) return -1;@@ -4112,6 +4113,12 @@ free_usb_ports = port->next; port->next = used_usb_ports; used_usb_ports = port;++ 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);+ usb_attach(port, dev); return 0; }Index: ioemu/hw/usb.c===================================================================--- ioemu.orig/hw/usb.c 2007-05-09 14:10:50.000000000 +0100+++ ioemu/hw/usb.c 2007-05-09 14:11:01.000000000 +0100@@ -201,3 +201,42 @@ 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;+}Index: ioemu/hw/usb-ohci.c===================================================================--- ioemu.orig/hw/usb-ohci.c 2007-05-09 14:10:50.000000000 +0100+++ ioemu/hw/usb-ohci.c 2007-05-09 14:11:01.000000000 +0100@@ -1215,6 +1215,20 @@ cpu_register_physical_memory(addr, size, ohci->mem); } +static void ohci_usb_save(QEMUFile *f, void *opaque)+{+ OHCIState *ohci = opaque;++ pci_device_save(&ohci->pci_dev, f);+}++static int ohci_usb_load(QEMUFile *f, void *opaque, int version_id)+{+ OHCIState *ohci = opaque;++ return pci_device_load(&ohci->pci_dev, f);+}+ void usb_ohci_init(struct PCIBus *bus, int num_ports, int devfn) { OHCIState *ohci;@@ -1265,6 +1279,8 @@ qemu_register_usb_port(&ohci->rhport[i].port, ohci, i, ohci_attach); } + register_savevm("OHCI USB", 0, 1, ohci_usb_save, ohci_usb_load, ohci);+ ohci->async_td = 0; ohci_reset(ohci); }Index: ioemu/hw/usb.h===================================================================--- ioemu.orig/hw/usb.h 2007-05-09 14:10:50.000000000 +0100+++ ioemu/hw/usb.h 2007-05-09 14:11:01.000000000 +0100@@ -218,3 +218,9 @@ /* usb-msd.c */ USBDevice *usb_msd_init(const char *filename);++/* usb.c */+void generic_usb_save(QEMUFile* f, void *opaque);+int generic_usb_load(QEMUFile* f, void *opaque, int version_id);++Index: ioemu/hw/usb-uhci.c===================================================================--- ioemu.orig/hw/usb-uhci.c 2007-05-09 14:10:50.000000000 +0100+++ ioemu/hw/usb-uhci.c 2007-05-09 14:11:18.000000000 +0100@@ -760,6 +760,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;+ UHCIState *s = (UHCIState*)opaque;++ if (version_id != 1)+ return -EINVAL;++ i = pci_device_load(&s->dev, f);+ if (i < 0)+ return i;++ 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_init(PCIBus *bus, int devfn) { UHCIState *s;@@ -793,4 +844,6 @@ 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); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -