[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 05/21] IOMMU/x86: restrict IO-APIC mappings for PV Dom0


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Wed, 4 May 2022 15:00:49 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qG0gipfkVcrI0mhGWOZpx23SXCCFHD+LFN5z/Mlkfkg=; b=j9rjxB6mapJvFp43AjNItRzO4RofaCEIRQ/oHQxNcbEGojKy27yQc4k7OIPPs+EKV4FRZOaqUhbH/UVaF3IxES2ZoETISANvJT+C3MAe8qrFbxpPpIJRUtPqI2JQspfxE8nXRLFcprxHHG8cIxmD1qqkRfwCNX6DsyGmVB3qOvB5dxyqqW1ZeihXLceCYBUPvRY5bW5iySHtnSv1dQTwsZt7l6IlMvWIqnJA0OpyEcxh79YpTJHQCsV1H4STaPNRucyd+E4hBmP9empyrQTbWwz7zeC6GuOUagIOFEWOqsn6bDfWE4vFwKfx+2cxmQP9o8PW1IZKLcYXLRNaH5U+Kw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CoK9AtcXuWTDbWNVxgkMslLc6kGt3eCUS3FDCzIHUMm7ad8r7e5BxFP5nT8BIY+J311aTmNvD1a67yl1L2ZjjfHXzuKe8f8h4PsND+VLoaSPMeJBD+J76/9eBcSA4X/ExdGJL1xcl5Go/XR+ndmdqakF5CUEwa2Xy6AOXQncQTxad1g6cFlskXFiyObWKRoSchs7tIOhjVCII5weSYECF1MPNXuu/AjNtRoIzvcTjbjj8RVp9Ip75nqs6BP7F8yERiNRY1MnrH3ob3gNdjV9Xj9lEUrcmLbXB0DvhSeMJ+WyeaKeAUqp2gCJa9RpiKFxq1QfVbf0i1OOSNvncyaRwQ==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Paul Durrant <paul@xxxxxxx>
  • Delivery-date: Wed, 04 May 2022 13:01:16 +0000
  • Ironport-data: A9a23:51ebkK3FpDvlifgOl/bD5aVwkn2cJEfYwER7XKvMYLTBsI5bpzUBz GdMWzyEOvyLYmP8e4h/bYSzoU9VvJTXn9RmTAZvpC1hF35El5HIVI+TRqvS04J+DSFhoGZPt Zh2hgzodZhsJpPkjk7xdOCn9xGQ7InQLlbGILes1htZGEk1EU/NtTo5w7Rj2tMw3YDja++wk YiaT/P3aQfNNwFcagr424rbwP+4lK2v0N+wlgVWicFj5DcypVFMZH4sDfjZw0/DaptVBoaHq 9Prl9lVyI97EyAFUbtJmp6jGqEDryW70QKm0hK6UID66vROS7BbPg/W+5PwZG8O4whlkeydx /1cnKyfZSYoYZf2kb1McQB0PmYkBPdZreqvzXiX6aR/zmXgWl61mrBCKR9zOocVvOFqHWtJ6 PoUbigXaQyOjP63x7T9TfRwgsMkL4/gO4Z3VnNIlGmFS6p5B82cBfyVu7e03x9p7ixKNezZa McDLyJmcTzLYgFVO0dRA5U79AutrieuImEF8QvPzUYxy1LZ/S5I1ebBDODyVvuPSusKu0qbv FuTqgwVBTlfbrRz0wGt8Hihm+vOliPTQ58JGfuz8fsCqE2ewCkfBQMbUXO/oOKlkQiuVtRHM UsW9yEy668o+ySDVtDgWzWorXjCuQQTM+e8CMU/4QCJj6bRvQCQAzFdSiYbMYN48sgrWTYty 1mF2cvzAiBiu6GUTnTb8aqIqTS1Om4eKmpqiTI4cDbpKuLL+Okb5i8jhP46eEJpprUZwQ3N/ g0=
  • Ironport-hdrordr: A9a23:cBscHqpzY1w2WE/wRWCWhCoaV5t4LNV00zEX/kB9WHVpm5Oj+v xGzc5w6farsl0ssSkb6Ki90dq7MAjhHP9OkMMs1NKZMDUO11HYSL2KgbGC/9SkIVyGygc/79 YsT0EdMqyWMbESt6+Tj2eF+pQbsb+6GcuT9ITjJgJWPGRXgtZbnmVE42igcnFedU1jP94UBZ Cc7s1Iq36LYnIMdPm2AXEDQqzqu8DLvIiOW29IOzcXrC21yR+44r/zFBaVmj0EVSlU/Lsk+W /Z1yTk+6SYte2hwBO07R6c030Woqqh9jJwPr3OtiEnEESvtu9uXvUlZ1S2hkF0nAho0idvrD CDmWZmAy050QKqQoj8m2qR5+Cn6kdj15aq8y7mvVL4vcL2SCgmB8d2jZ9FehHZ70Ymoedn3L hQ32SfgZpbZCmw4BjV9pzGUQpnmVGzpmdnmekPj2ZHWY9bc7NJq5cDlXklWavoMRiKn7zPKt Meev00JcwmAm+yfjTcpC1i0dasVnM8ElOPRVUDoNWc13xTkGpix0UVycQDljNYnahNAKVs9q DBKOBlhbtORsgZYeZ0A/oAW9K+DijITQjXOGyfLFz7HOUMOm7LqZTw/LIpjdvaMKAg3d83gt DMQVlYvWk9dwbnDtCPxoRC9lTXTGC0TV3Wu7VjDlhCy8jBrZbQQFy+oQoV4rWdSt0kc73mcu f2Po5KCPn+KmarEZpV3mTFKutvFUU=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Wed, May 04, 2022 at 02:12:58PM +0200, Jan Beulich wrote:
> On 04.05.2022 14:01, Roger Pau Monné wrote:
> > On Wed, May 04, 2022 at 12:51:25PM +0200, Jan Beulich wrote:
> >> On 04.05.2022 12:30, Roger Pau Monné wrote:
> >>> Right, ->iomem_caps is indeed too wide for our purpose.  What
> >>> about using something like:
> >>>
> >>> else if ( is_pv_domain(d) )
> >>> {
> >>>     if ( !iomem_access_permitted(d, pfn, pfn) )
> >>>         return 0;
> >>
> >> We can't return 0 here (as RAM pages also make it here when
> >> !iommu_hwdom_strict), so I can at best take this as a vague outline
> >> of what you really mean. And I don't want to rely on RAM pages being
> >> (imo wrongly) represented by set bits in Dom0's iomem_caps.
> > 
> > Well, yes, my suggestion was taking into account that ->iomem_caps for
> > dom0 has mostly holes for things that shouldn't be mapped, but
> > otherwise contains everything else as allowed (including RAM).
> > 
> > We could instead do:
> > 
> > else if ( is_pv_domain(d) && type != RAM_TYPE_CONVENTIONAL )
> > {
> >     ...
> > 
> > So that we don't rely on RAM being 'allowed' in ->iomem_caps?
> 
> This would feel to me like excess special casing.

What about placing this in the 'default:' label on the type switch a
bit above?

> >>>     if ( rangeset_contains_singleton(mmio_ro_ranges, pfn) )
> >>>         return IOMMUF_readable;
> >>> }
> >>>
> >>> That would get us a bit closer to allowed CPU side mappings, and we
> >>> don't need to special case IO-APIC or HPET addresses as those are
> >>> already added to ->iomem_caps or mmio_ro_ranges respectively by
> >>> dom0_setup_permissions().
> >>
> >> This won't fit in a region of code framed by a (split) comment
> >> saying "Check that it doesn't overlap with ...". Hence if anything
> >> I could put something like this further down. Yet even then the
> >> question remains what to do with ranges which pass
> >> iomem_access_permitted() but
> >> - aren't really MMIO,
> >> - are inside MMCFG,
> >> - are otherwise special.
> >>
> >> Or did you perhaps mean to suggest something like
> >>
> >> else if ( is_pv_domain(d) && iomem_access_permitted(d, pfn, pfn) &&
> >>           rangeset_contains_singleton(mmio_ro_ranges, pfn) )
> >>     return IOMMUF_readable;
> > 
> > I don't think this would be fully correct, as we would still allow
> > mappings of IO-APIC pages explicitly banned in ->iomem_caps by not
> > handling those?
> 
> CPU side mappings don't deal with the IO-APICs specifically. They only
> care about iomem_caps and mmio_ro_ranges. Hence explicitly banned
> IO-APIC pages cannot be mapped there either. (Of course we only do
> such banning if IO-APIC pages weren't possible to represent in
> mmio_ro_ranges, which should effectively be never.)

I think I haven't expressed myself correctly.

This construct won't return 0 for pfns not in iomem_caps, and hence
could allow mapping of addresses not in iomem_caps?

> >> ? Then there would only remain the question of whether mapping r/o
> >> MMCFG pages is okay (I don't think it is), but that could then be
> >> special-cased similar to what's done further down for vPCI (by not
> >> returning in the "else if", but merely updating "perms").
> > 
> > Well part of the point of this is to make CPU and Device mappings
> > more similar.  I don't think devices have any business in poking at
> > the MMCFG range, so it's fine to explicitly ban that range.  But I
> > would have also said the same for IO-APIC pages, so I'm unsure why are
> > IO-APIC pages fine to be mapped RO, but not the MMCFG range.
> 
> I wouldn't have wanted to allow r/o mappings of the IO-APICs, but
> Linux plus the ACPI tables of certain vendors require us to permit
> this. If we didn't, Dom0 would crash there during boot.

Right, but those are required for the CPU only.  I think it's a fine
goal to try to have similar mappings for CPU and Devices, and then
that would also cover MMCFG in the PV case.  Or else it fine to assume
CPU vs Device mappings will be slightly different, and then don't add
any mappings for IO-APIC, HPET or MMCFG to the Device page tables
(likely there's more that could be added here).

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.