On 09/11/2018 11:29, Eric Auger wrote: > +static void virtio_iommu_register_resv_region(viommu_endpoint *ep, > + uint8_t subtype, > + uint64_t start, uint64_t end) > +{ > + viommu_interval *interval; > + struct virtio_iommu_probe_resv_mem *reg; > + > + interval = g_malloc0(sizeof(*interval)); > + interval->low = start; > + interval->high = end; > + > + reg = g_malloc0(sizeof(*reg)); > + reg->subtype = subtype; > + reg->start = cpu_to_le64(start); > + reg->end = cpu_to_le64(end); > + > + g_tree_insert(ep->reserved_regions, interval, reg); > +} > + > static viommu_endpoint *virtio_iommu_get_endpoint(VirtIOIOMMU *s, > uint32_t ep_id) > { > @@ -120,6 +142,12 @@ static viommu_endpoint > *virtio_iommu_get_endpoint(VirtIOIOMMU *s, > ep->reserved_regions = g_tree_new_full((GCompareDataFunc)interval_cmp, > NULL, (GDestroyNotify)g_free, > (GDestroyNotify)g_free); > + if (s->msi_bypass) { > + virtio_iommu_register_resv_region(ep, VIRTIO_IOMMU_RESV_MEM_T_MSI, > + IOAPIC_RANGE_START, > + IOAPIC_RANGE_SIZE);
The last argument of register_resv_region is 'end' but you're passing a size Thanks, Jean