Am 03.07.2013 17:04, schrieb Don Koch: > From: Don Koch <dk...@verizon.com> > > Update mappings for PCI bridge after live migration. > > Signed-off-by: Don Koch <dk...@verizon.com> > --- > This fixes bug 1187529: devices on a PCI bridge stop working after migration.
Feel free to reference this as LP#1187529 in the commit message if this is from QEMU's Launchpad bug tracker. > > hw/pci-bridge/pci_bridge_dev.c | 9 +++++++++ > hw/pci/pci_bridge.c | 2 +- > include/hw/pci/pci_bridge.h | 1 + > 3 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c > index 971b432..9e5062e 100644 > --- a/hw/pci-bridge/pci_bridge_dev.c > +++ b/hw/pci-bridge/pci_bridge_dev.c > @@ -110,6 +110,14 @@ static void qdev_pci_bridge_dev_reset(DeviceState *qdev) > shpc_reset(dev); > } > > +static int pci_bridge_dev_post_load(void *opaque, int ver) { > + PCIDevice *d = opaque; > + PCIBridge *s = container_of(d, PCIBridge, dev); Casting should no longer be done that way. It seems there is no PCI_BRIDGE() cast macro in upstream yet, but it doesn't seem necessary either. You can just use: PCIBridge *s = opaque; for simplicity. Functional change looks sensible to me. Regards, Andreas > + > + pci_bridge_update_mappings(s); > + return 0; > +} > + > static Property pci_bridge_dev_properties[] = { > /* Note: 0 is not a legal chassis number. */ > DEFINE_PROP_UINT8("chassis_nr", PCIBridgeDev, chassis_nr, 0), > @@ -119,6 +127,7 @@ static Property pci_bridge_dev_properties[] = { > > static const VMStateDescription pci_bridge_dev_vmstate = { > .name = "pci_bridge", > + .post_load = pci_bridge_dev_post_load, > .fields = (VMStateField[]) { > VMSTATE_PCI_DEVICE(bridge.dev, PCIBridgeDev), > SHPC_VMSTATE(bridge.dev.shpc, PCIBridgeDev), > diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c > index 24be6c5..3897bd8 100644 > --- a/hw/pci/pci_bridge.c > +++ b/hw/pci/pci_bridge.c > @@ -224,7 +224,7 @@ static void pci_bridge_region_cleanup(PCIBridge *br, > PCIBridgeWindows *w) > g_free(w); > } > > -static void pci_bridge_update_mappings(PCIBridge *br) > +void pci_bridge_update_mappings(PCIBridge *br) > { > PCIBridgeWindows *w = br->windows; > > diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h > index 1868f7a..1d8f997 100644 > --- a/include/hw/pci/pci_bridge.h > +++ b/include/hw/pci/pci_bridge.h > @@ -37,6 +37,7 @@ PCIBus *pci_bridge_get_sec_bus(PCIBridge *br); > pcibus_t pci_bridge_get_base(const PCIDevice *bridge, uint8_t type); > pcibus_t pci_bridge_get_limit(const PCIDevice *bridge, uint8_t type); > > +void pci_bridge_update_mappings(PCIBridge *br); > void pci_bridge_write_config(PCIDevice *d, > uint32_t address, uint32_t val, int len); > void pci_bridge_disable_base_limit(PCIDevice *dev); > -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg