@@ -1450,6 +1450,17 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev)
dev->msix_table_page = NULL;
}
+static void reset_assigned_device(void *opaque)
+{
+ PCIDevice *d = (PCIDevice *)opaque;
+ uint32_t conf;
+
+ /* reset the bus master bit to avoid further DMA transfers */
+ conf = assigned_dev_pci_read_config(d, 0x04, 0x02);
+ conf &= ~0x04;
+ assigned_dev_pci_write_config(d, 0x04, conf, 0x02);
+}
+
static int assigned_initfn(struct PCIDevice *pci_dev)
{
AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
@@ -1499,6 +1510,9 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
if (r < 0)
goto assigned_out;
+ /* register reset function for the device */
+ qemu_register_reset(reset_assigned_device, pci_dev);
+
/* intercept MSI-X entry page in the MMIO */
if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX)
if (assigned_dev_register_msix_mmio(dev))