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 <pabeni@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;