mirror of https://github.com/xemu-project/xemu.git
ehci: add live migration support
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
93bfef4c6e
commit
9a77340827
|
@ -414,16 +414,17 @@ struct EHCIState {
|
||||||
*/
|
*/
|
||||||
QEMUTimer *frame_timer;
|
QEMUTimer *frame_timer;
|
||||||
QEMUBH *async_bh;
|
QEMUBH *async_bh;
|
||||||
int astate; // Current state in asynchronous schedule
|
uint32_t astate; /* Current state in asynchronous schedule */
|
||||||
int pstate; // Current state in periodic schedule
|
uint32_t pstate; /* Current state in periodic schedule */
|
||||||
USBPort ports[NB_PORTS];
|
USBPort ports[NB_PORTS];
|
||||||
USBPort *companion_ports[NB_PORTS];
|
USBPort *companion_ports[NB_PORTS];
|
||||||
uint32_t usbsts_pending;
|
uint32_t usbsts_pending;
|
||||||
EHCIQueueHead aqueues;
|
EHCIQueueHead aqueues;
|
||||||
EHCIQueueHead pqueues;
|
EHCIQueueHead pqueues;
|
||||||
|
|
||||||
uint32_t a_fetch_addr; // which address to look at next
|
/* which address to look at next */
|
||||||
uint32_t p_fetch_addr; // which address to look at next
|
uint32_t a_fetch_addr;
|
||||||
|
uint32_t p_fetch_addr;
|
||||||
|
|
||||||
USBPacket ipacket;
|
USBPacket ipacket;
|
||||||
QEMUSGList isgl;
|
QEMUSGList isgl;
|
||||||
|
@ -2390,9 +2391,58 @@ static USBBusOps ehci_bus_ops = {
|
||||||
.register_companion = ehci_register_companion,
|
.register_companion = ehci_register_companion,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int usb_ehci_post_load(void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
EHCIState *s = opaque;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NB_PORTS; i++) {
|
||||||
|
USBPort *companion = s->companion_ports[i];
|
||||||
|
if (companion == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (s->portsc[i] & PORTSC_POWNER) {
|
||||||
|
companion->dev = s->ports[i].dev;
|
||||||
|
} else {
|
||||||
|
companion->dev = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_ehci = {
|
static const VMStateDescription vmstate_ehci = {
|
||||||
.name = "ehci",
|
.name = "ehci",
|
||||||
.unmigratable = 1,
|
.version_id = 1,
|
||||||
|
.post_load = usb_ehci_post_load,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_PCI_DEVICE(dev, EHCIState),
|
||||||
|
/* mmio registers */
|
||||||
|
VMSTATE_UINT32(usbcmd, EHCIState),
|
||||||
|
VMSTATE_UINT32(usbsts, EHCIState),
|
||||||
|
VMSTATE_UINT32(usbintr, EHCIState),
|
||||||
|
VMSTATE_UINT32(frindex, EHCIState),
|
||||||
|
VMSTATE_UINT32(ctrldssegment, EHCIState),
|
||||||
|
VMSTATE_UINT32(periodiclistbase, EHCIState),
|
||||||
|
VMSTATE_UINT32(asynclistaddr, EHCIState),
|
||||||
|
VMSTATE_UINT32(configflag, EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[0], EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[1], EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[2], EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[3], EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[4], EHCIState),
|
||||||
|
VMSTATE_UINT32(portsc[5], EHCIState),
|
||||||
|
/* frame timer */
|
||||||
|
VMSTATE_TIMER(frame_timer, EHCIState),
|
||||||
|
VMSTATE_UINT64(last_run_ns, EHCIState),
|
||||||
|
VMSTATE_UINT32(async_stepdown, EHCIState),
|
||||||
|
/* schedule state */
|
||||||
|
VMSTATE_UINT32(astate, EHCIState),
|
||||||
|
VMSTATE_UINT32(pstate, EHCIState),
|
||||||
|
VMSTATE_UINT32(a_fetch_addr, EHCIState),
|
||||||
|
VMSTATE_UINT32(p_fetch_addr, EHCIState),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property ehci_properties[] = {
|
static Property ehci_properties[] = {
|
||||||
|
|
Loading…
Reference in New Issue