Message ID | 20200430052307.29235-1-yan.y.zhao@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drop writes to read-only ram device & vfio regions | expand |
On Thu, Apr 30, 2020 at 03:02:36PM +0800, Philippe Mathieu-Daudé wrote: > On 4/30/20 7:23 AM, Yan Zhao wrote: > > for vfio regions that are without write permission, > > drop guest writes to those regions. > > > > Cc: Philippe Mathieu-Daudé <philmd@redhat.com> > > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.co> > > The full domain name is redhat.com. > oops. really sorry.... > > Signed-off-by: Yan Zhao <yan.y.zhao@intel.com> > > Signed-off-by: Xin Zeng <xin.zeng@intel.com> > > --- > > hw/vfio/common.c | 13 +++++++++++-- > > 1 file changed, 11 insertions(+), 2 deletions(-) > > > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > > index 0b3593b3c0..2a4fedfeaa 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,16 @@ 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 (%s:region%d" > > + "+0x%"HWADDR_PRIx" size %d)\n", vbasedev->name, > > + region->nr, addr, size); > > + > > + return; > > + } > > + > > switch (size) { > > case 1: > > buf.byte = data; > > @@ -215,8 +226,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 > > >
On 4/30/20 7:23 AM, Yan Zhao wrote: > for vfio regions that are without write permission, > drop guest writes to those regions. > > Cc: Philippe Mathieu-Daudé <philmd@redhat.com> > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.co> The full domain name is redhat.com. > Signed-off-by: Yan Zhao <yan.y.zhao@intel.com> > Signed-off-by: Xin Zeng <xin.zeng@intel.com> > --- > hw/vfio/common.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 0b3593b3c0..2a4fedfeaa 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,16 @@ 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 (%s:region%d" > + "+0x%"HWADDR_PRIx" size %d)\n", vbasedev->name, > + region->nr, addr, size); > + > + return; > + } > + > switch (size) { > case 1: > buf.byte = data; > @@ -215,8 +226,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 >
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 0b3593b3c0..2a4fedfeaa 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,16 @@ 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 (%s:region%d" + "+0x%"HWADDR_PRIx" size %d)\n", vbasedev->name, + region->nr, addr, size); + + return; + } + switch (size) { case 1: buf.byte = data; @@ -215,8 +226,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