This hotplug state will be used to remove a device without the guest
cooperation.

Signed-off-by: Anthony PERARD <anthony.per...@citrix.com>
---
 hw/acpi_piix4.c |    5 +++++
 hw/pci.h        |    1 +
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 585da4e..dfd5a9d 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -587,6 +587,11 @@ static int piix4_device_hotplug(DeviceState *qdev, 
PCIDevice *dev,
         return 0;
     }
 
+    if (state == PCI_FORCE_EJECT) {
+        acpi_piix_eject_slot(s, 1 << slot);
+        return 0;
+    }
+
     if (state == PCI_HOTPLUG_ENABLED) {
         enable_device(s, slot);
     } else {
diff --git a/hw/pci.h b/hw/pci.h
index 8d0aa49..3b61e43 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -273,6 +273,7 @@ typedef enum {
     PCI_HOTPLUG_DISABLED,
     PCI_HOTPLUG_ENABLED,
     PCI_COLDPLUG_ENABLED,
+    PCI_FORCE_EJECT,
 } PCIHotplugState;
 
 typedef int (*pci_hotplug_fn)(DeviceState *qdev, PCIDevice *pci_dev,
-- 
Anthony PERARD


Reply via email to