2 * QTest testcase for VirtIO 9P
4 * Copyright (c) 2014 SUSE LINUX Products GmbH
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
10 #include "qemu/osdep.h"
12 #include "qemu-common.h"
13 #include "libqos/libqos-pc.h"
14 #include "libqos/virtio.h"
15 #include "libqos/virtio-pci.h"
16 #include "standard-headers/linux/virtio_ids.h"
17 #include "standard-headers/linux/virtio_pci.h"
19 static const char mount_tag[] = "qtest";
20 static char *test_share;
23 static QOSState *qvirtio_9p_start(void)
25 const char *cmd = "-fsdev local,id=fsdev0,security_model=none,path=%s "
26 "-device virtio-9p-pci,fsdev=fsdev0,mount_tag=%s";
28 test_share = g_strdup("/tmp/qtest.XXXXXX");
29 g_assert_nonnull(mkdtemp(test_share));
31 return qtest_pc_boot(cmd, test_share, mount_tag);
34 static void qvirtio_9p_stop(QOSState *qs)
41 static void pci_nop(void)
45 qs = qvirtio_9p_start();
55 static QVirtIO9P *qvirtio_9p_pci_init(QOSState *qs)
58 QVirtioPCIDevice *dev;
60 v9p = g_new0(QVirtIO9P, 1);
63 dev = qvirtio_pci_device_find(v9p->qs->pcibus, VIRTIO_ID_9P);
64 g_assert_nonnull(dev);
65 g_assert_cmphex(dev->vdev.device_type, ==, VIRTIO_ID_9P);
66 v9p->dev = (QVirtioDevice *) dev;
68 qvirtio_pci_device_enable(dev);
69 qvirtio_reset(v9p->dev);
70 qvirtio_set_acknowledge(v9p->dev);
71 qvirtio_set_driver(v9p->dev);
73 v9p->vq = qvirtqueue_setup(v9p->dev, v9p->qs->alloc, 0);
77 static void qvirtio_9p_pci_free(QVirtIO9P *v9p)
79 qvirtqueue_cleanup(v9p->dev->bus, v9p->vq, v9p->qs->alloc);
80 qvirtio_pci_device_disable(container_of(v9p->dev, QVirtioPCIDevice, vdev));
85 static void pci_basic_config(void)
94 qs = qvirtio_9p_start();
95 v9p = qvirtio_9p_pci_init(qs);
97 addr = ((QVirtioPCIDevice *) v9p->dev)->addr + VIRTIO_PCI_CONFIG_OFF(false);
98 tag_len = qvirtio_config_readw(v9p->dev,
99 (uint64_t)(uintptr_t)addr);
100 g_assert_cmpint(tag_len, ==, strlen(mount_tag));
101 addr += sizeof(uint16_t);
103 tag = g_malloc(tag_len);
104 for (i = 0; i < tag_len; i++) {
105 tag[i] = qvirtio_config_readb(v9p->dev, (uint64_t)(uintptr_t)addr + i);
107 g_assert_cmpmem(tag, tag_len, mount_tag, tag_len);
110 qvirtio_9p_pci_free(v9p);
114 int main(int argc, char **argv)
116 g_test_init(&argc, &argv, NULL);
117 qtest_add_func("/virtio/9p/pci/nop", pci_nop);
118 qtest_add_func("/virtio/9p/pci/basic/configuration", pci_basic_config);