diff options
Diffstat (limited to 'tests/libqos')
-rw-r--r-- | tests/libqos/virtio.c | 22 | ||||
-rw-r--r-- | tests/libqos/virtio.h | 5 |
2 files changed, 27 insertions, 0 deletions
diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c index 9b6de2c0a7..009325dd02 100644 --- a/tests/libqos/virtio.c +++ b/tests/libqos/virtio.c @@ -91,6 +91,28 @@ bool qvirtio_wait_queue_isr(const QVirtioBus *bus, QVirtioDevice *d, return timeout != 0; } +/* Wait for the status byte at given guest memory address to be set + * + * The virtqueue interrupt must not be raised, making this useful for testing + * event_index functionality. + */ +uint8_t qvirtio_wait_status_byte_no_isr(const QVirtioBus *bus, + QVirtioDevice *d, + QVirtQueue *vq, + uint64_t addr, + gint64 timeout_us) +{ + gint64 start_time = g_get_monotonic_time(); + uint8_t val; + + while ((val = readb(addr)) == 0xff) { + clock_step(100); + g_assert(!bus->get_queue_isr_status(d, vq)); + g_assert(g_get_monotonic_time() - start_time <= timeout_us); + } + return val; +} + bool qvirtio_wait_config_isr(const QVirtioBus *bus, QVirtioDevice *d, uint64_t timeout) { diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index 70b3376360..bc7518e880 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -162,6 +162,11 @@ void qvirtio_set_driver_ok(const QVirtioBus *bus, QVirtioDevice *d); bool qvirtio_wait_queue_isr(const QVirtioBus *bus, QVirtioDevice *d, QVirtQueue *vq, uint64_t timeout); +uint8_t qvirtio_wait_status_byte_no_isr(const QVirtioBus *bus, + QVirtioDevice *d, + QVirtQueue *vq, + uint64_t addr, + gint64 timeout_us); bool qvirtio_wait_config_isr(const QVirtioBus *bus, QVirtioDevice *d, uint64_t timeout); QVirtQueue *qvirtqueue_setup(const QVirtioBus *bus, QVirtioDevice *d, |