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

[Xen-devel] [v8][PATCH 13/17] xen/mem_access: don't allow accessing reserved device memory



We can't expost those reserved device memory in case of mem_access
since any access may corrupt device usage.

Signed-off-by: Tiejun Chen <tiejun.chen@xxxxxxxxx>
---
 xen/common/mem_access.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/xen/common/mem_access.c b/xen/common/mem_access.c
index 6c2724b..72a807a 100644
--- a/xen/common/mem_access.c
+++ b/xen/common/mem_access.c
@@ -55,6 +55,43 @@ void mem_access_resume(struct domain *d)
     }
 }
 
+/* We can't expose reserved device memory. */
+static int mem_access_check_rdm(struct domain *d, uint64_aligned_t start,
+                                uint32_t nr)
+{
+    uint32_t i;
+    struct p2m_get_reserved_device_memory pgrdm;
+    int rc = 0;
+
+    if ( !is_hardware_domain(d) && iommu_use_hap_pt(d) )
+    {
+        for ( i = 0; i < nr; i++ )
+        {
+            pgrdm.gfn = start + i;
+            pgrdm.domain = d;
+            rc = 
iommu_get_reserved_device_memory(p2m_check_reserved_device_memory,
+                                                  &pgrdm);
+            if ( rc < 0 )
+            {
+                printk(XENLOG_WARNING
+                       "Domain %d can't check reserved device memory.\n",
+                       d->domain_id);
+                return rc;
+            }
+
+            if ( rc == 1 )
+            {
+                printk(XENLOG_WARNING
+                       "Domain %d: we shouldn't mem_access reserved device 
memory.\n",
+                       d->domain_id);
+                return rc;
+            }
+        }
+    }
+
+    return rc;
+}
+
 int mem_access_memop(unsigned long cmd,
                      XEN_GUEST_HANDLE_PARAM(xen_mem_access_op_t) arg)
 {
@@ -99,6 +136,10 @@ int mem_access_memop(unsigned long cmd,
               ((mao.pfn + mao.nr - 1) > domain_get_maximum_gpfn(d))) )
             break;
 
+        rc =  mem_access_check_rdm(d, mao.pfn, mao.nr);
+        if ( rc == 1 )
+            break;
+
         rc = p2m_set_mem_access(d, mao.pfn, mao.nr, start_iter,
                                 MEMOP_CMD_MASK, mao.access);
         if ( rc > 0 )
-- 
1.9.1


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


 


Rackspace

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