From patchwork Fri Aug 1 09:34:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marc_Mar=C3=AD?= X-Patchwork-Id: 375668 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 785F6140110 for ; Fri, 1 Aug 2014 19:36:22 +1000 (EST) Received: from localhost ([::1]:38087 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XD9G8-00036I-K2 for incoming@patchwork.ozlabs.org; Fri, 01 Aug 2014 05:36:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58710) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XD9FB-00020h-My for qemu-devel@nongnu.org; Fri, 01 Aug 2014 05:35:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XD9F2-0003Mm-Jk for qemu-devel@nongnu.org; Fri, 01 Aug 2014 05:35:21 -0400 Received: from mail-we0-x22c.google.com ([2a00:1450:400c:c03::22c]:51755) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XD9F2-0003MP-9J for qemu-devel@nongnu.org; Fri, 01 Aug 2014 05:35:12 -0400 Received: by mail-we0-f172.google.com with SMTP id x48so4015209wes.17 for ; Fri, 01 Aug 2014 02:35:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=mp/D+wE25npTeK8qg7b8dTByFYmGGcE2yzA9JPhD2UQ=; b=Bbh34TqCZR8vVwiNaqnC3dkm/n7huCQHM3mfHTPYMB/oR/d7R/33QHgD7BFUf1RuBn ag38rsmG8FgQvej789fKhhhgf0FVmQFhAXdPb/BUHfcKXa45+UO/+eNqPHH8l0YUwxk/ XnJYmUQcOQCptFPv9UwDcsOe9+n4oSNH6IkhRoh8xI9/cMlH8NAOCMLhIKolFUBN2sMS Itz3q+2n43yp8CvUpDjsJ4TQixb+ASl51xGHqCK2nc3kgd1vGoHhBDXqbtERImoPTvZG moK9KmqxNVqsr4Nfj3lFgghQGIJeQz8QMvahkcqUB+bA8pVrFX6DJNc5hy6/cy3wtTRr LbuA== X-Received: by 10.194.84.101 with SMTP id x5mr6064257wjy.52.1406885711430; Fri, 01 Aug 2014 02:35:11 -0700 (PDT) Received: from localhost.localdomain (226.Red-79-153-167.dynamicIP.rima-tde.net. [79.153.167.226]) by mx.google.com with ESMTPSA id fu7sm6931477wib.2.2014.08.01.02.35.09 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Aug 2014 02:35:10 -0700 (PDT) From: =?UTF-8?q?Marc=20Mar=C3=AD?= To: qemu-devel@nongnu.org Date: Fri, 1 Aug 2014 11:34:51 +0200 Message-Id: <1406885699-4765-2-git-send-email-marc.mari.barcelo@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1406885699-4765-1-git-send-email-marc.mari.barcelo@gmail.com> References: <1406885699-4765-1-git-send-email-marc.mari.barcelo@gmail.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c03::22c Cc: =?UTF-8?q?Marc=20Mar=C3=AD?= , Paolo Bonzini , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v3 1/9] tests: Functions bus_foreach and device_find from libqos virtio API X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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. Signed-off-by: Marc Marí --- 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 4b2e1bb..7c0f670 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -294,6 +294,7 @@ libqos-obj-y += tests/libqos/i2c.o libqos-pc-obj-y = $(libqos-obj-y) tests/libqos/pci-pc.o libqos-pc-obj-y += tests/libqos/malloc-pc.o libqos-omap-obj-y = $(libqos-obj-y) tests/libqos/i2c-omap.o +libqos-virtio-obj-y = $(libqos-obj-y) $(libqos-pc-obj-y) tests/libqos/virtio-pci.o tests/rtc-test$(EXESUF): tests/rtc-test.o tests/m48t59-test$(EXESUF): tests/m48t59-test.o @@ -315,7 +316,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í + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * 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 = g_malloc0(sizeof(*vpcidev)); + + if (pdev) { + vpcidev->pdev = pdev; + vpcidev->vdev.device_type = + qpci_config_readw(vpcidev->pdev, PCI_SUBSYSTEM_ID); + } + + return vpcidev; +} + +static void qvirtio_pci_foreach_callback( + QPCIDevice *dev, int devfn, void *data) +{ + QVirtioPCIForeachData *d = data; + QVirtioPCIDevice *vpcidev = qpcidevice_to_qvirtiodevice(dev); + + if (vpcidev->vdev.device_type == 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 = data; + *vpcidev = (QVirtioPCIDevice *)d; +} + +void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type, + void (*func)(QVirtioDevice *d, void *data), void *data) +{ + QVirtioPCIForeachData d = { .func = func, + .device_type = device_type, + .user_data = 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 = NULL; + qvirtio_pci_foreach(bus, device_type, qvirtio_pci_assign_device, &dev); + + 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í + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * 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í + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * 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í * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. @@ -9,12 +10,59 @@ #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" -/* 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[] = "/tmp/qtest.XXXXXX"; + int fd, ret; + + /* Create a temporary raw image */ + fd = mkstemp(tmp_path); + g_assert_cmpint(fd, >=, 0); + ret = ftruncate(fd, TEST_IMAGE_SIZE); + g_assert_cmpint(ret, ==, 0); + close(fd); + + snprintf(cmdline, 100, "-drive if=none,id=drive0,file=%s " + "-device virtio-blk-pci,drive=drive0,addr=%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 = test_start(); + + dev = qvirtio_pci_device_find(bus, QVIRTIO_BLK_DEVICE_ID); + g_assert(dev != NULL); + g_assert_cmphex(dev->vdev.device_type, ==, QVIRTIO_BLK_DEVICE_ID); + g_assert_cmphex(dev->pdev->devfn, ==, ((PCI_SLOT << 3) | PCI_FN)); + + g_free(dev); + test_end(); } int main(int argc, char **argv) @@ -22,13 +70,10 @@ int main(int argc, char **argv) int ret; g_test_init(&argc, &argv, NULL); - qtest_add_func("/virtio/blk/pci/nop", pci_nop); - qtest_start("-drive id=drv0,if=none,file=/dev/null " - "-device virtio-blk-pci,drive=drv0"); - ret = g_test_run(); + g_test_add_func("/virtio/blk/pci/basic", pci_basic); - qtest_end(); + ret = g_test_run(); return ret; }