[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 02/20] virtio: pci-legacy: Validate queue pfn
From: |
Suzuki K Poulose |
Subject: |
[Qemu-devel] [PATCH v3 02/20] virtio: pci-legacy: Validate queue pfn |
Date: |
Fri, 29 Jun 2018 12:15:22 +0100 |
Legacy PCI over virtio uses a 32bit PFN for the queue. If the
queue pfn is too large to fit in 32bits, which we could hit on
arm64 systems with 52bit physical addresses (even with 64K page
size), we simply miss out a proper link to the other side of
the queue.
Add a check to validate the PFN, rather than silently breaking
the devices.
Cc: "Michael S. Tsirkin" <address@hidden>
Cc: Jason Wang <address@hidden>
Cc: Marc Zyngier <address@hidden>
Cc: Christoffer Dall <address@hidden>
Cc: Peter Maydel <address@hidden>
Cc: Jean-Philippe Brucker <address@hidden>
Signed-off-by: Suzuki K Poulose <address@hidden>
---
Changes since v2:
- Change errno to -E2BIG
---
drivers/virtio/virtio_pci_legacy.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/virtio/virtio_pci_legacy.c
b/drivers/virtio/virtio_pci_legacy.c
index 2780886..c0d6987a 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -122,6 +122,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device
*vp_dev,
struct virtqueue *vq;
u16 num;
int err;
+ u64 q_pfn;
/* Select the queue we're interested in */
iowrite16(index, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_SEL);
@@ -141,9 +142,15 @@ static struct virtqueue *setup_vq(struct virtio_pci_device
*vp_dev,
if (!vq)
return ERR_PTR(-ENOMEM);
+ q_pfn = virtqueue_get_desc_addr(vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT;
+ if (q_pfn >> 32) {
+ dev_err(&vp_dev->pci_dev->dev, "virtio-pci queue PFN too
large\n");
+ err = -E2BIG;
+ goto out_del_vq;
+ }
+
/* activate the queue */
- iowrite32(virtqueue_get_desc_addr(vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT,
- vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
+ iowrite32(q_pfn, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
vq->priv = (void __force *)vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY;
@@ -160,6 +167,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device
*vp_dev,
out_deactivate:
iowrite32(0, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
+out_del_vq:
vring_del_virtqueue(vq);
return ERR_PTR(err);
}
--
2.7.4
- [Qemu-devel] [PATCH v3 00/20] arm64: Dynamic & 52bit IPA support, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 01/20] virtio: mmio-v1: Validate queue PFN, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 02/20] virtio: pci-legacy: Validate queue pfn,
Suzuki K Poulose <=
- [Qemu-devel] [PATCH v3 03/20] arm64: Add a helper for PARange to physical shift conversion, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 04/20] kvm: arm64: Clean up VTCR_EL2 initialisation, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 05/20] kvm: arm/arm64: Fix stage2_flush_memslot for 4 level page table, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 06/20] kvm: arm/arm64: Remove spurious WARN_ON, Suzuki K Poulose, 2018/06/29
- [Qemu-devel] [PATCH v3 07/20] kvm: arm/arm64: Prepare for VM specific stage2 translations, Suzuki K Poulose, 2018/06/29