Message ID | 20211127072910.1261824-3-eric.auger@redhat.com |
---|---|
State | New |
Headers | show |
Series | virtio-iommu: config related fixes and qtest | expand |
On Sat, Nov 27, 2021 at 08:29:08AM +0100, Eric Auger wrote: > Endianess is not properly handled when populating > the returned config. Use the cpu_to_le* primitives > for each separate field. Also, while at it, trace > the domain range start. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Reported-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org> > --- > hw/virtio/trace-events | 2 +- > hw/virtio/virtio-iommu.c | 22 +++++++++++++++------- > 2 files changed, 16 insertions(+), 8 deletions(-) > > diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events > index 54bd7da00c8..f7ad6be5fbb 100644 > --- a/hw/virtio/trace-events > +++ b/hw/virtio/trace-events > @@ -91,7 +91,7 @@ virtio_mmio_setting_irq(int level) "virtio_mmio setting IRQ %d" > virtio_iommu_device_reset(void) "reset!" > virtio_iommu_get_features(uint64_t features) "device supports features=0x%"PRIx64 > virtio_iommu_device_status(uint8_t status) "driver status = %d" > -virtio_iommu_get_config(uint64_t page_size_mask, uint64_t start, uint64_t end, uint32_t domain_range, uint32_t probe_size) "page_size_mask=0x%"PRIx64" start=0x%"PRIx64" end=0x%"PRIx64" domain_range=%d probe_size=0x%x" > +virtio_iommu_get_config(uint64_t page_size_mask, uint64_t start, uint64_t end, uint32_t domain_start, uint32_t domain_end, uint32_t probe_size) "page_size_mask=0x%"PRIx64" input range start=0x%"PRIx64" input range end=0x%"PRIx64" domain range start=%d domain range end=%d probe_size=0x%x" > virtio_iommu_attach(uint32_t domain_id, uint32_t ep_id) "domain=%d endpoint=%d" > virtio_iommu_detach(uint32_t domain_id, uint32_t ep_id) "domain=%d endpoint=%d" > virtio_iommu_map(uint32_t domain_id, uint64_t virt_start, uint64_t virt_end, uint64_t phys_start, uint32_t flags) "domain=%d virt_start=0x%"PRIx64" virt_end=0x%"PRIx64 " phys_start=0x%"PRIx64" flags=%d" > diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c > index 645c0aa3997..30ee09187b8 100644 > --- a/hw/virtio/virtio-iommu.c > +++ b/hw/virtio/virtio-iommu.c > @@ -822,14 +822,22 @@ unlock: > static void virtio_iommu_get_config(VirtIODevice *vdev, uint8_t *config_data) > { > VirtIOIOMMU *dev = VIRTIO_IOMMU(vdev); > - struct virtio_iommu_config *config = &dev->config; > + struct virtio_iommu_config *dev_config = &dev->config; > + struct virtio_iommu_config *out_config = (void *)config_data; > > - trace_virtio_iommu_get_config(config->page_size_mask, > - config->input_range.start, > - config->input_range.end, > - config->domain_range.end, > - config->probe_size); > - memcpy(config_data, &dev->config, sizeof(struct virtio_iommu_config)); > + out_config->page_size_mask = cpu_to_le64(dev_config->page_size_mask); > + out_config->input_range.start = cpu_to_le64(dev_config->input_range.start); > + out_config->input_range.end = cpu_to_le64(dev_config->input_range.end); > + out_config->domain_range.start = cpu_to_le32(dev_config->domain_range.start); > + out_config->domain_range.end = cpu_to_le32(dev_config->domain_range.end); > + out_config->probe_size = cpu_to_le32(dev_config->probe_size); > + > + trace_virtio_iommu_get_config(dev_config->page_size_mask, > + dev_config->input_range.start, > + dev_config->input_range.end, > + dev_config->domain_range.start, > + dev_config->domain_range.end, > + dev_config->probe_size); > } > > static uint64_t virtio_iommu_get_features(VirtIODevice *vdev, uint64_t f, > -- > 2.26.3 >
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 54bd7da00c8..f7ad6be5fbb 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -91,7 +91,7 @@ virtio_mmio_setting_irq(int level) "virtio_mmio setting IRQ %d" virtio_iommu_device_reset(void) "reset!" virtio_iommu_get_features(uint64_t features) "device supports features=0x%"PRIx64 virtio_iommu_device_status(uint8_t status) "driver status = %d" -virtio_iommu_get_config(uint64_t page_size_mask, uint64_t start, uint64_t end, uint32_t domain_range, uint32_t probe_size) "page_size_mask=0x%"PRIx64" start=0x%"PRIx64" end=0x%"PRIx64" domain_range=%d probe_size=0x%x" +virtio_iommu_get_config(uint64_t page_size_mask, uint64_t start, uint64_t end, uint32_t domain_start, uint32_t domain_end, uint32_t probe_size) "page_size_mask=0x%"PRIx64" input range start=0x%"PRIx64" input range end=0x%"PRIx64" domain range start=%d domain range end=%d probe_size=0x%x" virtio_iommu_attach(uint32_t domain_id, uint32_t ep_id) "domain=%d endpoint=%d" virtio_iommu_detach(uint32_t domain_id, uint32_t ep_id) "domain=%d endpoint=%d" virtio_iommu_map(uint32_t domain_id, uint64_t virt_start, uint64_t virt_end, uint64_t phys_start, uint32_t flags) "domain=%d virt_start=0x%"PRIx64" virt_end=0x%"PRIx64 " phys_start=0x%"PRIx64" flags=%d" diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c index 645c0aa3997..30ee09187b8 100644 --- a/hw/virtio/virtio-iommu.c +++ b/hw/virtio/virtio-iommu.c @@ -822,14 +822,22 @@ unlock: static void virtio_iommu_get_config(VirtIODevice *vdev, uint8_t *config_data) { VirtIOIOMMU *dev = VIRTIO_IOMMU(vdev); - struct virtio_iommu_config *config = &dev->config; + struct virtio_iommu_config *dev_config = &dev->config; + struct virtio_iommu_config *out_config = (void *)config_data; - trace_virtio_iommu_get_config(config->page_size_mask, - config->input_range.start, - config->input_range.end, - config->domain_range.end, - config->probe_size); - memcpy(config_data, &dev->config, sizeof(struct virtio_iommu_config)); + out_config->page_size_mask = cpu_to_le64(dev_config->page_size_mask); + out_config->input_range.start = cpu_to_le64(dev_config->input_range.start); + out_config->input_range.end = cpu_to_le64(dev_config->input_range.end); + out_config->domain_range.start = cpu_to_le32(dev_config->domain_range.start); + out_config->domain_range.end = cpu_to_le32(dev_config->domain_range.end); + out_config->probe_size = cpu_to_le32(dev_config->probe_size); + + trace_virtio_iommu_get_config(dev_config->page_size_mask, + dev_config->input_range.start, + dev_config->input_range.end, + dev_config->domain_range.start, + dev_config->domain_range.end, + dev_config->probe_size); } static uint64_t virtio_iommu_get_features(VirtIODevice *vdev, uint64_t f,
Endianess is not properly handled when populating the returned config. Use the cpu_to_le* primitives for each separate field. Also, while at it, trace the domain range start. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reported-by: Thomas Huth <thuth@redhat.com> --- hw/virtio/trace-events | 2 +- hw/virtio/virtio-iommu.c | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-)