lkml.org 
[lkml]   [2018]   [Sep]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 053/197] virtio: pci-legacy: Validate queue pfn
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Suzuki K Poulose <suzuki.poulose@arm.com>

    [ Upstream commit 69599206ea9a3f8f2e94d46580579cbf9d08ad6c ]

    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" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Christoffer Dall <cdall@kernel.org>
    Cc: Peter Maydel <peter.maydell@linaro.org>
    Cc: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/virtio/virtio_pci_legacy.c | 14 ++++++++++++--
    1 file changed, 12 insertions(+), 2 deletions(-)

    --- a/drivers/virtio/virtio_pci_legacy.c
    +++ b/drivers/virtio/virtio_pci_legacy.c
    @@ -122,6 +122,7 @@ static struct virtqueue *setup_vq(struct
    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,17 @@ static struct virtqueue *setup_vq(struct
    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,
    + "platform bug: legacy virtio-mmio must not be used with RAM above 0x%llxGB\n",
    + 0x1ULL << (32 + PAGE_SHIFT - 30));
    + 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 +169,7 @@ static struct virtqueue *setup_vq(struct

    out_deactivate:
    iowrite32(0, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
    +out_del_vq:
    vring_del_virtqueue(vq);
    return ERR_PTR(err);
    }

    \
     
     \ /
      Last update: 2018-09-13 16:10    [W:4.341 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site