From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45896) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XPw9X-0003sH-Oc for qemu-devel@nongnu.org; Fri, 05 Sep 2014 12:14:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XPw9R-0005rD-II for qemu-devel@nongnu.org; Fri, 05 Sep 2014 12:14:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34522) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XPw9R-0005qw-4b for qemu-devel@nongnu.org; Fri, 05 Sep 2014 12:14:17 -0400 From: Stefan Hajnoczi Date: Fri, 5 Sep 2014 17:13:34 +0100 Message-Id: <1409933634-11331-7-git-send-email-stefanha@redhat.com> In-Reply-To: <1409933634-11331-1-git-send-email-stefanha@redhat.com> References: <1409933634-11331-1-git-send-email-stefanha@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 06/26] tests: Functions bus_foreach and device_find from libqos virtio API List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Marc=20Mar=C3=AD?= , Peter Maydell , Stefan Hajnoczi From: Marc Mar=C3=AD Virtio header has been changed to compile and work with a real device. Functions bus_foreach and device_find have been implemented for PCI. Virtio-blk test case now opens a fake device. Reviewed-by: Stefan Hajnoczi Signed-off-by: Marc Mar=C3=AD Signed-off-by: Stefan Hajnoczi --- tests/Makefile | 3 +- tests/libqos/virtio-pci.c | 75 +++++++++++++++++++++++++++++++++++++++++= ++++++ tests/libqos/virtio-pci.h | 24 +++++++++++++++ tests/libqos/virtio.h | 23 +++++++++++++++ tests/virtio-blk-test.c | 61 +++++++++++++++++++++++++++++++++----- 5 files changed, 177 insertions(+), 9 deletions(-) create mode 100644 tests/libqos/virtio-pci.c create mode 100644 tests/libqos/virtio-pci.h create mode 100644 tests/libqos/virtio.h diff --git a/tests/Makefile b/tests/Makefile index 469c0a5..0572633 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -299,6 +299,7 @@ libqos-obj-y +=3D tests/libqos/i2c.o libqos-pc-obj-y =3D $(libqos-obj-y) tests/libqos/pci-pc.o libqos-pc-obj-y +=3D tests/libqos/malloc-pc.o libqos-omap-obj-y =3D $(libqos-obj-y) tests/libqos/i2c-omap.o +libqos-virtio-obj-y =3D $(libqos-obj-y) $(libqos-pc-obj-y) tests/libqos/= virtio-pci.o =20 tests/rtc-test$(EXESUF): tests/rtc-test.o tests/m48t59-test$(EXESUF): tests/m48t59-test.o @@ -320,7 +321,7 @@ tests/vmxnet3-test$(EXESUF): tests/vmxnet3-test.o tests/ne2000-test$(EXESUF): tests/ne2000-test.o tests/wdt_ib700-test$(EXESUF): tests/wdt_ib700-test.o tests/virtio-balloon-test$(EXESUF): tests/virtio-balloon-test.o -tests/virtio-blk-test$(EXESUF): tests/virtio-blk-test.o +tests/virtio-blk-test$(EXESUF): tests/virtio-blk-test.o $(libqos-virtio-= obj-y) tests/virtio-net-test$(EXESUF): tests/virtio-net-test.o tests/virtio-rng-test$(EXESUF): tests/virtio-rng-test.o tests/virtio-scsi-test$(EXESUF): tests/virtio-scsi-test.o diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c new file mode 100644 index 0000000..fde1b1f --- /dev/null +++ b/tests/libqos/virtio-pci.c @@ -0,0 +1,75 @@ +/* + * libqos virtio PCI driver + * + * Copyright (c) 2014 Marc Mar=C3=AD + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#include +#include "libqtest.h" +#include "libqos/virtio.h" +#include "libqos/virtio-pci.h" +#include "libqos/pci.h" +#include "libqos/pci-pc.h" + +#include "hw/pci/pci_regs.h" + +typedef struct QVirtioPCIForeachData { + void (*func)(QVirtioDevice *d, void *data); + uint16_t device_type; + void *user_data; +} QVirtioPCIForeachData; + +static QVirtioPCIDevice *qpcidevice_to_qvirtiodevice(QPCIDevice *pdev) +{ + QVirtioPCIDevice *vpcidev; + vpcidev =3D g_malloc0(sizeof(*vpcidev)); + + if (pdev) { + vpcidev->pdev =3D pdev; + vpcidev->vdev.device_type =3D + qpci_config_readw(vpcidev->pdev, PCI_SUBSYST= EM_ID); + } + + return vpcidev; +} + +static void qvirtio_pci_foreach_callback( + QPCIDevice *dev, int devfn, void *data) +{ + QVirtioPCIForeachData *d =3D data; + QVirtioPCIDevice *vpcidev =3D qpcidevice_to_qvirtiodevice(dev); + + if (vpcidev->vdev.device_type =3D=3D d->device_type) { + d->func(&vpcidev->vdev, d->user_data); + } else { + g_free(vpcidev); + } +} + +static void qvirtio_pci_assign_device(QVirtioDevice *d, void *data) +{ + QVirtioPCIDevice **vpcidev =3D data; + *vpcidev =3D (QVirtioPCIDevice *)d; +} + +void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type, + void (*func)(QVirtioDevice *d, void *data), void *data) +{ + QVirtioPCIForeachData d =3D { .func =3D func, + .device_type =3D device_type, + .user_data =3D data }; + + qpci_device_foreach(bus, QVIRTIO_VENDOR_ID, -1, + qvirtio_pci_foreach_callback, &d); +} + +QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_= type) +{ + QVirtioPCIDevice *dev =3D NULL; + qvirtio_pci_foreach(bus, device_type, qvirtio_pci_assign_device, &de= v); + + return dev; +} diff --git a/tests/libqos/virtio-pci.h b/tests/libqos/virtio-pci.h new file mode 100644 index 0000000..5101abb --- /dev/null +++ b/tests/libqos/virtio-pci.h @@ -0,0 +1,24 @@ +/* + * libqos virtio PCI definitions + * + * Copyright (c) 2014 Marc Mar=C3=AD + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#ifndef LIBQOS_VIRTIO_PCI_H +#define LIBQOS_VIRTIO_PCI_H + +#include "libqos/virtio.h" +#include "libqos/pci.h" + +typedef struct QVirtioPCIDevice { + QVirtioDevice vdev; + QPCIDevice *pdev; +} QVirtioPCIDevice; + +void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type, + void (*func)(QVirtioDevice *d, void *data), void *data); +QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_= type); +#endif diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h new file mode 100644 index 0000000..2a05798 --- /dev/null +++ b/tests/libqos/virtio.h @@ -0,0 +1,23 @@ +/* + * libqos virtio definitions + * + * Copyright (c) 2014 Marc Mar=C3=AD + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#ifndef LIBQOS_VIRTIO_H +#define LIBQOS_VIRTIO_H + +#define QVIRTIO_VENDOR_ID 0x1AF4 + +#define QVIRTIO_NET_DEVICE_ID 0x1 +#define QVIRTIO_BLK_DEVICE_ID 0x2 + +typedef struct QVirtioDevice { + /* Device type */ + uint16_t device_type; +} QVirtioDevice; + +#endif diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index d53f875..4d87a3e 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -2,6 +2,7 @@ * QTest testcase for VirtIO Block Device * * Copyright (c) 2014 SUSE LINUX Products GmbH + * Copyright (c) 2014 Marc Mar=C3=AD * * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. * See the COPYING file in the top-level directory. @@ -9,12 +10,59 @@ =20 #include #include +#include +#include +#include #include "libqtest.h" -#include "qemu/osdep.h" +#include "libqos/virtio.h" +#include "libqos/virtio-pci.h" +#include "libqos/pci-pc.h" =20 -/* Tests only initialization so far. TODO: Replace with functional tests= */ -static void pci_nop(void) +#define TEST_IMAGE_SIZE (64 * 1024 * 1024) +#define PCI_SLOT 0x04 +#define PCI_FN 0x00 + +static QPCIBus *test_start(void) { + char cmdline[100]; + char tmp_path[] =3D "/tmp/qtest.XXXXXX"; + int fd, ret; + + /* Create a temporary raw image */ + fd =3D mkstemp(tmp_path); + g_assert_cmpint(fd, >=3D, 0); + ret =3D ftruncate(fd, TEST_IMAGE_SIZE); + g_assert_cmpint(ret, =3D=3D, 0); + close(fd); + + snprintf(cmdline, 100, "-drive if=3Dnone,id=3Ddrive0,file=3D%s " + "-device virtio-blk-pci,drive=3Ddrive0,addr=3D= %x.%x", + tmp_path, PCI_SLOT, PCI_FN); + qtest_start(cmdline); + unlink(tmp_path); + + return qpci_init_pc(); +} + +static void test_end(void) +{ + qtest_end(); +} + +static void pci_basic(void) +{ + QVirtioPCIDevice *dev; + QPCIBus *bus; + + bus =3D test_start(); + + dev =3D qvirtio_pci_device_find(bus, QVIRTIO_BLK_DEVICE_ID); + g_assert(dev !=3D NULL); + g_assert_cmphex(dev->vdev.device_type, =3D=3D, QVIRTIO_BLK_DEVICE_ID= ); + g_assert_cmphex(dev->pdev->devfn, =3D=3D, ((PCI_SLOT << 3) | PCI_FN)= ); + + g_free(dev); + test_end(); } =20 int main(int argc, char **argv) @@ -22,13 +70,10 @@ int main(int argc, char **argv) int ret; =20 g_test_init(&argc, &argv, NULL); - qtest_add_func("/virtio/blk/pci/nop", pci_nop); =20 - qtest_start("-drive id=3Ddrv0,if=3Dnone,file=3D/dev/null " - "-device virtio-blk-pci,drive=3Ddrv0"); - ret =3D g_test_run(); + g_test_add_func("/virtio/blk/pci/basic", pci_basic); =20 - qtest_end(); + ret =3D g_test_run(); =20 return ret; } --=20 1.9.3