From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bernhard Kohl Subject: [PATCH] device-assignment: register a reset function Date: Fri, 17 Sep 2010 17:27:51 +0200 Message-ID: <1284737271-21457-1-git-send-email-bernhard.kohl@nsn.com> References: <4C9377DA.9050904@nsn.com> Cc: kwolf@redhat.com, alex.williamson@redhat.com, Bernhard Kohl , Thomas Ostler To: kvm@vger.kernel.org Return-path: Received: from demumfd001.nsn-inter.net ([93.183.12.32]:14919 "EHLO demumfd001.nsn-inter.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754303Ab0IQP22 (ORCPT ); Fri, 17 Sep 2010 11:28:28 -0400 In-Reply-To: <4C9377DA.9050904@nsn.com> Sender: kvm-owner@vger.kernel.org List-ID: This is necessary because during reboot of a VM the assigned devices continue DMA transfers which causes memory corruption. Signed-off-by: Thomas Ostler Signed-off-by: Bernhard Kohl --- hw/device-assignment.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 87f7418..fb47813 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -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, 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); @@ -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)) -- 1.7.2.2