[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] virtio: Fix virtio_mmio_read()/virtio_mmio_write()
From: |
Laurent Vivier |
Subject: |
Re: [PATCH] virtio: Fix virtio_mmio_read()/virtio_mmio_write() |
Date: |
Wed, 17 Mar 2021 15:18:32 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 |
Hi,
could this fix be merged in QEMU 6.0?
Thanks,
Laurent
Le 14/03/2021 à 21:03, Laurent Vivier a écrit :
> Both functions don't check the personality of the interface (legacy or
> modern) before accessing the configuration memory and always use
> virtio_config_readX()/virtio_config_writeX().
>
> With this patch, they now check the personality and in legacy mode
> call virtio_config_readX()/virtio_config_writeX(), otherwise call
> virtio_config_modern_readX()/virtio_config_modern_writeX().
>
> This change has been tested with virtio-mmio guests (virt stretch/armhf and
> virt sid/m68k) and virtio-pci guests (pseries RHEL-7.3/ppc64 and /ppc64le).
>
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
> hw/virtio/virtio-mmio.c | 74 +++++++++++++++++++++++++++++------------
> 1 file changed, 52 insertions(+), 22 deletions(-)
>
> diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
> index 6990b9879cf0..342c918ea7b7 100644
> --- a/hw/virtio/virtio-mmio.c
> +++ b/hw/virtio/virtio-mmio.c
> @@ -112,15 +112,28 @@ static uint64_t virtio_mmio_read(void *opaque, hwaddr
> offset, unsigned size)
>
> if (offset >= VIRTIO_MMIO_CONFIG) {
> offset -= VIRTIO_MMIO_CONFIG;
> - switch (size) {
> - case 1:
> - return virtio_config_readb(vdev, offset);
> - case 2:
> - return virtio_config_readw(vdev, offset);
> - case 4:
> - return virtio_config_readl(vdev, offset);
> - default:
> - abort();
> + if (proxy->legacy) {
> + switch (size) {
> + case 1:
> + return virtio_config_readb(vdev, offset);
> + case 2:
> + return virtio_config_readw(vdev, offset);
> + case 4:
> + return virtio_config_readl(vdev, offset);
> + default:
> + abort();
> + }
> + } else {
> + switch (size) {
> + case 1:
> + return virtio_config_modern_readb(vdev, offset);
> + case 2:
> + return virtio_config_modern_readw(vdev, offset);
> + case 4:
> + return virtio_config_modern_readl(vdev, offset);
> + default:
> + abort();
> + }
> }
> }
> if (size != 4) {
> @@ -245,20 +258,37 @@ static void virtio_mmio_write(void *opaque, hwaddr
> offset, uint64_t value,
>
> if (offset >= VIRTIO_MMIO_CONFIG) {
> offset -= VIRTIO_MMIO_CONFIG;
> - switch (size) {
> - case 1:
> - virtio_config_writeb(vdev, offset, value);
> - break;
> - case 2:
> - virtio_config_writew(vdev, offset, value);
> - break;
> - case 4:
> - virtio_config_writel(vdev, offset, value);
> - break;
> - default:
> - abort();
> + if (proxy->legacy) {
> + switch (size) {
> + case 1:
> + virtio_config_writeb(vdev, offset, value);
> + break;
> + case 2:
> + virtio_config_writew(vdev, offset, value);
> + break;
> + case 4:
> + virtio_config_writel(vdev, offset, value);
> + break;
> + default:
> + abort();
> + }
> + return;
> + } else {
> + switch (size) {
> + case 1:
> + virtio_config_modern_writeb(vdev, offset, value);
> + break;
> + case 2:
> + virtio_config_modern_writew(vdev, offset, value);
> + break;
> + case 4:
> + virtio_config_modern_writel(vdev, offset, value);
> + break;
> + default:
> + abort();
> + }
> + return;
> }
> - return;
> }
> if (size != 4) {
> qemu_log_mask(LOG_GUEST_ERROR,
>