提交 64ea8038 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20150109.0' into staging

VFIO fixes:
- Fix 32bit overflow in handling large PCI BARs (Alex Williamson)
- Fix interrupt shutdown ordering (Alex Williamson)

# gpg: Signature made Fri 09 Jan 2015 16:23:42 GMT using RSA key ID 3BB08B22
# gpg: Good signature from "Alex Williamson <alex.williamson@redhat.com>"
# gpg:                 aka "Alex Williamson <alex@shazbot.org>"
# gpg:                 aka "Alex Williamson <alwillia@redhat.com>"
# gpg:                 aka "Alex Williamson <alex.l.williamson@gmail.com>"

* remotes/awilliam/tags/vfio-update-20150109.0:
  vfio-pci: Fix interrupt disabling
  vfio-pci: Fix BAR size overflow
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -2129,16 +2129,19 @@ static void vfio_pci_write_config(PCIDevice *pdev, uint32_t addr, ...@@ -2129,16 +2129,19 @@ static void vfio_pci_write_config(PCIDevice *pdev, uint32_t addr,
*/ */
static void vfio_disable_interrupts(VFIOPCIDevice *vdev) static void vfio_disable_interrupts(VFIOPCIDevice *vdev)
{ {
switch (vdev->interrupt) { /*
case VFIO_INT_INTx: * More complicated than it looks. Disabling MSI/X transitions the
vfio_disable_intx(vdev); * device to INTx mode (if supported). Therefore we need to first
break; * disable MSI/X and then cleanup by disabling INTx.
case VFIO_INT_MSI: */
vfio_disable_msi(vdev); if (vdev->interrupt == VFIO_INT_MSIX) {
break;
case VFIO_INT_MSIX:
vfio_disable_msix(vdev); vfio_disable_msix(vdev);
break; } else if (vdev->interrupt == VFIO_INT_MSI) {
vfio_disable_msi(vdev);
}
if (vdev->interrupt == VFIO_INT_INTx) {
vfio_disable_intx(vdev);
} }
} }
...@@ -2301,7 +2304,7 @@ static void vfio_unmap_bar(VFIOPCIDevice *vdev, int nr) ...@@ -2301,7 +2304,7 @@ static void vfio_unmap_bar(VFIOPCIDevice *vdev, int nr)
static void vfio_map_bar(VFIOPCIDevice *vdev, int nr) static void vfio_map_bar(VFIOPCIDevice *vdev, int nr)
{ {
VFIOBAR *bar = &vdev->bars[nr]; VFIOBAR *bar = &vdev->bars[nr];
unsigned size = bar->region.size; uint64_t size = bar->region.size;
char name[64]; char name[64];
uint32_t pci_bar; uint32_t pci_bar;
uint8_t type; uint8_t type;
...@@ -2351,7 +2354,7 @@ static void vfio_map_bar(VFIOPCIDevice *vdev, int nr) ...@@ -2351,7 +2354,7 @@ static void vfio_map_bar(VFIOPCIDevice *vdev, int nr)
} }
if (vdev->msix && vdev->msix->table_bar == nr) { if (vdev->msix && vdev->msix->table_bar == nr) {
unsigned start; uint64_t start;
start = HOST_PAGE_ALIGN(vdev->msix->table_offset + start = HOST_PAGE_ALIGN(vdev->msix->table_offset +
(vdev->msix->entries * PCI_MSIX_ENTRY_SIZE)); (vdev->msix->entries * PCI_MSIX_ENTRY_SIZE));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册