All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [PATCH] virtio: Fix virtio_mmio_read()/virtio_mmio_write()
Date: Wed, 17 Mar 2021 15:18:32 +0100	[thread overview]
Message-ID: <42d9ab9f-d645-99f2-63b5-459d7a97d029@vivier.eu> (raw)
In-Reply-To: <20210314200300.3259170-1-laurent@vivier.eu>

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,
> 



  reply	other threads:[~2021-03-17 14:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-14 20:03 [PATCH] virtio: Fix virtio_mmio_read()/virtio_mmio_write() Laurent Vivier
2021-03-17 14:18 ` Laurent Vivier [this message]
2021-03-19  9:24 ` Stefano Garzarella

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42d9ab9f-d645-99f2-63b5-459d7a97d029@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.