WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] dom0 runs well in shadow translate mode!

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] dom0 runs well in shadow translate mode!
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Fri, 18 Mar 2005 17:01:47 +0000
Delivery-date: Tue, 05 Apr 2005 16:12:48 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1236.32.11, 2005/03/18 17:01:47+00:00, mafetter@xxxxxxxxxxxxxxxx

        dom0 runs well in shadow translate mode!
        
        Signed-off-by: michael.fetterman@xxxxxxxxxxxx



 arch/x86/audit.c                     |   11 +
 arch/x86/domain.c                    |    2 
 arch/x86/extable.c                   |    9 +
 arch/x86/mm.c                        |   51 +++----
 arch/x86/shadow.c                    |  243 ++++++++++++++++++++---------------
 arch/x86/vmx.c                       |    4 
 arch/x86/x86_32/domain_build.c       |   14 +-
 arch/x86/x86_32/domain_page.c        |    8 -
 arch/x86/x86_32/traps.c              |    2 
 common/page_alloc.c                  |    9 +
 include/asm-x86/mm.h                 |   57 +++++++-
 include/asm-x86/shadow.h             |  177 ++++++++++++++++++++-----
 include/asm-x86/vmx_platform.h       |    3 
 include/asm-x86/x86_32/domain_page.h |   18 ++
 include/xen/perfc_defn.h             |    8 +
 include/xen/sched.h                  |    1 
 16 files changed, 437 insertions(+), 180 deletions(-)


diff -Nru a/xen/arch/x86/audit.c b/xen/arch/x86/audit.c
--- a/xen/arch/x86/audit.c      2005-04-05 12:12:50 -04:00
+++ b/xen/arch/x86/audit.c      2005-04-05 12:12:50 -04:00
@@ -36,7 +36,7 @@
 static int l1, l2, oos_count, page_count;
 
 #define FILE_AND_LINE 0
-//#define MFN_TO_WATCH 0x4700
+//#define MFN2_TO_WATCH 0x1d8
 
 #if FILE_AND_LINE
 #define adjust(_p, _a) _adjust((_p), (_a), __FILE__, __LINE__)
@@ -56,10 +56,10 @@
 
     void _adjust(struct pfn_info *page, int adjtype ADJUST_EXTRA_ARGS)
     {
-#ifdef MFN_TO_WATCH
-        if (page_to_pfn(page) == MFN_TO_WATCH)
+#ifdef MFN2_TO_WATCH
+        if (page_to_pfn(page) == MFN2_TO_WATCH)
         {
-            APRINTK("adjust(mfn=%p, dir=%d, adjtype=%d) MFN_TO_WATCH",
+            APRINTK("adjust(mfn=%p, dir=%d, adjtype=%d)",
                     page_to_pfn(page), dir, adjtype);
         }
 #endif
@@ -547,6 +547,9 @@
         adjust_oos_list();
         adjust_shadow_tables();
     }
+
+    //printk("d->shared_info=%p __pa()=%p\n", d->shared_info, 
__pa(d->shared_info));
+    adjust(virt_to_page(d->shared_info), 1);
 
     return errors;
 }
diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     2005-04-05 12:12:49 -04:00
+++ b/xen/arch/x86/domain.c     2005-04-05 12:12:50 -04:00
@@ -238,7 +238,7 @@
         d->shared_info = (void *)alloc_xenheap_page();
         memset(d->shared_info, 0, PAGE_SIZE);
         ed->vcpu_info = &d->shared_info->vcpu_data[ed->eid];
-        SHARE_PFN_WITH_DOMAIN(virt_to_page(d->shared_info), d);
+        SHARE_PFN_WITH_DOMAIN2(virt_to_page(d->shared_info), d);
         machine_to_phys_mapping[virt_to_phys(d->shared_info) >> 
                                PAGE_SHIFT] = INVALID_M2P_ENTRY;
 
diff -Nru a/xen/arch/x86/extable.c b/xen/arch/x86/extable.c
--- a/xen/arch/x86/extable.c    2005-04-05 12:12:51 -04:00
+++ b/xen/arch/x86/extable.c    2005-04-05 12:12:51 -04:00
@@ -3,6 +3,11 @@
 #include <xen/spinlock.h>
 #include <asm/uaccess.h>
 
+#ifdef PERF_COUNTERS
+#include <xen/sched.h>
+#include <xen/perfc.h>
+#endif
+
 extern struct exception_table_entry __start___ex_table[];
 extern struct exception_table_entry __stop___ex_table[];
 extern struct exception_table_entry __start___pre_ex_table[];
@@ -69,5 +74,9 @@
     unsigned long fixup = search_one_table(
         __start___pre_ex_table, __stop___pre_ex_table-1, addr);
     DPRINTK("Pre-exception: %p -> %p\n", addr, fixup);
+#ifdef PERF_COUNTERS
+    if ( fixup )
+        perfc_incrc(exception_fixed);
+#endif
     return fixup;
 }
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-04-05 12:12:50 -04:00
+++ b/xen/arch/x86/mm.c 2005-04-05 12:12:51 -04:00
@@ -262,7 +262,7 @@
 
     gpfn = l1_pgentry_to_pfn(mk_l1_pgentry(l1e));
     gmfn = __gpfn_to_mfn(d, gpfn);
-    if ( unlikely(!gmfn) )
+    if ( unlikely(!VALID_MFN(gmfn)) )
         return 0;
 
     if ( unlikely(shadow_mode_enabled(d)) )
@@ -1088,7 +1088,7 @@
 }
 
 
-void put_page_type(struct pfn_info *page)
+void _put_page_type(struct pfn_info *page)
 {
     u32 nx, x, y = page->u.inuse.type_info;
 
@@ -1143,7 +1143,7 @@
 }
 
 
-int get_page_type(struct pfn_info *page, u32 type)
+int _get_page_type(struct pfn_info *page, u32 type)
 {
     u32 nx, x, y = page->u.inuse.type_info;
 
@@ -1286,8 +1286,7 @@
     unsigned int cmd = val & MMUEXT_CMD_MASK, type;
     struct exec_domain *ed = current;
     struct domain *d = ed->domain, *e;
-    unsigned long gpfn = ptr >> PAGE_SHIFT;
-    unsigned long mfn = __gpfn_to_mfn(d, gpfn);
+    unsigned long mfn = ptr >> PAGE_SHIFT;
     struct pfn_info *page = &frame_table[mfn];
     u32 x, y, _d, _nd;
     domid_t domid;
@@ -1304,15 +1303,6 @@
         type = PGT_l1_page_table | PGT_va_mutable;
 
     pin_page:
-        if ( unlikely(percpu_info[cpu].foreign &&
-                      (shadow_mode_translate(d) ||
-                       shadow_mode_translate(percpu_info[cpu].foreign))) )
-        {
-            // oops -- we should be using the foreign domain's P2M
-            mfn = __gpfn_to_mfn(FOREIGNDOM, gpfn);
-            page = &frame_table[mfn];
-        }
-
         if ( shadow_mode_enabled(FOREIGNDOM) )
             type = PGT_writable_page;
 
@@ -1349,15 +1339,6 @@
 #endif /* __x86_64__ */
 
     case MMUEXT_UNPIN_TABLE:
-        if ( unlikely(percpu_info[cpu].foreign &&
-                      (shadow_mode_translate(d) ||
-                       shadow_mode_translate(percpu_info[cpu].foreign))) )
-        {
-            // oops -- we should be using the foreign domain's P2M
-            mfn = __gpfn_to_mfn(FOREIGNDOM, gpfn);
-            page = &frame_table[mfn];
-        }
-
         if ( unlikely(!(okay = get_page_from_pagenr(mfn, FOREIGNDOM))) )
         {
             MEM_LOG("mfn %p bad domain (dom=%p)",
@@ -1723,9 +1704,7 @@
     cleanup_writable_pagetable(d);
 
     if ( unlikely(shadow_mode_enabled(d)) )
-    {
         check_pagetable(ed, "pre-mmu"); /* debug */
-    }
 
     /*
      * If we are resuming after preemption, read how much work we have already
@@ -1783,8 +1762,7 @@
         }
 
         cmd = req.ptr & (sizeof(l1_pgentry_t)-1);
-        gpfn = req.ptr >> PAGE_SHIFT;
-        mfn = __gpfn_to_mfn(d, gpfn);
+        mfn = req.ptr >> PAGE_SHIFT;
 
         okay = 0;
 
@@ -1867,6 +1845,8 @@
                         if ( shadow_mode_log_dirty(d) )
                             __mark_dirty(d, mfn);
 
+                        gpfn = __mfn_to_gpfn(d, mfn);
+                        ASSERT(gpfn);
                         if ( page_is_page_table(page) )
                             shadow_mark_mfn_out_of_sync(ed, gpfn, mfn);
                     }
@@ -1886,6 +1866,21 @@
             break;
 
         case MMU_MACHPHYS_UPDATE:
+
+            // HACK ALERT...  This about this later...
+            //
+            if ( unlikely(shadow_mode_translate(FOREIGNDOM) && IS_PRIV(d)) )
+            {
+                rc = FOREIGNDOM->next_io_page++;
+                printk("privileged guest dom%d requests mfn=%p for dom%d, gets 
pfn=%p\n",
+                       d->id, mfn, FOREIGNDOM->id, rc);
+                set_machinetophys(mfn, rc);
+                set_p2m_entry(FOREIGNDOM, rc, mfn);
+                okay = 1;
+                break;
+            }
+            BUG();
+            
             if ( unlikely(!get_page_from_pagenr(mfn, FOREIGNDOM)) )
             {
                 MEM_LOG("Could not get page for mach->phys update");
@@ -2250,7 +2245,7 @@
 
     LOCK_BIGLOCK(dom);
 
-    if ( !(mfn = __gpfn_to_mfn(dom, gpfn)) ) {
+    if ( !VALID_MFN(mfn = __gpfn_to_mfn(dom, gpfn)) ) {
         UNLOCK_BIGLOCK(dom);
         return -EINVAL;
     }
diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     2005-04-05 12:12:49 -04:00
+++ b/xen/arch/x86/shadow.c     2005-04-05 12:12:49 -04:00
@@ -191,14 +191,6 @@
     unsigned long smfn;
     int pin = 0;
 
-    if ( (psh_type != PGT_snapshot) &&
-         !shadow_promote(d, gpfn, gmfn, psh_type) )
-    {
-        FSH_LOG("promotion of pfn=%p mfn=%p failed!  external gnttab refs?\n",
-                gpfn, gmfn);
-        return 0;
-    }
-
     page = alloc_domheap_page(NULL);
     if ( unlikely(page == NULL) )
     {
@@ -222,11 +214,15 @@
     switch ( psh_type )
     {
     case PGT_l1_shadow:
+        if ( !shadow_promote(d, gpfn, gmfn, psh_type) )
+            goto oom;
         perfc_incr(shadow_l1_pages);
         d->arch.shadow_page_count++;
         break;
 
     case PGT_l2_shadow:
+        if ( !shadow_promote(d, gpfn, gmfn, psh_type) )
+            goto oom;
         perfc_incr(shadow_l2_pages);
         d->arch.shadow_page_count++;
         if ( PGT_l2_page_table == PGT_root_page_table )
@@ -235,13 +231,16 @@
         break;
 
     case PGT_hl2_shadow:
+        // Treat an hl2 as an L1 for purposes of promotion.
+        // For external mode domains, treat them as an L2 for purposes of
+        // pinning.
+        //
+        if ( !shadow_promote(d, gpfn, gmfn, PGT_l1_shadow) )
+            goto oom;
         perfc_incr(hl2_table_pages);

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] dom0 runs well in shadow translate mode!, BitKeeper Bot <=