diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2016-10-24 10:26:44 +0100 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2016-10-24 10:26:44 +0100 |
| commit | 4387f5671f9676336c87b68f5e87ba54fbea3714 (patch) | |
| tree | a0cf4005a503f0c8120d645cc028ec74f1a8fc5c /hw/i386/xen/xen_platform.c | |
| parent | b49e452fe994f8fbcd22bf5a87b79a2355481318 (diff) | |
| parent | 35132016dc1c27de2b1354b161df6cc22f3ac5bf (diff) | |
| download | focaccia-qemu-4387f5671f9676336c87b68f5e87ba54fbea3714.tar.gz focaccia-qemu-4387f5671f9676336c87b68f5e87ba54fbea3714.zip | |
Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20161021-tag' into staging
Xen 2016/10/21 # gpg: Signature made Fri 21 Oct 2016 20:52:42 BST # gpg: using RSA key 0x894F8F4870E1AE90 # gpg: Good signature from "Stefano Stabellini <sstabellini@kernel.org>" # gpg: aka "Stefano Stabellini <stefano.stabellini@eu.citrix.com>" # Primary key fingerprint: D04E 33AB A51F 67BA 07D3 0AEA 894F 8F48 70E1 AE90 * remotes/sstabellini/tags/xen-20161021-tag: xen_platform: SUSE xenlinux unplug for emulated PCI xen_platform: unplug also SCSI disks xen-usb: do not reference PAGE_SIZE Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/i386/xen/xen_platform.c')
| -rw-r--r-- | hw/i386/xen/xen_platform.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c index f85635cc9a..2e1e543881 100644 --- a/hw/i386/xen/xen_platform.c +++ b/hw/i386/xen/xen_platform.c @@ -114,6 +114,10 @@ static void unplug_disks(PCIBus *b, PCIDevice *d, void *o) PCI_CLASS_STORAGE_IDE && strcmp(d->name, "xen-pci-passthrough") != 0) { pci_piix3_xen_ide_unplug(DEVICE(d)); + } else if (pci_get_word(d->config + PCI_CLASS_DEVICE) == + PCI_CLASS_STORAGE_SCSI + && strcmp(d->name, "xen-pci-passthrough") != 0) { + object_unparent(OBJECT(d)); } } @@ -307,13 +311,38 @@ static void xen_platform_ioport_writeb(void *opaque, hwaddr addr, uint64_t val, unsigned int size) { PCIXenPlatformState *s = opaque; + PCIDevice *pci_dev = PCI_DEVICE(s); switch (addr) { case 0: /* Platform flags */ platform_fixed_ioport_writeb(opaque, 0, (uint32_t)val); break; + case 4: + if (val == 1) { + /* + * SUSE unplug for Xenlinux + * xen-kmp used this since xen-3.0.4, instead the official protocol + * from xen-3.3+ It did an unconditional "outl(1, (ioaddr + 4));" + * Pre VMDP 1.7 used 4 and 8 depending on how VMDP was configured. + * If VMDP was to control both disk and LAN it would use 4. + * If it controlled just disk or just LAN, it would use 8 below. + */ + pci_unplug_disks(pci_dev->bus); + pci_unplug_nics(pci_dev->bus); + } + break; case 8: - log_writeb(s, (uint32_t)val); + switch (val) { + case 1: + pci_unplug_disks(pci_dev->bus); + break; + case 2: + pci_unplug_nics(pci_dev->bus); + break; + default: + log_writeb(s, (uint32_t)val); + break; + } break; default: break; |