[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 01/15] IOMMU/x86: restrict IO-APIC mappings for PV Dom0
On 01.06.2022 10:17, Roger Pau Monné wrote: > On Wed, Jun 01, 2022 at 09:10:09AM +0200, Jan Beulich wrote: >> On 31.05.2022 18:15, Roger Pau Monné wrote: >>> On Tue, May 31, 2022 at 05:40:03PM +0200, Jan Beulich wrote: >>>> On 31.05.2022 16:40, Roger Pau Monné wrote: >>>>> On Fri, May 27, 2022 at 01:12:06PM +0200, Jan Beulich wrote: >>>>>> @@ -289,44 +290,75 @@ static bool __hwdom_init hwdom_iommu_map >>>>>> * that fall in unusable ranges for PV Dom0. >>>>>> */ >>>>>> if ( (pfn > max_pfn && !mfn_valid(mfn)) || xen_in_range(pfn) ) >>>>>> - return false; >>>>>> + return 0; >>>>>> >>>>>> switch ( type = page_get_ram_type(mfn) ) >>>>>> { >>>>>> case RAM_TYPE_UNUSABLE: >>>>>> - return false; >>>>>> + return 0; >>>>>> >>>>>> case RAM_TYPE_CONVENTIONAL: >>>>>> if ( iommu_hwdom_strict ) >>>>>> - return false; >>>>>> + return 0; >>>>>> break; >>>>>> >>>>>> default: >>>>>> if ( type & RAM_TYPE_RESERVED ) >>>>>> { >>>>>> if ( !iommu_hwdom_inclusive && !iommu_hwdom_reserved ) >>>>>> - return false; >>>>>> + perms = 0; >>>>>> } >>>>>> - else if ( is_hvm_domain(d) || !iommu_hwdom_inclusive || pfn > >>>>>> max_pfn ) >>>>>> - return false; >>>>>> + else if ( is_hvm_domain(d) ) >>>>>> + return 0; >>>>>> + else if ( !iommu_hwdom_inclusive || pfn > max_pfn ) >>>>>> + perms = 0; >>>>>> } >>>>>> >>>>>> /* Check that it doesn't overlap with the Interrupt Address Range. >>>>>> */ >>>>>> if ( pfn >= 0xfee00 && pfn <= 0xfeeff ) >>>>>> - return false; >>>>>> + return 0; >>>>>> /* ... or the IO-APIC */ >>>>>> - for ( i = 0; has_vioapic(d) && i < d->arch.hvm.nr_vioapics; i++ ) >>>>>> - if ( pfn == PFN_DOWN(domain_vioapic(d, i)->base_address) ) >>>>>> - return false; >>>>>> + if ( has_vioapic(d) ) >>>>>> + { >>>>>> + for ( i = 0; i < d->arch.hvm.nr_vioapics; i++ ) >>>>>> + if ( pfn == PFN_DOWN(domain_vioapic(d, i)->base_address) ) >>>>>> + return 0; >>>>>> + } >>>>>> + else if ( is_pv_domain(d) ) >>>>>> + { >>>>>> + /* >>>>>> + * Be consistent with CPU mappings: Dom0 is permitted to >>>>>> establish r/o >>>>>> + * ones there (also for e.g. HPET in certain cases), so it >>>>>> should also >>>>>> + * have such established for IOMMUs. >>>>>> + */ >>>>>> + if ( iomem_access_permitted(d, pfn, pfn) && >>>>>> + rangeset_contains_singleton(mmio_ro_ranges, pfn) ) >>>>>> + perms = IOMMUF_readable; >>>>>> + } >>>>>> /* >>>>>> * ... or the PCIe MCFG regions. >>>> >>>> With this comment (which I leave alone) ... >>>> >>>>>> * TODO: runtime added MMCFG regions are not checked to make sure >>>>>> they >>>>>> * don't overlap with already mapped regions, thus preventing >>>>>> trapping. >>>>>> */ >>>>>> if ( has_vpci(d) && vpci_is_mmcfg_address(d, pfn_to_paddr(pfn)) ) >>>>>> - return false; >>>>>> + return 0; >>>>>> + else if ( is_pv_domain(d) ) >>>>>> + { >>>>>> + /* >>>>>> + * Don't extend consistency with CPU mappings to PCI MMCFG >>>>>> regions. >>>>>> + * These shouldn't be accessed via DMA by devices. >>>>> >>>>> Could you expand the comment a bit to explicitly mention the reason >>>>> why MMCFG regions shouldn't be accessible from device DMA operations? >>>> >>>> ... it's hard to tell what I should write here. I'd expect extended >>>> reasoning to go there (if anywhere). I'd be okay adjusting the earlier >>>> comment, if only I knew what to write. "We don't want them to be >>>> accessed that way" seems a little blunt. I could say "Devices have >>>> other means to access PCI config space", but this not being said there >>>> I took as being implied. >>> >>> But we could likely say the same about IO-APIC or HPET MMIO regions. >>> I don't think we expect them to be accessed by devices, yet we provide >>> them for coherency with CPU side mappings in the PV case. >> >> As to "say the same" - yes for the first part of my earlier reply, but >> no for the latter part. > > Yes, obviously devices cannot access the HPET or the IO-APIC MMIO from > the PCI config space :). > >>>> Or else what was the reason to exclude these >>>> for PVH Dom0? >>> >>> The reason for PVH is because the config space is (partially) emulated >>> for the hardware domain, so we don't allow untrapped access by the CPU >>> either. >> >> Hmm, right - there's read emulation there as well, while for PV we >> only intercept writes. >> >> So overall should we perhaps permit r/o access to MMCFG for PV? Of >> course that would only end up consistent once we adjust mappings >> dynamically when MMCFG ranges are put in use (IOW if we can't verify >> an MMCFG range is suitably reserved, we'd not find in >> mmio_ro_ranges just yet, and hence we still wouldn't have an IOMMU >> side mapping even if CPU side mappings are permitted). But for the >> patch here it would simply mean dropping some of the code I did add >> for v5. > > I would be OK with that, as I think we would then be consistent with > how IO-APIC and HPET MMIO regions are handled. We would have to add > some small helper/handling in PHYSDEVOP_pci_mmcfg_reserved for PV. Okay, I'll drop that code again then. But I'm not going to look into making the dynamic part work, at least not within this series. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |