> From: Jan Beulich <jbeul...@suse.com> > Sent: Monday, April 11, 2022 5:37 PM > > The field taking the value 7 (resulting in 18-bit DIDs when using the > calculation in cap_ndoms(), when the DID fields are only 16 bits wide) > is reserved. Instead of misbehaving in case we would encounter such an > IOMMU, refuse to use it. > > Signed-off-by: Jan Beulich <jbeul...@suse.com>
Reviewed-by: Kevin Tian <kevin.t...@intel.com> > > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -1267,8 +1267,11 @@ int __init iommu_alloc(struct acpi_drhd_ > > quirk_iommu_caps(iommu); > > + nr_dom = cap_ndoms(iommu->cap); > + > if ( cap_fault_reg_offset(iommu->cap) + > cap_num_fault_regs(iommu->cap) * PRIMARY_FAULT_REG_LEN > > PAGE_SIZE || > + ((nr_dom - 1) >> 16) /* I.e. cap.nd > 6 */ || > (has_register_based_invalidation(iommu) && > ecap_iotlb_offset(iommu->ecap) >= PAGE_SIZE) ) > { > @@ -1294,8 +1297,6 @@ int __init iommu_alloc(struct acpi_drhd_ > if ( !ecap_coherent(iommu->ecap) ) > iommu_non_coherent = true; > > - nr_dom = cap_ndoms(iommu->cap); > - > if ( nr_dom <= DOMID_MASK * 2 + cap_caching_mode(iommu->cap) ) > { > /* Allocate domain id (bit) maps. */