[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 07/16] libqos: enforce Device Initialization order
From: |
Stefan Hajnoczi |
Subject: |
[PATCH v4 07/16] libqos: enforce Device Initialization order |
Date: |
Wed, 23 Oct 2019 11:04:16 +0100 |
According to VIRTIO 1.1 "3.1.1 Driver Requirements: Device
Initialization", configuration space and virtqueues cannot be accessed
before features have been negotiated. Enforce this requirement.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
v4:
* Introduce bool d->features_negotiated so that tests can negotiate a
0 feature bit set in Legacy mode [Thomas]
---
tests/libqos/virtio.h | 1 +
tests/libqos/virtio.c | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h
index a5c99fb3c9..0e8f823c7b 100644
--- a/tests/libqos/virtio.h
+++ b/tests/libqos/virtio.h
@@ -23,6 +23,7 @@ typedef struct QVirtioDevice {
uint16_t device_type;
uint64_t features;
bool big_endian;
+ bool features_negotiated;
} QVirtioDevice;
typedef struct QVirtQueue {
diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c
index 4f7e6bb8a1..6049ff3b3e 100644
--- a/tests/libqos/virtio.c
+++ b/tests/libqos/virtio.c
@@ -15,21 +15,25 @@
uint8_t qvirtio_config_readb(QVirtioDevice *d, uint64_t addr)
{
+ g_assert_true(d->features_negotiated);
return d->bus->config_readb(d, addr);
}
uint16_t qvirtio_config_readw(QVirtioDevice *d, uint64_t addr)
{
+ g_assert_true(d->features_negotiated);
return d->bus->config_readw(d, addr);
}
uint32_t qvirtio_config_readl(QVirtioDevice *d, uint64_t addr)
{
+ g_assert_true(d->features_negotiated);
return d->bus->config_readl(d, addr);
}
uint64_t qvirtio_config_readq(QVirtioDevice *d, uint64_t addr)
{
+ g_assert_true(d->features_negotiated);
return d->bus->config_readq(d, addr);
}
@@ -42,11 +46,13 @@ void qvirtio_set_features(QVirtioDevice *d, uint64_t
features)
{
d->features = features;
d->bus->set_features(d, features);
+ d->features_negotiated = true;
}
QVirtQueue *qvirtqueue_setup(QVirtioDevice *d,
QGuestAllocator *alloc, uint16_t index)
{
+ g_assert_true(d->features_negotiated);
return d->bus->virtqueue_setup(d, alloc, index);
}
@@ -60,6 +66,7 @@ void qvirtio_reset(QVirtioDevice *d)
{
d->bus->set_status(d, 0);
g_assert_cmphex(d->bus->get_status(d), ==, 0);
+ d->features_negotiated = false;
}
void qvirtio_set_acknowledge(QVirtioDevice *d)
--
2.21.0
- [PATCH v4 00/16] libqos: add VIRTIO PCI 1.0 support, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 01/16] tests/virtio-blk-test: read config space after feature negotiation, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 02/16] libqos: read QVIRTIO_MMIO_VERSION register, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 04/16] virtio-scsi-test: add missing feature negotiation, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 05/16] tests/virtio-blk-test: set up virtqueue after feature negotiation, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 03/16] libqos: extend feature bits to 64-bit, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 06/16] libqos: add missing virtio-9p feature negotiation, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 07/16] libqos: enforce Device Initialization order,
Stefan Hajnoczi <=
- [PATCH v4 08/16] libqos: implement VIRTIO 1.0 FEATURES_OK step, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 10/16] libqos: add iteration support to qpci_find_capability(), Stefan Hajnoczi, 2019/10/23
- [PATCH v4 09/16] libqos: access VIRTIO 1.0 vring in little-endian, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 11/16] libqos: pass full QVirtQueue to set_queue_address(), Stefan Hajnoczi, 2019/10/23
- [PATCH v4 12/16] libqos: add MSI-X callbacks to QVirtioPCIDevice, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 13/16] libqos: expose common virtqueue setup/cleanup functions, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 14/16] libqos: make the virtio-pci BAR index configurable, Stefan Hajnoczi, 2019/10/23
- [PATCH v4 15/16] libqos: extract Legacy virtio-pci.c code, Stefan Hajnoczi, 2019/10/23