[PATCH v1 07/13] xen/arm: map shared memory to borrower when host address not provided

Penny Zheng posted 13 patches 2 months, 2 weeks ago
[PATCH v1 07/13] xen/arm: map shared memory to borrower when host address not provided
Posted by Penny Zheng 2 months, 2 weeks ago
With the introduction of new scenario where host address is not provided
in "xen,shared-mem", the function "map_regions_p2mt" for setting up
P2M foreign mapping for borrower domain shall be adapted to it too.

Here we implement a new helper "borrower_physmap_add_memory" to
cover both scenarios.

Signed-off-by: Penny Zheng <penny.zheng@arm.com>
---
 xen/arch/arm/domain_build.c | 54 ++++++++++++++++++++++++++++++++++---
 1 file changed, 51 insertions(+), 3 deletions(-)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index faf0784bb0..d0f7fc8fd7 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1110,6 +1110,51 @@ static int __init assign_shared_memory(struct domain *d,
     return ret;
 }
 
+static int __init borrower_physmap_add_memory(struct domain *d,
+                                              struct shm_membank *shm_membank,
+                                              paddr_t gbase)
+{
+    int ret;
+    unsigned int i;
+    paddr_t start, size;
+    gfn_t sgfn;
+    struct meminfo *meminfo;
+
+    /* Host address is not provided in "xen,shared-mem" */
+    if ( shm_membank->mem.banks.meminfo )
+    {
+        meminfo = shm_membank->mem.banks.meminfo;
+        for ( i = 0; i < meminfo->nr_banks; i++ )
+        {
+            start = meminfo->bank[i].start;
+            size = meminfo->bank[i].size;
+            sgfn = _gfn(PFN_UP(gbase));
+
+            /* Set up P2M foreign mapping for borrower domain. */
+            ret = map_regions_p2mt(d, sgfn, PFN_DOWN(size), _mfn(PFN_UP(start)),
+                                   p2m_map_foreign_rw);
+            if ( ret )
+                return ret;
+
+            sgfn = gfn_add(sgfn, PFN_DOWN(size));
+        }
+    }
+    else
+    {
+        start = shm_membank->mem.bank->start;
+        size = shm_membank->mem.bank->size;
+        sgfn = _gfn(PFN_UP(gbase));
+
+        /* Set up P2M foreign mapping for borrower domain. */
+        ret = map_regions_p2mt(d, sgfn, PFN_DOWN(size), _mfn(PFN_UP(start)),
+                               p2m_map_foreign_rw);
+        if ( ret )
+            return ret;
+    }
+
+    return 0;
+}
+
 static int __init append_shm_bank_to_domain(struct kernel_info *kinfo,
                                             paddr_t start, paddr_t size,
                                             const char *shm_id)
@@ -1242,11 +1287,14 @@ static int __init process_shm(struct domain *d, struct kernel_info *kinfo,
 
         if ( owner_dom_io || (strcmp(role_str, "borrower") == 0) )
         {
-            /* Set up P2M foreign mapping for borrower domain. */
-            ret = map_regions_p2mt(d, _gfn(PFN_UP(gbase)), PFN_DOWN(psize),
-                                   _mfn(PFN_UP(pbase)), p2m_map_foreign_rw);
+            ret = borrower_physmap_add_memory(d, shm_membank, gbase);
             if ( ret )
+            {
+                printk(XENLOG_ERR
+                       "%pd: Failed to map foreign memory to borrower domain: %d",
+                       d, ret);
                 return ret;
+            }
         }
 
         /*
-- 
2.25.1