for vfio regions that are without write permission, drop guest writes to those regions.
Cc: Philippe Mathieu-Daudé <phi...@redhat.com> Signed-off-by: Yan Zhao <yan.y.z...@intel.com> Signed-off-by: Xin Zeng <xin.z...@intel.com> --- hw/vfio/common.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 0b3593b3c0..b6956a8098 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -38,6 +38,7 @@ #include "sysemu/reset.h" #include "trace.h" #include "qapi/error.h" +#include "qemu/log.h" VFIOGroupList vfio_group_list = QLIST_HEAD_INITIALIZER(vfio_group_list); @@ -190,6 +191,15 @@ void vfio_region_write(void *opaque, hwaddr addr, uint64_t qword; } buf; + trace_vfio_region_write(vbasedev->name, region->nr, addr, data, size); + if (!(region->flags & VFIO_REGION_INFO_FLAG_WRITE)) { + qemu_log_mask(LOG_GUEST_ERROR, + "Invalid write to read only vfio region 0x%" + HWADDR_PRIx" size %u\n", addr, size); + + return; + } + switch (size) { case 1: buf.byte = data; @@ -215,8 +225,6 @@ void vfio_region_write(void *opaque, hwaddr addr, addr, data, size); } - trace_vfio_region_write(vbasedev->name, region->nr, addr, data, size); - /* * A read or write to a BAR always signals an INTx EOI. This will * do nothing if not pending (including not in INTx mode). We assume -- 2.17.1