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

[Xen-changelog] Added support for mapping other domain's memory from a privileged



ChangeSet 1.1236.33.1, 2005/03/15 08:15:00+00:00, mafetter@xxxxxxxxxxxxxxxx

        Added support for mapping other domain's memory from a privileged
        shadowed domain.  Should hopefully enable a shadowed dom0 to start
        up other domains.
        
        Signed-off-by: michael.fetterman@xxxxxxxxxxxx



 arch/x86/mm.c            |    2 --
 arch/x86/shadow.c        |    6 +++---
 include/asm-x86/shadow.h |   30 +++++++++++++++++++++++++++---
 include/xen/perfc_defn.h |    1 +
 4 files changed, 31 insertions(+), 8 deletions(-)


diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-04-05 12:08:01 -04:00
+++ b/xen/arch/x86/mm.c 2005-04-05 12:08:01 -04:00
@@ -1858,8 +1858,6 @@
                 break;
 #endif /* __x86_64__ */
             default:
-                printk("do_mmu_update writable update: ma=%p val=%p\n",
-                       req.ptr, req.val);
                 if ( likely(get_page_type(page, PGT_writable_page)) )
                 {
                     if ( shadow_mode_enabled(d) )
diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     2005-04-05 12:08:01 -04:00
+++ b/xen/arch/x86/shadow.c     2005-04-05 12:08:01 -04:00
@@ -1197,7 +1197,7 @@
         {
             l1pte_propagate_from_guest(d, gpl1e[i], &spl1e[i]);
             if ( spl1e[i] & _PAGE_PRESENT )
-                get_page_from_l1e(mk_l1_pgentry(spl1e[i]), d);
+                shadow_get_page_from_l1e(mk_l1_pgentry(spl1e[i]), d);
         }
     }
 }
@@ -1503,7 +1503,7 @@
             unsigned long new = old & ~_PAGE_RW;
 
             if ( is_l1_shadow )
-                get_page_from_l1e(mk_l1_pgentry(new), d);
+                shadow_get_page_from_l1e(mk_l1_pgentry(new), d);
 
             count++;
             pt[i] = new;
@@ -1724,7 +1724,7 @@
         unsigned long opte = *ppte;
         unsigned long npte = opte & ~_PAGE_RW;
 
-        get_page_from_l1e(mk_l1_pgentry(npte), d);
+        shadow_get_page_from_l1e(mk_l1_pgentry(npte), d);
         *ppte = npte;
         put_page_from_l1e(mk_l1_pgentry(opte), d);
 
diff -Nru a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
--- a/xen/include/asm-x86/shadow.h      2005-04-05 12:08:01 -04:00
+++ b/xen/include/asm-x86/shadow.h      2005-04-05 12:08:01 -04:00
@@ -215,6 +215,30 @@
 
 /************************************************************************/
 
+static inline int
+shadow_get_page_from_l1e(l1_pgentry_t l1e, struct domain *d)
+{
+    int res = get_page_from_l1e(l1e, d);
+    struct domain *owner;
+
+    if ( unlikely(!res) && IS_PRIV(d) && !shadow_mode_translate(d) &&
+         (owner = page_get_owner(pfn_to_page(l1_pgentry_to_pfn(l1e)))) &&
+         (d != owner) )
+    {
+        res = get_page_from_l1e(l1e, owner);
+        printk("tried to map page from domain %d into shadow page tables "
+               "of domain %d; %s\n",
+               owner->id, d->id, res ? "success" : "failed");
+    }
+
+    if ( unlikely(!res) )
+        perfc_incrc(shadow_get_page_fail);
+
+    return res;
+}
+
+/************************************************************************/
+
 static inline void
 __shadow_get_l2e(
     struct exec_domain *ed, unsigned long va, unsigned long *psl2e)
@@ -257,7 +281,7 @@
         if ( (old_hl2e ^ new_hl2e) & (PAGE_MASK | _PAGE_PRESENT) )
         {
             if ( new_hl2e & _PAGE_PRESENT )
-                get_page_from_l1e(mk_l1_pgentry(new_hl2e), ed->domain);
+                shadow_get_page_from_l1e(mk_l1_pgentry(new_hl2e), ed->domain);
             if ( old_hl2e & _PAGE_PRESENT )
                 put_page_from_l1e(mk_l1_pgentry(old_hl2e), ed->domain);
         }
@@ -574,7 +598,7 @@
     if ( (old_spte ^ new_spte) & (PAGE_MASK | _PAGE_RW | _PAGE_PRESENT) )
     {
         if ( new_spte & _PAGE_PRESENT )
-            get_page_from_l1e(mk_l1_pgentry(new_spte), d);
+            shadow_get_page_from_l1e(mk_l1_pgentry(new_spte), d);
         if ( old_spte & _PAGE_PRESENT )
             put_page_from_l1e(mk_l1_pgentry(old_spte), d);
     }
@@ -1081,7 +1105,7 @@
     if ( (old_spte ^ new_spte) & (PAGE_MASK | _PAGE_RW | _PAGE_PRESENT) )
     {
         if ( new_spte & _PAGE_PRESENT )
-            get_page_from_l1e(mk_l1_pgentry(new_spte), d);
+            shadow_get_page_from_l1e(mk_l1_pgentry(new_spte), d);
         if ( old_spte & _PAGE_PRESENT )
             put_page_from_l1e(mk_l1_pgentry(old_spte), d);
     }
diff -Nru a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h
--- a/xen/include/xen/perfc_defn.h      2005-04-05 12:08:01 -04:00
+++ b/xen/include/xen/perfc_defn.h      2005-04-05 12:08:01 -04:00
@@ -43,6 +43,7 @@
 PERFCOUNTER_CPU(shadow_status_hit_head, "hits on head of bucket" )
 PERFCOUNTER_CPU(check_pagetable,        "calls to check_pagetable" )
 PERFCOUNTER_CPU(check_all_pagetables,   "calls to check_all_pagetables" )
+PERFCOUNTER_CPU(shadow_get_page_fail,   "shadow_get_page_from_l1e fails" )
 
 PERFCOUNTER_CPU(shadow_sync_all,                   "calls to shadow_sync_all")
 PERFCOUNTER_CPU(shadow_make_snapshot,              "snapshots created")

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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