libqos: enforce Device Initialization order
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 <stefanha@redhat.com> Message-Id: <20191023100425.12168-8-stefanha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
c5bd6d02e6
commit
56140fbb8f
@ -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)
|
||||
|
@ -23,6 +23,7 @@ typedef struct QVirtioDevice {
|
||||
uint16_t device_type;
|
||||
uint64_t features;
|
||||
bool big_endian;
|
||||
bool features_negotiated;
|
||||
} QVirtioDevice;
|
||||
|
||||
typedef struct QVirtQueue {
|
||||
|
Loading…
x
Reference in New Issue
Block a user