Having a period in the subject is unusual.
On 2025/05/21 20:34, Paolo Abeni wrote:
Allow the common read/write operation to access all the
available features space.
Signed-off-by: Paolo Abeni <pab...@redhat.com>
---
hw/virtio/virtio-pci.c | 19 +++++++++++++------
include/hw/virtio/virtio-pci.h | 2 +-
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 0fa8fe4955..7815ef2d9b 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -123,7 +123,8 @@ static const VMStateDescription
vmstate_virtio_pci_modern_state_sub = {
.fields = (const VMStateField[]) {
VMSTATE_UINT32(dfselect, VirtIOPCIProxy),
VMSTATE_UINT32(gfselect, VirtIOPCIProxy),
- VMSTATE_UINT32_ARRAY(guest_features, VirtIOPCIProxy, 2),
+ VMSTATE_UINT32_ARRAY(guest_features, VirtIOPCIProxy,
+ VIRTIO_FEATURES_WORDS),
Modifying existing fields breaks migration across versions. Please refer
to docs/devel/migration/main.rst for details.
VMSTATE_STRUCT_ARRAY(vqs, VirtIOPCIProxy, VIRTIO_QUEUE_MAX, 0,
vmstate_virtio_pci_modern_queue_state,
VirtIOPCIQueue),
@@ -1490,10 +1491,10 @@ static uint64_t virtio_pci_common_read(void *opaque,
hwaddr addr,
val = proxy->dfselect;
break;
case VIRTIO_PCI_COMMON_DF:
- if (proxy->dfselect <= 1) {
+ if (proxy->dfselect < VIRTIO_FEATURES_WORDS) {
VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
- val = (vdev->host_features & ~vdc->legacy_features) >>
+ val = (vdev->host_features_ex & ~vdc->legacy_features) >>
(32 * proxy->dfselect);
}
break;
@@ -1585,10 +1586,16 @@ static void virtio_pci_common_write(void *opaque,
hwaddr addr,
break;
case VIRTIO_PCI_COMMON_GF:
if (proxy->gfselect < ARRAY_SIZE(proxy->guest_features)) {
+ virtio_features_t features = 0;
+ int i;
+
proxy->guest_features[proxy->gfselect] = val;
- virtio_set_features(vdev,
- (((uint64_t)proxy->guest_features[1]) << 32) |
- proxy->guest_features[0]);
+ for (i = 0; i < VIRTIO_FEATURES_WORDS; ++i) {
+ virtio_features_t cur = proxy->guest_features[i];
+
+ features |= cur << (i * 32);
+ }
+ virtio_set_features(vdev, features);
}
break;
case VIRTIO_PCI_COMMON_MSIX:
diff --git a/include/hw/virtio/virtio-pci.h b/include/hw/virtio/virtio-pci.h
index 31ec144509..c20b289e64 100644
--- a/include/hw/virtio/virtio-pci.h
+++ b/include/hw/virtio/virtio-pci.h
@@ -165,7 +165,7 @@ struct VirtIOPCIProxy {
uint32_t nvectors;
uint32_t dfselect;
uint32_t gfselect;
- uint32_t guest_features[2];
+ uint32_t guest_features[VIRTIO_FEATURES_WORDS];
VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
VirtIOIRQFD *vector_irqfd;