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

[Xen-changelog] [xen-unstable] Add debug-key 'D' to dump EPT p2m table.



# 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


 


Rackspace

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