Fix pc migration from qemu <= 1.5
The following commit introduced a migration incompatibility: commit568f0690fdAuthor: David Gibson <david@gibson.dropbear.id.au> Date: Thu Jun 6 18:48:49 2013 +1000 pci: Replace pci_find_domain() with more general pci_root_bus_path() The issue is that i440fx savevm idstr went from 0000:00:00.0/I440FX to 0000:00.0/I440FX. Unfortunately we are stuck with the breakage for 1.6 machine types. Add a compat property to maintain the busted idstr for the 1.6 machine types, but revert to the old style format for 1.7+, and <= 1.5. Tested with migration from qemu 1.5, qemu 1.6, and qemu.git. Cc: qemu-stable@nongnu.org Signed-off-by: Cole Robinson <crobinso@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> (cherry picked from commit04c7d8b8de) Conflicts: include/hw/i386/pc.h *removed 1.6 compat properties *enabled short_root_bus by default to enable for 1.6 (no 1.6 compat fields to do so in 1.6.x) Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									2c8187434f
								
							
						
					
					
						commit
						53e8cf93b3
					
				|  | @ -48,6 +48,7 @@ typedef struct I440FXState { | |||
|     PCIHostState parent_obj; | ||||
|     PcPciInfo pci_info; | ||||
|     uint64_t pci_hole64_size; | ||||
|     uint32_t short_root_bus; | ||||
| } I440FXState; | ||||
| 
 | ||||
| #define PIIX_NUM_PIC_IRQS       16      /* i8259 * 2 */ | ||||
|  | @ -706,13 +707,19 @@ static const TypeInfo i440fx_info = { | |||
| static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge, | ||||
|                                                 PCIBus *rootbus) | ||||
| { | ||||
|     I440FXState *s = I440FX_PCI_HOST_BRIDGE(host_bridge); | ||||
| 
 | ||||
|     /* For backwards compat with old device paths */ | ||||
|     return "0000"; | ||||
|     if (s->short_root_bus) { | ||||
|         return "0000"; | ||||
|     } | ||||
|     return "0000:00"; | ||||
| } | ||||
| 
 | ||||
| static Property i440fx_props[] = { | ||||
|     DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, I440FXState, | ||||
|                      pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE), | ||||
|     DEFINE_PROP_UINT32("short_root_bus", I440FXState, short_root_bus, 1), | ||||
|     DEFINE_PROP_END_OF_LIST(), | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -61,8 +61,13 @@ static void q35_host_realize(DeviceState *dev, Error **errp) | |||
| static const char *q35_host_root_bus_path(PCIHostState *host_bridge, | ||||
|                                           PCIBus *rootbus) | ||||
| { | ||||
|     /* For backwards compat with old device paths */ | ||||
|     return "0000"; | ||||
|     Q35PCIHost *s = Q35_HOST_DEVICE(host_bridge); | ||||
| 
 | ||||
|      /* For backwards compat with old device paths */ | ||||
|     if (s->mch.short_root_bus) { | ||||
|         return "0000"; | ||||
|     } | ||||
|     return "0000:00"; | ||||
| } | ||||
| 
 | ||||
| static void q35_host_get_pci_hole_start(Object *obj, Visitor *v, | ||||
|  | @ -108,6 +113,7 @@ static Property mch_props[] = { | |||
|                         MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT), | ||||
|     DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, Q35PCIHost, | ||||
|                      mch.pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE), | ||||
|     DEFINE_PROP_UINT32("short_root_bus", Q35PCIHost, mch.short_root_bus, 1), | ||||
|     DEFINE_PROP_END_OF_LIST(), | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -258,6 +258,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t); | |||
|             .driver = TYPE_X86_CPU,\ | ||||
|             .property = "pmu",\ | ||||
|             .value = "on",\ | ||||
|         },{\ | ||||
|             .driver   = "i440FX-pcihost",\ | ||||
|             .property = "short_root_bus",\ | ||||
|             .value    = stringify(0),\ | ||||
|         },{\ | ||||
|             .driver   = "q35-pcihost",\ | ||||
|             .property = "short_root_bus",\ | ||||
|             .value    = stringify(0),\ | ||||
|         } | ||||
| 
 | ||||
| #define PC_COMPAT_1_4 \ | ||||
|  |  | |||
|  | @ -61,6 +61,7 @@ typedef struct MCHPCIState { | |||
|     ram_addr_t above_4g_mem_size; | ||||
|     uint64_t pci_hole64_size; | ||||
|     PcGuestInfo *guest_info; | ||||
|     uint32_t short_root_bus; | ||||
| } MCHPCIState; | ||||
| 
 | ||||
| typedef struct Q35PCIHost { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Cole Robinson
						Cole Robinson