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] [xen-unstable] Add debug-key 'D' to dump EPT p2m table.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Add debug-key 'D' to dump EPT p2m table.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Apr 2010 06:15:16 -0700
Delivery-date: Sat, 24 Apr 2010 06:15:54 -0700
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1272008458 -3600
# Node ID ffcc927a19a43b347217a49706f035d8718b2707
# Parent  49e3aa844902045cc38e4d4b2b0f82b0c78d102b
Add debug-key 'D' to dump EPT p2m table.

Signed-off-by: Dongxiao Xu <dongxiao.xu@xxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vmx.c        |    3 +
 xen/arch/x86/mm/hap/p2m-ept.c     |   73 ++++++++++++++++++++++++++++++++++++++
 xen/include/asm-x86/hvm/vmx/vmx.h |    1 
 3 files changed, 77 insertions(+)

diff -r 49e3aa844902 -r ffcc927a19a4 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri Apr 23 08:39:29 2010 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Apr 23 08:40:58 2010 +0100
@@ -1444,7 +1444,10 @@ void start_vmx(void)
     }
 
     if ( cpu_has_vmx_ept )
+    {
         vmx_function_table.hap_supported = 1;
+        setup_ept_dump();
+    }
     
     vmx_function_table.hap_1gb_pgtb = ( vmx_ept_super_page_level_limit == 2 ) ?
                                         1 : 0;
diff -r 49e3aa844902 -r ffcc927a19a4 xen/arch/x86/mm/hap/p2m-ept.c
--- a/xen/arch/x86/mm/hap/p2m-ept.c     Fri Apr 23 08:39:29 2010 +0100
+++ b/xen/arch/x86/mm/hap/p2m-ept.c     Fri Apr 23 08:40:58 2010 +0100
@@ -29,6 +29,8 @@
 #include <xen/iommu.h>
 #include <asm/mtrr.h>
 #include <asm/hvm/cacheattr.h>
+#include <xen/keyhandler.h>
+#include <xen/softirq.h>
 
 /* Non-ept "lock-and-check" wrapper */
 static int ept_pod_check_and_populate(struct domain *d, unsigned long gfn,
@@ -725,6 +727,77 @@ void ept_p2m_init(struct domain *d)
     d->arch.p2m->change_entry_type_global = ept_change_entry_type_global;
 }
 
+static void ept_dump_p2m_table(unsigned char key)
+{
+    struct domain *d;
+    ept_entry_t *table, *ept_entry;
+    mfn_t mfn;
+    int order;
+    int i;
+    int is_pod;
+    int ret;
+    unsigned long index;
+    unsigned long gfn, gfn_remainder;
+    unsigned long record_counter = 0;
+
+    for_each_domain(d)
+    {
+        if ( !(is_hvm_domain(d) && d->arch.hvm_domain.hap_enabled) )
+            continue;
+
+        printk("\ndomain%d EPT p2m table: \n", d->domain_id);
+
+        for ( gfn = 0; gfn <= d->arch.p2m->max_mapped_pfn; gfn += (1 << order) 
)
+        {
+            gfn_remainder = gfn;
+            mfn = _mfn(INVALID_MFN);
+            table =
+                map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+
+            for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
+            {
+                ret = ept_next_level(d, 1, &table, &gfn_remainder,
+                                     i * EPT_TABLE_ORDER);
+                if ( ret != GUEST_TABLE_NORMAL_PAGE )
+                    break;
+            }
+
+            order = i * EPT_TABLE_ORDER;
+
+            if ( ret == GUEST_TABLE_MAP_FAILED )
+                goto out;
+
+            index = gfn_remainder >> order;
+            ept_entry = table + index;
+            if ( ept_entry->avail1 != p2m_invalid )
+            {
+                ( ept_entry->avail1 == p2m_populate_on_demand ) ? 
+                ( mfn = _mfn(INVALID_MFN), is_pod = 1 ) :
+                ( mfn = _mfn(ept_entry->mfn), is_pod = 0 );
+
+                printk("gfn: %-16lx  mfn: %-16lx  order: %2d  is_pod: %d\n",
+                       gfn, mfn_x(mfn), order, is_pod);
+
+                if ( !(record_counter++ % 100) )
+                    process_pending_softirqs();
+            }
+out:
+            unmap_domain_page(table);
+        }
+    }
+}
+
+static struct keyhandler ept_p2m_table = {
+    .diagnostic = 0,
+    .u.fn = ept_dump_p2m_table,
+    .desc = "dump ept p2m table"
+};
+
+void setup_ept_dump(void)
+{
+    register_keyhandler('D', &ept_p2m_table);
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 49e3aa844902 -r ffcc927a19a4 xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Fri Apr 23 08:39:29 2010 +0100
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Fri Apr 23 08:40:58 2010 +0100
@@ -357,6 +357,7 @@ void vmx_inject_nmi(void);
 
 void ept_p2m_init(struct domain *d);
 void ept_walk_table(struct domain *d, unsigned long gfn);
+void setup_ept_dump(void);
 
 /* EPT violation qualifications definitions */
 #define _EPT_READ_VIOLATION         0

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Add debug-key 'D' to dump EPT p2m table., Xen patchbot-unstable <=