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] Initial commit for trying to get a translated dom0 up an

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Initial commit for trying to get a translated dom0 up and running.
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Thu, 17 Mar 2005 12:25:14 +0000
Delivery-date: Tue, 05 Apr 2005 16:12:30 +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.10, 2005/03/17 12:25:14+00:00, mafetter@xxxxxxxxxxxxxxxx

        Initial commit for trying to get a translated dom0 up and running.
        
        Signed-off-by: michael.fetterman@xxxxxxxxxxxx



 arch/x86/audit.c               |  118 ++++++++++++---
 arch/x86/domain.c              |   22 ++
 arch/x86/mm.c                  |    2 
 arch/x86/shadow.c              |  321 +++++++++++++++++++++++++++++++++++------
 arch/x86/traps.c               |    2 
 arch/x86/vmx_io.c              |    2 
 arch/x86/x86_32/domain_build.c |   26 ++-
 arch/x86/x86_64/domain_build.c |    2 
 include/asm-x86/domain.h       |    4 
 include/asm-x86/mm.h           |   12 -
 include/asm-x86/shadow.h       |   31 ++-
 include/xen/perfc_defn.h       |    2 
 12 files changed, 445 insertions(+), 99 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:34 -04:00
+++ b/xen/arch/x86/audit.c      2005-04-05 12:12:34 -04:00
@@ -36,6 +36,7 @@
 static int l1, l2, oos_count, page_count;
 
 #define FILE_AND_LINE 0
+//#define MFN_TO_WATCH 0x4700
 
 #if FILE_AND_LINE
 #define adjust(_p, _a) _adjust((_p), (_a), __FILE__, __LINE__)
@@ -51,9 +52,17 @@
 {
     int errors = 0;
     int shadow_enabled = shadow_mode_enabled(d) ? 1 : 0;
+    int l2limit;
 
     void _adjust(struct pfn_info *page, int adjtype ADJUST_EXTRA_ARGS)
     {
+#ifdef MFN_TO_WATCH
+        if (page_to_pfn(page) == MFN_TO_WATCH)
+        {
+            APRINTK("adjust(mfn=%p, dir=%d, adjtype=%d) MFN_TO_WATCH",
+                    page_to_pfn(page), dir, adjtype);
+        }
+#endif
         if ( adjtype )
         {
             // adjust the type count
@@ -97,7 +106,7 @@
 
         if ( count < 0 )
         {
-            APRINTK("Audit %d: general count went below zero pfn=%x t=%x 
ot=%x",
+            APRINTK("Audit %d: general count went below zero mfn=%x t=%x 
ot=%x",
                     d->id, page-frame_table,
                     page->u.inuse.type_info,
                     page->tlbflush_timestamp);
@@ -105,7 +114,7 @@
         }
         else if ( (count & ~PGT_count_mask) != 0 )
         {
-            APRINTK("Audit %d: general count overflowed pfn=%x t=%x ot=%x",
+            APRINTK("Audit %d: general count overflowed mfn=%x t=%x ot=%x",
                     d->id, page-frame_table,
                     page->u.inuse.type_info,
                     page->tlbflush_timestamp);
@@ -115,17 +124,12 @@
             page->count_info += dir;
     }
 
-    void adjust_l2_page(unsigned long mfn, int adjtype)
+    void adjust_l2_page(unsigned long mfn)
     {
         unsigned long *pt = map_domain_mem(mfn << PAGE_SHIFT);
-        int i, limit;
-
-        if ( shadow_mode_external(d) )
-            limit = L2_PAGETABLE_ENTRIES;
-        else
-            limit = DOMAIN_ENTRIES_PER_L2_PAGETABLE;
+        int i;
 
-        for ( i = 0; i < limit; i++ )
+        for ( i = 0; i < l2limit; i++ )
         {
             if ( pt[i] & _PAGE_PRESENT )
             {
@@ -180,7 +184,61 @@
                     }
                 }
 
-                adjust(l1page, adjtype);
+                adjust(l1page, !shadow_enabled);
+            }
+        }
+
+        if ( shadow_mode_translate(d) && !shadow_mode_external(d) )
+        {
+            unsigned long hl2mfn =
+                pt[l2_table_offset(LINEAR_PT_VIRT_START)] >> PAGE_SHIFT;
+            struct pfn_info *hl2page = pfn_to_page(hl2mfn);
+            adjust(hl2page, 0);
+        }
+
+        unmap_domain_mem(pt);
+    }
+
+    void adjust_hl2_page(unsigned long hl2mfn)
+    {
+        unsigned long *pt = map_domain_mem(hl2mfn << PAGE_SHIFT);
+        int i;
+
+        for ( i = 0; i < l2limit; i++ )
+        {
+            if ( pt[i] & _PAGE_PRESENT )
+            {
+                unsigned long gmfn = pt[i] >> PAGE_SHIFT;
+                struct pfn_info *gpage = pfn_to_page(gmfn);
+
+                if ( gmfn < 0x100 )
+                {
+                    lowmem_mappings++;
+                    continue;
+                }
+
+                if ( gmfn > max_page )
+                {
+                    io_mappings++;
+                    continue;
+                }
+
+                if ( noisy )
+                {
+                    if ( page_get_owner(gpage) != d )
+                    {
+                        printk("Audit %d: [hl2mfn=%p,i=%x] Skip foreign page "
+                               "dom=%p (id=%d) mfn=%p c=%08x t=%08x\n",
+                               d->id, hl2mfn, i,
+                               page_get_owner(gpage),
+                               page_get_owner(gpage)->id,
+                               gmfn,
+                               gpage->count_info,
+                               gpage->u.inuse.type_info);
+                        continue;
+                    }
+                }
+                adjust(gpage, 0);
             }
         }
 
@@ -281,13 +339,17 @@
                 case PGT_snapshot:
                     break;
                 case PGT_l1_shadow:
-                case PGT_hl2_shadow:
                     adjust_l1_page(smfn);
                     if ( page->u.inuse.type_info & PGT_pinned )
                         adjust(page, 0);
                     break;
+                case PGT_hl2_shadow:
+                    adjust_hl2_page(smfn);
+                    if ( page->u.inuse.type_info & PGT_pinned )
+                        adjust(page, 0);
+                    break;
                 case PGT_l2_shadow:
-                    adjust_l2_page(smfn, 0);
+                    adjust_l2_page(smfn);
                     if ( page->u.inuse.type_info & PGT_pinned )
                         adjust(page, 0);
                     break;
@@ -317,6 +379,9 @@
             if ( !(oos->writable_pl1e & (sizeof(l1_pgentry_t)-1)) )
                 adjust(pfn_to_page(oos->writable_pl1e >> PAGE_SHIFT), 0);
 
+            if ( oos->snapshot_mfn != SHADOW_SNAPSHOT_ELSEWHERE )
+                adjust(pfn_to_page(oos->snapshot_mfn), 0);
+
             oos = oos->next;
             oos_count++;
         }
@@ -400,7 +465,7 @@
                     adjust(page, 1);
 
                 if ( page->u.inuse.type_info & PGT_validated )
-                    adjust_l2_page(mfn, 1);
+                    adjust_l2_page(mfn);
 
                 break;
 
@@ -468,6 +533,11 @@
         }
     }
 
+    if ( shadow_mode_external(d) )
+        l2limit = L2_PAGETABLE_ENTRIES;
+    else
+        l2limit = DOMAIN_ENTRIES_PER_L2_PAGETABLE;
+
     adjust_for_pgtbase();
 
     adjust_guest_pages();
@@ -484,7 +554,7 @@
 
 #ifndef NDEBUG
 
-void _audit_domain(struct domain *d, int flags, const char *file, int line)
+void _audit_domain(struct domain *d, int flags)
 {
     void scan_for_pfn_in_mfn(struct domain *d, unsigned long xmfn,
                              unsigned long mfn)
@@ -569,6 +639,14 @@
     struct pfn_info *page;
     int errors = 0;
 
+    if ( (d != current->domain) && shadow_mode_translate(d) )
+    {
+        printk("skipping audit domain of translated domain %d "
+               "from other context\n",
+               d->id);
+        return;
+    }
+
     if ( d != current->domain )
         domain_pause(d);
     synchronise_pagetables(~0UL);
@@ -740,11 +818,10 @@
                 page_type = a->gpfn_and_flags & PGT_type_mask;
 
                 switch ( page_type ) {
-                case PGT_snapshot:
-                    // XXX -- what should we check here?
-                    break;
                 case PGT_l1_shadow:
                 case PGT_l2_shadow:
+                case PGT_hl2_shadow:
+                case PGT_snapshot:
                     if ( ((page->u.inuse.type_info & PGT_type_mask) != 
page_type ) ||
                          (page->count_info != 0) )
                     {
@@ -756,7 +833,6 @@
                     }
                     break;
 
-                case PGT_hl2_shadow: // haven't thought about this case yet.
                 default:
                     BUG();
                     break;
@@ -781,9 +857,9 @@
     spin_unlock(&d->page_alloc_lock);
 
     if ( !(flags & AUDIT_QUIET) )
-        printk("Audit dom%d (%s:%d) Done. "
+        printk("Audit dom%d Done. "
                "pages=%d oos=%d l1=%d l2=%d ctot=%d ttot=%d\n",
-               d->id, file, line, page_count, oos_count, l1, l2, ctot, ttot );
+               d->id, page_count, oos_count, l1, l2, ctot, ttot);
 
     if ( !(flags & AUDIT_ALREADY_LOCKED) )
         shadow_unlock(d);
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:33 -04:00
+++ b/xen/arch/x86/domain.c     2005-04-05 12:12:33 -04:00
@@ -344,8 +344,6 @@
         shadow_mode_enable(ed->domain, SHM_enable|SHM_translate|SHM_external);
     }
 
-    update_pagetables(ed);
-
     return 0;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Initial commit for trying to get a translated dom0 up and running., BitKeeper Bot <=