Message ID | 20171124075542.16979-3-ppandit@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Nov 24, 2017 at 01:25:42PM +0530, P J P wrote: > From: Prasad J Pandit <pjp@fedoraproject.org> > > An uninitialised VirtQueue object or one with Vring.align field > set to zero(0) could lead to arithmetic exceptions. Add a unit > test to validate it. > > Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org> > --- > tests/virtio-blk-test.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c > index e6fb9bac87..d00ceb0501 100644 > --- a/tests/virtio-blk-test.c > +++ b/tests/virtio-blk-test.c > @@ -674,6 +674,26 @@ static void pci_hotplug(void) > qtest_shutdown(qs); > } > > +static void test_vring_align(void) It's important to include a doc comment so the purpose of the test is clear: /* * Check that setting the vring addr on a non-existent virtqueue does * not crash. */ I think the _align name is confusing since the vring alignment is not directly affected by this test case. Please call it test_nonexistent_virtqueue() instead. > +{ > + QPCIBar bar0; > + QOSState *qs; > + QPCIDevice *dev; > + > + qs = pci_test_start(); > + dev = qpci_device_find(qs->pcibus, QPCI_DEVFN(4, 0)); > + g_assert(dev != NULL); > + > + qpci_device_enable(dev); > + bar0 = qpci_iomap(dev, 0, NULL); > + > + qpci_io_writeb(dev, bar0, VIRTIO_PCI_QUEUE_SEL, 2); > + qpci_io_writel(dev, bar0, VIRTIO_PCI_QUEUE_PFN, 1); > + > + g_free(dev); > + qtest_shutdown(qs); > +}
diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index e6fb9bac87..d00ceb0501 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -674,6 +674,26 @@ static void pci_hotplug(void) qtest_shutdown(qs); } +static void test_vring_align(void) +{ + QPCIBar bar0; + QOSState *qs; + QPCIDevice *dev; + + qs = pci_test_start(); + dev = qpci_device_find(qs->pcibus, QPCI_DEVFN(4, 0)); + g_assert(dev != NULL); + + qpci_device_enable(dev); + bar0 = qpci_iomap(dev, 0, NULL); + + qpci_io_writeb(dev, bar0, VIRTIO_PCI_QUEUE_SEL, 2); + qpci_io_writel(dev, bar0, VIRTIO_PCI_QUEUE_PFN, 1); + + g_free(dev); + qtest_shutdown(qs); +} + static void mmio_basic(void) { QVirtioMMIODevice *dev; @@ -724,6 +744,7 @@ int main(int argc, char **argv) qtest_add_func("/virtio/blk/pci/basic", pci_basic); qtest_add_func("/virtio/blk/pci/indirect", pci_indirect); qtest_add_func("/virtio/blk/pci/config", pci_config); + qtest_add_func("/virtio/blk/pci/vring", test_vring_align); if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { qtest_add_func("/virtio/blk/pci/msix", pci_msix); qtest_add_func("/virtio/blk/pci/idx", pci_idx);