Index: xen-4.0.0-testing/tools/ioemu-remote/hw/xen_platform.c =================================================================== --- xen-4.0.0-testing.orig/tools/ioemu-remote/hw/xen_platform.c 2010-02-18 14:08:08.000000000 -0700 +++ xen-4.0.0-testing/tools/ioemu-remote/hw/xen_platform.c 2010-02-18 14:28:59.000000000 -0700 @@ -359,6 +359,8 @@ static void platform_ioport_write(void * case 4: fprintf(logfile, "Disconnect IDE hard disk...\n"); ide_unplug_harddisks(); + fprintf(logfile, "Disconnect SCSI hard disk...\n"); + pci_unplug_scsi(); fprintf(logfile, "Disconnect netifs...\n"); pci_unplug_netifs(); fprintf(logfile, "Shutdown taps...\n"); Index: xen-4.0.0-testing/tools/ioemu-remote/qemu-xen.h =================================================================== --- xen-4.0.0-testing.orig/tools/ioemu-remote/qemu-xen.h 2010-02-18 14:08:08.000000000 -0700 +++ xen-4.0.0-testing/tools/ioemu-remote/qemu-xen.h 2010-02-18 14:44:28.000000000 -0700 @@ -57,6 +57,7 @@ void unset_vram_mapping(void *opaque); #endif void pci_unplug_netifs(void); +void pci_unplug_scsi(void); void destroy_hvm_domain(void); void unregister_iomem(target_phys_addr_t start); Index: xen-4.0.0-testing/tools/ioemu-remote/hw/pci.c =================================================================== --- xen-4.0.0-testing.orig/tools/ioemu-remote/hw/pci.c 2010-02-18 14:49:36.000000000 -0700 +++ xen-4.0.0-testing/tools/ioemu-remote/hw/pci.c 2010-02-18 14:53:47.000000000 -0700 @@ -892,6 +892,50 @@ void pci_unplug_netifs(void) } } +void pci_unplug_scsi(void) +{ + PCIBus *bus; + PCIDevice *dev; + PCIIORegion *region; + int x; + int i; + + /* We only support one PCI bus */ + for (bus = first_bus; bus; bus = NULL) { + for (x = 0; x < 256; x++) { + dev = bus->devices[x]; + if (dev && + dev->config[0xa] == 0 && + dev->config[0xb] == 1 +#ifdef CONFIG_PASSTHROUGH + && test_pci_devfn(x) != 1 +#endif + ) { + /* Found a scsi disk. Remove it from the bus. Note that + we don't free it here, since there could still be + references to it floating around. There are only + ever one or two structures leaked, and it's not + worth finding them all. */ + bus->devices[x] = NULL; + for (i = 0; i < PCI_NUM_REGIONS; i++) { + region = &dev->io_regions[i]; + if (region->addr == (uint32_t)-1 || + region->size == 0) + continue; + fprintf(logfile, "region type %d at [%x,%x).\n", + region->type, region->addr, + region->addr+region->size); + if (region->type == PCI_ADDRESS_SPACE_IO) { + isa_unassign_ioport(region->addr, region->size); + } else if (region->type == PCI_ADDRESS_SPACE_MEM) { + unregister_iomem(region->addr); + } + } + } + } + } +} + typedef struct { PCIDevice dev; PCIBus *bus;