# 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
|