[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] device-assignment: register a reset function
From: |
Bernhard Kohl |
Subject: |
[Qemu-devel] [PATCH] device-assignment: register a reset function |
Date: |
Mon, 15 Nov 2010 12:33:57 +0100 |
This is necessary because during reboot of a VM the assigned devices
continue DMA transfers which causes memory corruption.
Signed-off-by: Thomas Ostler <address@hidden>
Signed-off-by: Bernhard Kohl <address@hidden>
---
Sorry for for the long delay. Finally we added Alex' suggestions
and rebased the patch.
Thanks
Bernhard
---
hw/device-assignment.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 5f5bde1..3f8de66 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -1434,6 +1434,17 @@ static void
assigned_dev_unregister_msix_mmio(AssignedDevice *dev)
dev->msix_table_page = NULL;
}
+static void reset_assigned_device(DeviceState *dev)
+{
+ PCIDevice *d = DO_UPCAST(PCIDevice, qdev, dev);
+ uint32_t conf;
+
+ /* reset the bus master bit to avoid further DMA transfers */
+ conf = assigned_dev_pci_read_config(d, PCI_COMMAND, 2);
+ conf &= ~PCI_COMMAND_MASTER;
+ assigned_dev_pci_write_config(d, PCI_COMMAND, conf, 2);
+}
+
static int assigned_initfn(struct PCIDevice *pci_dev)
{
AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
@@ -1544,6 +1555,7 @@ static PCIDeviceInfo assign_info = {
.qdev.name = "pci-assign",
.qdev.desc = "pass through host pci devices to the guest",
.qdev.size = sizeof(AssignedDevice),
+ .qdev.reset = reset_assigned_device,
.init = assigned_initfn,
.exit = assigned_exitfn,
.config_read = assigned_dev_pci_read_config,
--
1.7.2.3
- [Qemu-devel] [PATCH] device-assignment: register a reset function,
Bernhard Kohl <=