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

[Xen-devel] [PATCH v3.1 08/15] x86/vtd: fix mapping of RMRR regions



Currently RMRR regions are only mapped to the hardware domain or to
non-translated domains that use an IOMMU. In order to fix this, make sure
set_identity_p2m_entry sets the appropriate IOMMU mappings, and that
clear_identity_p2m_entry also removes them.

Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 xen/arch/x86/mm/p2m.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 6a45185..da3e937 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -1049,22 +1049,29 @@ int set_identity_p2m_entry(struct domain *d, unsigned 
long gfn,
 
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, 0, NULL, NULL);
 
-    if ( p2mt == p2m_invalid || p2mt == p2m_mmio_dm )
+    switch ( p2mt )
+    {
+    case p2m_invalid:
+    case p2m_mmio_dm:
         ret = p2m_set_entry(p2m, gfn, _mfn(gfn), PAGE_ORDER_4K,
                             p2m_mmio_direct, p2ma);
-    else if ( mfn_x(mfn) == gfn && p2mt == p2m_mmio_direct && a == p2ma )
-    {
-        ret = 0;
-        /*
-         * PVH fixme: during Dom0 PVH construction, p2m entries are being set
-         * but iomem regions are not mapped with IOMMU. This makes sure that
-         * RMRRs are correctly mapped with IOMMU.
-         */
-        if ( is_hardware_domain(d) && !iommu_use_hap_pt(d) )
+        if ( ret )
+            break;
+        /* fallthrough */
+    case p2m_mmio_direct:
+        if ( p2mt == p2m_mmio_direct && a != p2ma )
+        {
+            printk(XENLOG_G_WARNING
+                   "Cannot setup identity map d%d:%lx, already mapped with "
+                   "different access type (current: %d, requested: %d).\n",
+                   d->domain_id, gfn, a, p2ma);
+            ret = (flag & XEN_DOMCTL_DEV_RDM_RELAXED) ? 0 : -EBUSY;
+            break;
+        }
+        if ( !iommu_use_hap_pt(d) )
             ret = iommu_map_page(d, gfn, gfn, IOMMUF_readable|IOMMUF_writable);
-    }
-    else
-    {
+        break;
+    default:
         if ( flag & XEN_DOMCTL_DEV_RDM_RELAXED )
             ret = 0;
         else
@@ -1073,6 +1080,7 @@ int set_identity_p2m_entry(struct domain *d, unsigned 
long gfn,
                "Cannot setup identity map d%d:%lx,"
                " gfn already mapped to %lx.\n",
                d->domain_id, gfn, mfn_x(mfn));
+        break;
     }
 
     gfn_unlock(p2m, gfn, 0);
@@ -1149,6 +1157,9 @@ int clear_identity_p2m_entry(struct domain *d, unsigned 
long gfn)
     {
         ret = p2m_set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_4K,
                             p2m_invalid, p2m->default_access);
+        if ( !iommu_use_hap_pt(d) )
+            ret = iommu_unmap_page(d, gfn) ? : ret;
+
         gfn_unlock(p2m, gfn, 0);
     }
     else
-- 
2.7.4 (Apple Git-66)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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