[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 08/14] vfio-user: handle PCI config space accesses
From: |
Stefan Hajnoczi |
Subject: |
Re: [PATCH v4 08/14] vfio-user: handle PCI config space accesses |
Date: |
Thu, 16 Dec 2021 11:30:20 +0000 |
On Wed, Dec 15, 2021 at 10:35:32AM -0500, Jagannathan Raman wrote:
> Define and register handlers for PCI config space accesses
>
> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
> ---
> hw/remote/vfio-user-obj.c | 45 +++++++++++++++++++++++++++++++++++++++
> hw/remote/trace-events | 2 ++
> 2 files changed, 47 insertions(+)
>
> diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
> index a01a0ad185..c6d0c675b7 100644
> --- a/hw/remote/vfio-user-obj.c
> +++ b/hw/remote/vfio-user-obj.c
> @@ -43,6 +43,7 @@
> #include "qapi/qapi-visit-sockets.h"
> #include "qemu/notify.h"
> #include "qemu/thread.h"
> +#include "qemu/main-loop.h"
> #include "sysemu/sysemu.h"
> #include "libvfio-user.h"
> #include "hw/qdev-core.h"
> @@ -174,6 +175,39 @@ retry_attach:
> qemu_set_fd_handler(o->vfu_poll_fd, vfu_object_ctx_run, NULL, o);
> }
>
> +static ssize_t vfu_object_cfg_access(vfu_ctx_t *vfu_ctx, char * const buf,
> + size_t count, loff_t offset,
> + const bool is_write)
> +{
> + VfuObject *o = vfu_get_private(vfu_ctx);
> + uint32_t pci_access_width = sizeof(uint32_t);
> + size_t bytes = count;
> + uint32_t val = 0;
> + char *ptr = buf;
> + int len;
> +
> + while (bytes > 0) {
> + len = (bytes > pci_access_width) ? pci_access_width : bytes;
> + if (is_write) {
> + memcpy(&val, ptr, len);
> + pci_host_config_write_common(o->pci_dev, offset,
> + pci_config_size(o->pci_dev),
> + val, len);
> + trace_vfu_cfg_write(offset, val);
> + } else {
> + val = pci_host_config_read_common(o->pci_dev, offset,
> + pci_config_size(o->pci_dev),
> len);
> + memcpy(ptr, &val, len);
> + trace_vfu_cfg_read(offset, val);
> + }
> + offset += len;
> + ptr += len;
> + bytes -= len;
> + }
> +
> + return count;
> +}
> +
> /*
> * TYPE_VFU_OBJECT depends on the availability of the 'socket' and 'device'
> * properties. It also depends on devices instantiated in QEMU. These
> @@ -244,6 +278,17 @@ static void vfu_object_init_ctx(VfuObject *o, Error
> **errp)
> goto fail;
> }
>
> + ret = vfu_setup_region(o->vfu_ctx, VFU_PCI_DEV_CFG_REGION_IDX,
> + pci_config_size(o->pci_dev),
> &vfu_object_cfg_access,
> + VFU_REGION_FLAG_RW | VFU_REGION_FLAG_ALWAYS_CB,
> + NULL, 0, -1, 0);
Thanos or John: QEMU's pci_host_config_read/write_common() works with
host-endian values. I don't know which endianness libvfio-user's region
callbacks expect. Does this patch look endian-safe to you (e.g. will it
work on a big-endian host)?
Thanks,
Stefan
signature.asc
Description: PGP signature
- Re: [PATCH v4 05/14] vfio-user: instantiate vfio-user context, (continued)
[PATCH v4 08/14] vfio-user: handle PCI config space accesses, Jagannathan Raman, 2021/12/15
- Re: [PATCH v4 08/14] vfio-user: handle PCI config space accesses,
Stefan Hajnoczi <=
[PATCH v4 09/14] vfio-user: handle DMA mappings, Jagannathan Raman, 2021/12/15
[PATCH v4 10/14] vfio-user: handle PCI BAR accesses, Jagannathan Raman, 2021/12/15
[PATCH v4 11/14] vfio-user: IOMMU support for remote device, Jagannathan Raman, 2021/12/15