aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.rootkeys5
-rw-r--r--xen/arch/ia64/dom0_ops.c3
-rw-r--r--xen/arch/ia64/pdb-stub.c2
-rw-r--r--xen/arch/x86/audit.c16
-rw-r--r--xen/arch/x86/dom0_ops.c2
-rw-r--r--xen/arch/x86/mm.c81
-rw-r--r--xen/arch/x86/setup.c2
-rw-r--r--xen/arch/x86/shadow.c183
-rw-r--r--xen/arch/x86/traps.c2
-rw-r--r--xen/arch/x86/vmx.c16
-rw-r--r--xen/arch/x86/vmx_platform.c40
-rw-r--r--xen/arch/x86/vmx_vmcs.c28
-rw-r--r--xen/arch/x86/x86_32/domain_page.c15
-rw-r--r--xen/arch/x86/x86_32/mm.c4
-rw-r--r--xen/common/dom0_ops.c6
-rw-r--r--xen/common/dom_mem_ops.c1
-rw-r--r--xen/common/domain.c4
-rw-r--r--xen/common/page_alloc.c10
-rw-r--r--xen/include/asm-ia64/domain_page.h14
-rw-r--r--xen/include/asm-x86/config.h5
-rw-r--r--xen/include/asm-x86/domain_page.h5
-rw-r--r--xen/include/asm-x86/shadow.h6
-rw-r--r--xen/include/asm-x86/x86_32/domain_page.h85
-rw-r--r--xen/include/asm-x86/x86_64/domain_page.h21
-rw-r--r--xen/include/xen/domain_page.h100
-rw-r--r--xen/include/xen/perfc_defn.h221
26 files changed, 432 insertions, 445 deletions
diff --git a/.rootkeys b/.rootkeys
index 25ea25e441..1fb7450306 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -1285,7 +1285,6 @@
421098b6ZcIrn_gdqjUtdJyCE0YkZQ xen/include/asm-ia64/debugger.h
421098b6z0zSuW1rcSJK1gR8RUi-fw xen/include/asm-ia64/dom_fw.h
421098b6Nn0I7hGB8Mkd1Cis0KMkhA xen/include/asm-ia64/domain.h
-4241e879ry316Y_teC18DuK7mGKaQw xen/include/asm-ia64/domain_page.h
4241e880hAyo_dk0PPDYj3LsMIvf-Q xen/include/asm-ia64/flushtlb.h
421098b6X3Fs2yht42TE2ufgKqt2Fw xen/include/asm-ia64/ia64_int.h
421098b7psFAn8kbeR-vcRCdc860Vw xen/include/asm-ia64/init.h
@@ -1333,7 +1332,6 @@
3ddb79c34BFiXjBJ_cCKB0aCsV1IDw xen/include/asm-x86/desc.h
40715b2dTokMLYGSuD58BnxOqyWVew xen/include/asm-x86/div64.h
4204e7acwzqgXyTAPKa1nM-L7Ec0Qw xen/include/asm-x86/domain.h
-41febc4bBKTKHhnAu_KPYwgNkHjFlg xen/include/asm-x86/domain_page.h
41d3eaaeIBzW621S1oa0c2yk7X43qQ xen/include/asm-x86/e820.h
3ddb79c3NU8Zy40OTrq3D-i30Y3t4A xen/include/asm-x86/fixmap.h
3e2d29944GI24gf7vOP_7x8EyuqxeA xen/include/asm-x86/flushtlb.h
@@ -1399,14 +1397,12 @@
420951dcqyUCe_gXA_XJPu1ix_poKg xen/include/asm-x86/vmx_virpit.h
41c0c412lQ0NVVN9PsOSznQ-qhOiPA xen/include/asm-x86/vmx_vmcs.h
418fbcfe_WliJPToeVM-9VStvym-hw xen/include/asm-x86/x86_32/asm_defns.h
-3e20b82fl1jmQiKdLy7fxMcutfpjWA xen/include/asm-x86/x86_32/domain_page.h
429c852fi3pvfa9kIjryYK5AGBmXAg xen/include/asm-x86/x86_32/page-2level.h
429c852fskvSOgcD5EC25_m9um9t4g xen/include/asm-x86/x86_32/page-3level.h
4208e2a3ZNFroNXbX9OYaOB-xtUyDQ xen/include/asm-x86/x86_32/page.h
3ddb79c3mbqEM7QQr3zVq7NiBNhouA xen/include/asm-x86/x86_32/regs.h
3ddb79c3M2n1ROZH6xk3HbyN4CPDqg xen/include/asm-x86/x86_32/uaccess.h
41bf1717bML6GxpclTWJabiaO5W5vg xen/include/asm-x86/x86_64/asm_defns.h
-41febc4b1aCGLsm0Y0b_82h7lFtrEA xen/include/asm-x86/x86_64/domain_page.h
4208e2a3Fktw4ZttKdDxbhvTQ6brfQ xen/include/asm-x86/x86_64/page.h
404f1bb86rAXB3aLS1vYdcqpJiEcyg xen/include/asm-x86/x86_64/regs.h
404f1bc4tWkB9Qr8RkKtZGW5eMQzhw xen/include/asm-x86/x86_64/uaccess.h
@@ -1443,6 +1439,7 @@
3ddb79c05DdHQ0UxX_jKsXdR4QlMCA xen/include/xen/delay.h
4294b5efxcDdUVp4XMEE__IFw7nPow xen/include/xen/dmi.h
40f2b4a2hC3HtChu-ArD8LyojxWMjg xen/include/xen/domain.h
+3e20b82fl1jmQiKdLy7fxMcutfpjWA xen/include/xen/domain_page.h
3ddb79c2O729EttZTYu1c8LcsUO_GQ xen/include/xen/elf.h
3ddb79c0HIghfBF8zFUdmXhOU8i6hA xen/include/xen/errno.h
3ddb79c1W0lQca8gRV7sN6j3iY4Luw xen/include/xen/event.h
diff --git a/xen/arch/ia64/dom0_ops.c b/xen/arch/ia64/dom0_ops.c
index daaa87445c..e0b48080bc 100644
--- a/xen/arch/ia64/dom0_ops.c
+++ b/xen/arch/ia64/dom0_ops.c
@@ -13,12 +13,9 @@
#include <public/dom0_ops.h>
#include <xen/sched.h>
#include <xen/event.h>
-#include <asm/domain_page.h>
-//#include <asm/msr.h>
#include <asm/pdb.h>
#include <xen/trace.h>
#include <xen/console.h>
-//#include <xen/shadow.h>
#include <public/sched_ctl.h>
#define TRC_DOM0OP_ENTER_BASE 0x00020000
diff --git a/xen/arch/ia64/pdb-stub.c b/xen/arch/ia64/pdb-stub.c
index 8c1ea5d06b..49c8131312 100644
--- a/xen/arch/ia64/pdb-stub.c
+++ b/xen/arch/ia64/pdb-stub.c
@@ -14,8 +14,6 @@
#include <xen/sched.h>
#include <asm/ptrace.h>
#include <xen/keyhandler.h>
-//#include <asm/apic.h>
-#include <asm/domain_page.h> /* [un]map_domain_mem */
#include <asm/processor.h>
#include <asm/pdb.h>
#include <xen/list.h>
diff --git a/xen/arch/x86/audit.c b/xen/arch/x86/audit.c
index ef58f52eff..dc2a14979a 100644
--- a/xen/arch/x86/audit.c
+++ b/xen/arch/x86/audit.c
@@ -122,7 +122,7 @@ int audit_adjust_pgtables(struct domain *d, int dir, int noisy)
void adjust_l2_page(unsigned long mfn, int shadow)
{
- unsigned long *pt = map_domain_mem(mfn << PAGE_SHIFT);
+ unsigned long *pt = map_domain_page(mfn);
int i;
for ( i = 0; i < l2limit; i++ )
@@ -205,12 +205,12 @@ int audit_adjust_pgtables(struct domain *d, int dir, int noisy)
adjust(hl2page, 0);
}
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
}
void adjust_hl2_page(unsigned long hl2mfn)
{
- unsigned long *pt = map_domain_mem(hl2mfn << PAGE_SHIFT);
+ unsigned long *pt = map_domain_page(hl2mfn);
int i;
for ( i = 0; i < l2limit; i++ )
@@ -251,12 +251,12 @@ int audit_adjust_pgtables(struct domain *d, int dir, int noisy)
}
}
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
}
void adjust_l1_page(unsigned long l1mfn)
{
- unsigned long *pt = map_domain_mem(l1mfn << PAGE_SHIFT);
+ unsigned long *pt = map_domain_page(l1mfn);
int i;
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
@@ -323,7 +323,7 @@ int audit_adjust_pgtables(struct domain *d, int dir, int noisy)
}
}
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
}
void adjust_shadow_tables()
@@ -615,7 +615,7 @@ void _audit_domain(struct domain *d, int flags)
unsigned long mfn)
{
struct pfn_info *page = &frame_table[mfn];
- unsigned long *pt = map_domain_mem(mfn<<PAGE_SHIFT);
+ unsigned long *pt = map_domain_page(mfn);
int i;
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
@@ -627,7 +627,7 @@ void _audit_domain(struct domain *d, int flags)
page->count_info, i, pt[i]);
}
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
}
void scan_for_pfn_in_grant_table(struct domain *d, unsigned xmfn)
diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c
index 87b4cb9df7..dbb723090d 100644
--- a/xen/arch/x86/dom0_ops.c
+++ b/xen/arch/x86/dom0_ops.c
@@ -13,7 +13,7 @@
#include <public/dom0_ops.h>
#include <xen/sched.h>
#include <xen/event.h>
-#include <asm/domain_page.h>
+#include <xen/domain_page.h>
#include <asm/msr.h>
#include <xen/trace.h>
#include <xen/console.h>
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 797b89ed0c..00ba933799 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -94,12 +94,12 @@
#include <xen/perfc.h>
#include <xen/irq.h>
#include <xen/softirq.h>
+#include <xen/domain_page.h>
#include <asm/shadow.h>
#include <asm/page.h>
#include <asm/flushtlb.h>
#include <asm/io.h>
#include <asm/uaccess.h>
-#include <asm/domain_page.h>
#include <asm/ldt.h>
#include <asm/x86_emulate.h>
@@ -269,17 +269,17 @@ static int alloc_segdesc_page(struct pfn_info *page)
struct desc_struct *descs;
int i;
- descs = map_domain_mem((page-frame_table) << PAGE_SHIFT);
+ descs = map_domain_page(page_to_pfn(page));
for ( i = 0; i < 512; i++ )
if ( unlikely(!check_descriptor(&descs[i])) )
goto fail;
- unmap_domain_mem(descs);
+ unmap_domain_page(descs);
return 1;
fail:
- unmap_domain_mem(descs);
+ unmap_domain_page(descs);
return 0;
}
@@ -665,14 +665,14 @@ static int alloc_l1_table(struct pfn_info *page)
ASSERT(!shadow_mode_refcounts(d));
- pl1e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl1e = map_domain_page(pfn);
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
if ( is_guest_l1_slot(i) &&
unlikely(!get_page_from_l1e(pl1e[i], d)) )
goto fail;
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
return 1;
fail:
@@ -680,7 +680,7 @@ static int alloc_l1_table(struct pfn_info *page)
if ( is_guest_l1_slot(i) )
put_page_from_l1e(pl1e[i], d);
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
return 0;
}
@@ -699,7 +699,7 @@ static inline int fixup_pae_linear_mappings(l3_pgentry_t *pl3e)
return 0;
}
- pl2e = map_domain_mem(l3e_get_paddr(pl3e[3]));
+ pl2e = map_domain_page(l3e_get_pfn(pl3e[3]));
for (i = 0; i < 4; i++) {
vaddr = LINEAR_PT_VIRT_START + (i << L2_PAGETABLE_SHIFT);
idx = (vaddr >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES-1);
@@ -709,7 +709,7 @@ static inline int fixup_pae_linear_mappings(l3_pgentry_t *pl3e)
} else
pl2e[idx] = l2e_empty();
}
- unmap_domain_mem(pl2e);
+ unmap_domain_page(pl2e);
return 1;
}
@@ -749,7 +749,7 @@ static int alloc_l2_table(struct pfn_info *page, unsigned int type)
ASSERT( !shadow_mode_refcounts(d) );
- pl2e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl2e = map_domain_page(pfn);
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ ) {
vaddr = i << L2_PAGETABLE_SHIFT;
@@ -790,7 +790,7 @@ static int alloc_l2_table(struct pfn_info *page, unsigned int type)
}
#endif
- unmap_domain_mem(pl2e);
+ unmap_domain_page(pl2e);
return 1;
fail:
@@ -798,7 +798,7 @@ static int alloc_l2_table(struct pfn_info *page, unsigned int type)
if ( is_guest_l2_slot(type, i) )
put_page_from_l2e(pl2e[i], pfn);
- unmap_domain_mem(pl2e);
+ unmap_domain_page(pl2e);
return 0;
}
@@ -815,7 +815,7 @@ static int alloc_l3_table(struct pfn_info *page)
ASSERT( !shadow_mode_refcounts(d) );
- pl3e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl3e = map_domain_page(pfn);
for ( i = 0; i < L3_PAGETABLE_ENTRIES; i++ ) {
vaddr = i << L3_PAGETABLE_SHIFT;
if ( is_guest_l3_slot(i) &&
@@ -825,7 +825,7 @@ static int alloc_l3_table(struct pfn_info *page)
if (!fixup_pae_linear_mappings(pl3e))
goto fail;
- unmap_domain_mem(pl3e);
+ unmap_domain_page(pl3e);
return 1;
fail:
@@ -833,7 +833,7 @@ static int alloc_l3_table(struct pfn_info *page)
if ( is_guest_l3_slot(i) )
put_page_from_l3e(pl3e[i], pfn);
- unmap_domain_mem(pl3e);
+ unmap_domain_page(pl3e);
return 0;
}
@@ -891,13 +891,13 @@ static void free_l1_table(struct pfn_info *page)
l1_pgentry_t *pl1e;
int i;
- pl1e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl1e = map_domain_page(pfn);
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
if ( is_guest_l1_slot(i) )
put_page_from_l1e(pl1e[i], d);
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
}
@@ -907,14 +907,14 @@ static void free_l2_table(struct pfn_info *page)
l2_pgentry_t *pl2e;
int i;
- pl2e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl2e = map_domain_page(pfn);
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ ) {
if ( is_guest_l2_slot(page->u.inuse.type_info, i) )
put_page_from_l2e(pl2e[i], pfn);
}
- unmap_domain_mem(pl2e);
+ unmap_domain_page(pl2e);
}
@@ -926,13 +926,13 @@ static void free_l3_table(struct pfn_info *page)
l3_pgentry_t *pl3e;
int i;
- pl3e = map_domain_mem(pfn << PAGE_SHIFT);
+ pl3e = map_domain_page(pfn);
for ( i = 0; i < L3_PAGETABLE_ENTRIES; i++ )
if ( is_guest_l3_slot(i) )
put_page_from_l3e(pl3e[i], pfn);
- unmap_domain_mem(pl3e);
+ unmap_domain_page(pl3e);
}
#endif
@@ -2011,7 +2011,8 @@ int do_mmu_update(
break;
}
- va = map_domain_mem_with_cache(req.ptr, &mapcache);
+ va = map_domain_page_with_cache(mfn, &mapcache);
+ va = (void *)((unsigned long)va + (req.ptr & ~PAGE_MASK));
page = &frame_table[mfn];
switch ( (type_info = page->u.inuse.type_info) & PGT_type_mask )
@@ -2105,7 +2106,7 @@ int do_mmu_update(
break;
}
- unmap_domain_mem_with_cache(va, &mapcache);
+ unmap_domain_page_with_cache(va, &mapcache);
put_page(page);
break;
@@ -2452,6 +2453,7 @@ long do_update_descriptor(unsigned long pa, u64 desc)
struct domain *dom = current->domain;
unsigned long gpfn = pa >> PAGE_SHIFT;
unsigned long mfn;
+ unsigned int offset = (pa & ~PAGE_MASK) / sizeof(struct desc_struct);
struct desc_struct *gdt_pent, d;
struct pfn_info *page;
long ret = -EINVAL;
@@ -2460,18 +2462,18 @@ long do_update_descriptor(unsigned long pa, u64 desc)
LOCK_BIGLOCK(dom);
- if ( !VALID_MFN(mfn = __gpfn_to_mfn(dom, gpfn)) ) {
- UNLOCK_BIGLOCK(dom);
- return -EINVAL;
- }
-
- if ( (pa & 7) || (mfn >= max_page) || !check_descriptor(&d) ) {
+ if ( !VALID_MFN(mfn = __gpfn_to_mfn(dom, gpfn)) ||
+ ((pa % sizeof(struct desc_struct)) != 0) ||
+ (mfn >= max_page) ||
+ !check_descriptor(&d) )
+ {
UNLOCK_BIGLOCK(dom);
return -EINVAL;
}
page = &frame_table[mfn];
- if ( unlikely(!get_page(page, dom)) ) {
+ if ( unlikely(!get_page(page, dom)) )
+ {
UNLOCK_BIGLOCK(dom);
return -EINVAL;
}
@@ -2505,9 +2507,9 @@ long do_update_descriptor(unsigned long pa, u64 desc)
}
/* All is good so make the update. */
- gdt_pent = map_domain_mem((mfn << PAGE_SHIFT) | (pa & ~PAGE_MASK));
- memcpy(gdt_pent, &d, 8);
- unmap_domain_mem(gdt_pent);
+ gdt_pent = map_domain_page(mfn);
+ memcpy(&gdt_pent[offset], &d, 8);
+ unmap_domain_page(gdt_pent);
if ( shadow_mode_enabled(dom) )
shadow_unlock(dom);
@@ -2650,7 +2652,7 @@ void ptwr_flush(struct domain *d, const int which)
pl1e = d->arch.ptwr[which].pl1e;
modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page);
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
perfc_incr_histo(wpt_updates, modified, PT_UPDATES);
d->arch.ptwr[which].prev_nr_updates = modified;
@@ -2741,13 +2743,14 @@ static int ptwr_emulated_update(
return X86EMUL_UNHANDLEABLE;
/* Checked successfully: do the update (write or cmpxchg). */
- pl1e = map_domain_mem(page_to_phys(page) + (addr & ~PAGE_MASK));
+ pl1e = map_domain_page(page_to_pfn(page));
+ pl1e = (l1_pgentry_t *)((unsigned long)pl1e + (addr & ~PAGE_MASK));
if ( do_cmpxchg )
{
ol1e = l1e_from_intpte(old);
if ( cmpxchg((unsigned long *)pl1e, old, val) != old )
{
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
put_page_from_l1e(nl1e, d);
return X86EMUL_CMPXCHG_FAILED;
}
@@ -2757,7 +2760,7 @@ static int ptwr_emulated_update(
ol1e = *pl1e;
*pl1e = nl1e;
}
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
/* Finally, drop the old PTE. */
put_page_from_l1e(ol1e, d);
@@ -2909,7 +2912,7 @@ int ptwr_do_page_fault(struct domain *d, unsigned long addr)
}
/* Temporarily map the L1 page, and make a copy of it. */
- d->arch.ptwr[which].pl1e = map_domain_mem(pfn << PAGE_SHIFT);
+ d->arch.ptwr[which].pl1e = map_domain_page(pfn);
memcpy(d->arch.ptwr[which].page,
d->arch.ptwr[which].pl1e,
L1_PAGETABLE_ENTRIES * sizeof(l1_pgentry_t));
@@ -2922,7 +2925,7 @@ int ptwr_do_page_fault(struct domain *d, unsigned long addr)
MEM_LOG("ptwr: Could not update pte at %p", (unsigned long *)
&linear_pg_table[addr>>PAGE_SHIFT]);
/* Toss the writable pagetable state and crash. */
- unmap_domain_mem(d->arch.ptwr[which].pl1e);
+ unmap_domain_page(d->arch.ptwr[which].pl1e);
d->arch.ptwr[which].l1va = 0;
domain_crash();
return 0;
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index c0db9f9c7d..913f3082be 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -11,13 +11,13 @@
#include <xen/serial.h>
#include <xen/trace.h>
#include <xen/multiboot.h>
+#include <xen/domain_page.h>
#include <asm/bitops.h>
#include <asm/smp.h>
#include <asm/processor.h>
#include <asm/mpspec.h>
#include <asm/apic.h>
#include <asm/desc.h>
-#include <asm/domain_page.h>
#include <asm/shadow.h>
#include <asm/e820.h>
diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
index 60683518d6..bac8f23ad6 100644
--- a/xen/arch/x86/shadow.c
+++ b/xen/arch/x86/shadow.c
@@ -23,8 +23,8 @@
#include <xen/config.h>
#include <xen/types.h>
#include <xen/mm.h>
+#include <xen/domain_page.h>
#include <asm/shadow.h>
-#include <asm/domain_page.h>
#include <asm/page.h>
#include <xen/event.h>
#include <xen/sched.h>
@@ -222,9 +222,9 @@ alloc_shadow_page(struct domain *d,
else
{
page = alloc_domheap_page(NULL);
- void *l1 = map_domain_mem(page_to_phys(page));
+ void *l1 = map_domain_page(page_to_pfn(page));
memset(l1, 0, PAGE_SIZE);
- unmap_domain_mem(l1);
+ unmap_domain_page(l1);
}
}
else
@@ -315,7 +315,7 @@ alloc_shadow_page(struct domain *d,
static void inline
free_shadow_l1_table(struct domain *d, unsigned long smfn)
{
- l1_pgentry_t *pl1e = map_domain_mem(smfn << PAGE_SHIFT);
+ l1_pgentry_t *pl1e = map_domain_page(smfn);
int i;
struct pfn_info *spage = pfn_to_page(smfn);
u32 min_max = spage->tlbflush_timestamp;
@@ -328,13 +328,13 @@ free_shadow_l1_table(struct domain *d, unsigned long smfn)
pl1e[i] = l1e_empty();
}
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
}
static void inline
free_shadow_hl2_table(struct domain *d, unsigned long smfn)
{
- l1_pgentry_t *hl2 = map_domain_mem(smfn << PAGE_SHIFT);
+ l1_pgentry_t *hl2 = map_domain_page(smfn);
int i, limit;
SH_VVLOG("%s: smfn=%lx freed", __func__, smfn);
@@ -354,13 +354,13 @@ free_shadow_hl2_table(struct domain *d, unsigned long smfn)
put_page(pfn_to_page(l1e_get_pfn(hl2[i])));
}
- unmap_domain_mem(hl2);
+ unmap_domain_page(hl2);
}
static void inline
free_shadow_l2_table(struct domain *d, unsigned long smfn, unsigned int type)
{
- l2_pgentry_t *pl2e = map_domain_mem(smfn << PAGE_SHIFT);
+ l2_pgentry_t *pl2e = map_domain_page(smfn);
int i, external = shadow_mode_external(d);
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
@@ -376,7 +376,7 @@ free_shadow_l2_table(struct domain *d, unsigned long smfn, unsigned int type)
put_shadow_ref(l2e_get_pfn(pl2e[l2_table_offset(LINEAR_PT_VIRT_START)]));
}
- unmap_domain_mem(pl2e);
+ unmap_domain_page(pl2e);
}
void free_shadow_page(unsigned long smfn)
@@ -689,8 +689,8 @@ static void alloc_monitor_pagetable(struct vcpu *v)
mmfn_info = alloc_domheap_page(NULL);
ASSERT(mmfn_info != NULL);
- mmfn = (unsigned long) (mmfn_info - frame_table);
- mpl2e = (l2_pgentry_t *) map_domain_mem(mmfn << PAGE_SHIFT);
+ mmfn = page_to_pfn(mmfn_info);
+ mpl2e = (l2_pgentry_t *)map_domain_page(mmfn);
memset(mpl2e, 0, PAGE_SIZE);
#ifdef __i386__ /* XXX screws x86/64 build */
@@ -749,7 +749,7 @@ void free_monitor_pagetable(struct vcpu *v)
put_shadow_ref(mfn);
}
- unmap_domain_mem(mpl2e);
+ unmap_domain_page(mpl2e);
/*
* Then free monitor_table.
@@ -766,37 +766,37 @@ set_p2m_entry(struct domain *d, unsigned long pfn, unsigned long mfn,
struct domain_mmap_cache *l2cache,
struct domain_mmap_cache *l1cache)
{
- unsigned long phystab = pagetable_get_paddr(d->arch.phys_table);
+ unsigned long tabpfn = pagetable_get_pfn(d->arch.phys_table);
l2_pgentry_t *l2, l2e;
l1_pgentry_t *l1;
struct pfn_info *l1page;
unsigned long va = pfn << PAGE_SHIFT;
- ASSERT( phystab );
+ ASSERT(tabpfn != 0);
- l2 = map_domain_mem_with_cache(phystab, l2cache);
+ l2 = map_domain_page_with_cache(tabpfn, l2cache);
l2e = l2[l2_table_offset(va)];
if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
{
l1page = alloc_domheap_page(NULL);
if ( !l1page )
{
- unmap_domain_mem_with_cache(l2, l2cache);
+ unmap_domain_page_with_cache(l2, l2cache);
return 0;
}
- l1 = map_domain_mem_with_cache(page_to_phys(l1page), l1cache);
+ l1 = map_domain_page_with_cache(page_to_pfn(l1page), l1cache);
memset(l1, 0, PAGE_SIZE);
- unmap_domain_mem_with_cache(l1, l1cache);
+ unmap_domain_page_with_cache(l1, l1cache);
l2e = l2e_from_page(l1page, __PAGE_HYPERVISOR);
l2[l2_table_offset(va)] = l2e;
}
- unmap_domain_mem_with_cache(l2, l2cache);
+ unmap_domain_page_with_cache(l2, l2cache);
- l1 = map_domain_mem_with_cache(l2e_get_paddr(l2e), l1cache);
+ l1 = map_domain_page_with_cache(l2e_get_pfn(l2e), l1cache);
l1[l1_table_offset(va)] = l1e_from_pfn(mfn, __PAGE_HYPERVISOR);
- unmap_domain_mem_with_cache(l1, l1cache);
+ unmap_domain_page_with_cache(l1, l1cache);
return 1;
}
@@ -818,9 +818,9 @@ alloc_p2m_table(struct domain *d)
domain_mmap_cache_init(&l2cache);
d->arch.phys_table = mk_pagetable(page_to_phys(l2page));
- l2 = map_domain_mem_with_cache(page_to_phys(l2page), &l2cache);
+ l2 = map_domain_page_with_cache(page_to_pfn(l2page), &l2cache);
memset(l2, 0, PAGE_SIZE);
- unmap_domain_mem_with_cache(l2, &l2cache);
+ unmap_domain_page_with_cache(l2, &l2cache);
list_ent = d->page_list.next;
while ( list_ent != &d->page_list )
@@ -888,7 +888,7 @@ int __shadow_mode_enable(struct domain *d, unsigned int mode)
if ( v->arch.guest_vtable &&
(v->arch.guest_vtable != __linear_l2_table) )
{
- unmap_domain_mem(v->arch.guest_vtable);
+ unmap_domain_page(v->arch.guest_vtable);
}
if ( (mode & (SHM_translate | SHM_external)) == SHM_translate )
v->arch.guest_vtable = __linear_l2_table;
@@ -901,7 +901,7 @@ int __shadow_mode_enable(struct domain *d, unsigned int mode)
if ( v->arch.shadow_vtable &&
(v->arch.shadow_vtable != __shadow_linear_l2_table) )
{
- unmap_domain_mem(v->arch.shadow_vtable);
+ unmap_domain_page(v->arch.shadow_vtable);
}
if ( !(mode & SHM_external) )
v->arch.shadow_vtable = __shadow_linear_l2_table;
@@ -914,7 +914,7 @@ int __shadow_mode_enable(struct domain *d, unsigned int mode)
if ( v->arch.hl2_vtable &&
(v->arch.hl2_vtable != __linear_hl2_table) )
{
- unmap_domain_mem(v->arch.hl2_vtable);
+ unmap_domain_page(v->arch.hl2_vtable);
}
if ( (mode & (SHM_translate | SHM_external)) == SHM_translate )
v->arch.hl2_vtable = __linear_hl2_table;
@@ -1073,7 +1073,7 @@ translate_l1pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l1mfn)
int i;
l1_pgentry_t *l1;
- l1 = map_domain_mem(l1mfn << PAGE_SHIFT);
+ l1 = map_domain_page(l1mfn);
for (i = 0; i < L1_PAGETABLE_ENTRIES; i++)
{
if ( is_guest_l1_slot(i) &&
@@ -1085,7 +1085,7 @@ translate_l1pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l1mfn)
l1[i] = l1e_from_pfn(gpfn, l1e_get_flags(l1[i]));
}
}
- unmap_domain_mem(l1);
+ unmap_domain_page(l1);
}
// This is not general enough to handle arbitrary pagetables
@@ -1101,7 +1101,7 @@ translate_l2pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn,
ASSERT(shadow_mode_translate(d) && !shadow_mode_external(d));
- l2 = map_domain_mem(l2mfn << PAGE_SHIFT);
+ l2 = map_domain_page(l2mfn);
for (i = 0; i < L2_PAGETABLE_ENTRIES; i++)
{
if ( is_guest_l2_slot(type, i) &&
@@ -1114,7 +1114,7 @@ translate_l2pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn,
translate_l1pgtable(d, p2m, mfn);
}
}
- unmap_domain_mem(l2);
+ unmap_domain_page(l2);
}
static void free_shadow_ht_entries(struct domain *d)
@@ -1404,24 +1404,23 @@ gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn)
perfc_incrc(gpfn_to_mfn_foreign);
unsigned long va = gpfn << PAGE_SHIFT;
- unsigned long phystab = pagetable_get_paddr(d->arch.phys_table);
- l2_pgentry_t *l2 = map_domain_mem(phystab);
+ unsigned long tabpfn = pagetable_get_pfn(d->arch.phys_table);
+ l2_pgentry_t *l2 = map_domain_page(tabpfn);
l2_pgentry_t l2e = l2[l2_table_offset(va)];
- unmap_domain_mem(l2);
+ unmap_domain_page(l2);
if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
{
printk("gpfn_to_mfn_foreign(d->id=%d, gpfn=%lx) => 0 l2e=%" PRIpte "\n",
d->domain_id, gpfn, l2e_get_intpte(l2e));
return INVALID_MFN;
}
- unsigned long l1tab = l2e_get_paddr(l2e);
- l1_pgentry_t *l1 = map_domain_mem(l1tab);
+ l1_pgentry_t *l1 = map_domain_page(l2e_get_pfn(l2e));
l1_pgentry_t l1e = l1[l1_table_offset(va)];
- unmap_domain_mem(l1);
+ unmap_domain_page(l1);
#if 0
- printk("gpfn_to_mfn_foreign(d->id=%d, gpfn=%lx) => %lx phystab=%lx l2e=%lx l1tab=%lx, l1e=%lx\n",
- d->domain_id, gpfn, l1_pgentry_val(l1e) >> PAGE_SHIFT, phystab, l2e, l1tab, l1e);
+ printk("gpfn_to_mfn_foreign(d->id=%d, gpfn=%lx) => %lx tabpfn=%lx l2e=%lx l1tab=%lx, l1e=%lx\n",
+ d->domain_id, gpfn, l1_pgentry_val(l1e) >> PAGE_SHIFT, tabpfn, l2e, l1tab, l1e);
#endif
if ( !(l1e_get_flags(l1e) & _PAGE_PRESENT) )
@@ -1455,7 +1454,7 @@ shadow_hl2_table(struct domain *d, unsigned long gpfn, unsigned long gmfn,
gpfn, gmfn, smfn, hl2mfn);
perfc_incrc(shadow_hl2_table_count);
- hl2 = map_domain_mem(hl2mfn << PAGE_SHIFT);
+ hl2 = map_domain_page(hl2mfn);
#ifdef __i386__
if ( shadow_mode_external(d) )
@@ -1483,7 +1482,7 @@ shadow_hl2_table(struct domain *d, unsigned long gpfn, unsigned long gmfn,
l1e_from_pfn(hl2mfn, __PAGE_HYPERVISOR);
}
- unmap_domain_mem(hl2);
+ unmap_domain_page(hl2);
return hl2mfn;
}
@@ -1510,7 +1509,7 @@ static unsigned long shadow_l2_table(
BUG(); /* XXX Deal gracefully with failure. */
}
- spl2e = (l2_pgentry_t *)map_domain_mem(smfn << PAGE_SHIFT);
+ spl2e = (l2_pgentry_t *)map_domain_page(smfn);
/* Install hypervisor and 2x linear p.t. mapings. */
if ( (PGT_base_page_table == PGT_l2_page_table) &&
@@ -1565,7 +1564,7 @@ static unsigned long shadow_l2_table(
memset(spl2e, 0, L2_PAGETABLE_ENTRIES*sizeof(l2_pgentry_t));
}
- unmap_domain_mem(spl2e);
+ unmap_domain_page(spl2e);
SH_VLOG("shadow_l2_table(%lx -> %lx)", gmfn, smfn);
return smfn;
@@ -1776,11 +1775,11 @@ shadow_make_snapshot(
min *= sizeof(l1_pgentry_t);
length *= sizeof(l1_pgentry_t);
- original = map_domain_mem(gmfn << PAGE_SHIFT);
- snapshot = map_domain_mem(smfn << PAGE_SHIFT);
+ original = map_domain_page(gmfn);
+ snapshot = map_domain_page(smfn);
memcpy(snapshot + min, original + min, length);
- unmap_domain_mem(original);
- unmap_domain_mem(snapshot);
+ unmap_domain_page(original);
+ unmap_domain_page(snapshot);
return smfn;
}
@@ -1800,9 +1799,9 @@ shadow_free_snapshot(struct domain *d, struct out_of_sync_entry *entry)
// XXX Need to think about how to protect the domain's
// information less expensively.
//
- snapshot = map_domain_mem(entry->snapshot_mfn << PAGE_SHIFT);
+ snapshot = map_domain_page(entry->snapshot_mfn);
memset(snapshot, 0, PAGE_SIZE);
- unmap_domain_mem(snapshot);
+ unmap_domain_page(snapshot);
put_shadow_ref(entry->snapshot_mfn);
}
@@ -1915,7 +1914,7 @@ static int snapshot_entry_matches(
if ( !smfn )
return 0;
- snapshot = map_domain_mem(smfn << PAGE_SHIFT);
+ snapshot = map_domain_page(smfn);
// This could probably be smarter, but this is sufficent for
// our current needs.
@@ -1923,7 +1922,7 @@ static int snapshot_entry_matches(
entries_match = !l1e_has_changed(guest_pt[index], snapshot[index],
PAGE_FLAG_MASK);
- unmap_domain_mem(snapshot);
+ unmap_domain_page(snapshot);
#ifdef PERF_COUNTERS
if ( entries_match )
@@ -2065,7 +2064,7 @@ static u32 remove_all_write_access_in_ptpage(
unsigned long readonly_gpfn, unsigned long readonly_gmfn,
u32 max_refs_to_find, unsigned long prediction)
{
- l1_pgentry_t *pt = map_domain_mem(pt_mfn << PAGE_SHIFT);
+ l1_pgentry_t *pt = map_domain_page(pt_mfn);
l1_pgentry_t match;
unsigned long flags = _PAGE_RW | _PAGE_PRESENT;
int i;
@@ -2105,7 +2104,7 @@ static u32 remove_all_write_access_in_ptpage(
{
perfc_incrc(remove_write_fast_exit);
increase_writable_pte_prediction(d, readonly_gpfn, prediction);
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
return found;
}
@@ -2115,7 +2114,7 @@ static u32 remove_all_write_access_in_ptpage(
break;
}
- unmap_domain_mem(pt);
+ unmap_domain_page(pt);
return found;
#undef MATCH_ENTRY
@@ -2207,7 +2206,7 @@ int shadow_remove_all_write_access(
static u32 remove_all_access_in_page(
struct domain *d, unsigned long l1mfn, unsigned long forbidden_gmfn)
{
- l1_pgentry_t *pl1e = map_domain_mem(l1mfn << PAGE_SHIFT);
+ l1_pgentry_t *pl1e = map_domain_page(l1mfn);
l1_pgentry_t match;
unsigned long flags = _PAGE_PRESENT;
int i;
@@ -2233,7 +2232,7 @@ static u32 remove_all_access_in_page(
}
}
- unmap_domain_mem(pl1e);
+ unmap_domain_page(pl1e);
return count;
}
@@ -2321,11 +2320,11 @@ static int resync_all(struct domain *d, u32 stype)
// Compare guest's new contents to its snapshot, validating
// and updating its shadow as appropriate.
//
- guest = map_domain_mem(entry->gmfn << PAGE_SHIFT);
- snapshot = map_domain_mem(entry->snapshot_mfn << PAGE_SHIFT);
+ guest = map_domain_page(entry->gmfn);
+ snapshot = map_domain_page(entry->snapshot_mfn);
if ( smfn )
- shadow = map_domain_mem(smfn << PAGE_SHIFT);
+ shadow = map_domain_page(smfn);
else
shadow = NULL;
@@ -2466,9 +2465,9 @@ static int resync_all(struct domain *d, u32 stype)
}
if ( smfn )
- unmap_domain_mem(shadow);
- unmap_domain_mem(snapshot);
- unmap_domain_mem(guest);
+ unmap_domain_page(shadow);
+ unmap_domain_page(snapshot);
+ unmap_domain_page(guest);
if ( unlikely(unshadow) )
{
@@ -2507,7 +2506,9 @@ void __shadow_sync_all(struct domain *d)
if ( entry->writable_pl1e & (sizeof(l1_pgentry_t)-1) )
continue;
- l1_pgentry_t *ppte = map_domain_mem(entry->writable_pl1e);
+ l1_pgentry_t *ppte = (l1_pgentry_t *)(
+ (char *)map_domain_page(entry->writable_pl1e >> PAGE_SHIFT) +
+ (entry->writable_pl1e & ~PAGE_MASK));
l1_pgentry_t opte = *ppte;
l1_pgentry_t npte = opte;
l1e_remove_flags(npte, _PAGE_RW);
@@ -2518,7 +2519,7 @@ void __shadow_sync_all(struct domain *d)
*ppte = npte;
shadow_put_page_from_l1e(opte, d);
- unmap_domain_mem(ppte);
+ unmap_domain_page(ppte);
}
// XXX mafetter: SMP
@@ -2696,9 +2697,9 @@ void shadow_l1_normal_pt_update(
(void *)pa, l1e_get_intpte(gpte));
l1pte_propagate_from_guest(current->domain, gpte, &spte);
- spl1e = map_domain_mem_with_cache(sl1mfn << PAGE_SHIFT, cache);
+ spl1e = map_domain_page_with_cache(sl1mfn, cache);
spl1e[(pa & ~PAGE_MASK) / sizeof(l1_pgentry_t)] = spte;
- unmap_domain_mem_with_cache(spl1e, cache);
+ unmap_domain_page_with_cache(spl1e, cache);
}
shadow_unlock(d);
@@ -2719,10 +2720,10 @@ void shadow_l2_normal_pt_update(
{
SH_VVLOG("shadow_l2_normal_pt_update pa=%p, gpde=%" PRIpte,
(void *)pa, l2e_get_intpte(gpde));
- spl2e = map_domain_mem_with_cache(sl2mfn << PAGE_SHIFT, cache);
+ spl2e = map_domain_page_with_cache(sl2mfn, cache);
validate_pde_change(d, gpde,
&spl2e[(pa & ~PAGE_MASK) / sizeof(l2_pgentry_t)]);
- unmap_domain_mem_with_cache(spl2e, cache);
+ unmap_domain_page_with_cache(spl2e, cache);
}
shadow_unlock(d);
@@ -2831,8 +2832,8 @@ void __update_pagetables(struct vcpu *v)
if ( max_mode & (SHM_enable | SHM_external) )
{
if ( likely(v->arch.guest_vtable != NULL) )
- unmap_domain_mem(v->arch.guest_vtable);
- v->arch.guest_vtable = map_domain_mem(gmfn << PAGE_SHIFT);
+ unmap_domain_page(v->arch.guest_vtable);
+ v->arch.guest_vtable = map_domain_page(gmfn);
}
/*
@@ -2855,8 +2856,8 @@ void __update_pagetables(struct vcpu *v)
if ( max_mode == SHM_external )
{
if ( v->arch.shadow_vtable )
- unmap_domain_mem(v->arch.shadow_vtable);
- v->arch.shadow_vtable = map_domain_mem(smfn << PAGE_SHIFT);
+ unmap_domain_page(v->arch.shadow_vtable);
+ v->arch.shadow_vtable = map_domain_page(smfn);
}
/*
@@ -2871,8 +2872,8 @@ void __update_pagetables(struct vcpu *v)
if ( unlikely(!(hl2mfn = __shadow_status(d, gpfn, PGT_hl2_shadow))) )
hl2mfn = shadow_hl2_table(d, gpfn, gmfn, smfn);
if ( v->arch.hl2_vtable )
- unmap_domain_mem(v->arch.hl2_vtable);
- v->arch.hl2_vtable = map_domain_mem(hl2mfn << PAGE_SHIFT);
+ unmap_domain_page(v->arch.hl2_vtable);
+ v->arch.hl2_vtable = map_domain_page(hl2mfn);
}
/*
@@ -2934,22 +2935,22 @@ mark_shadows_as_reflecting_snapshot(struct domain *d, unsigned long gpfn)
if ( (smfn = __shadow_status(d, gpfn, PGT_l1_shadow)) )
{
- l1e = map_domain_mem(smfn << PAGE_SHIFT);
+ l1e = map_domain_page(smfn);
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
if ( is_guest_l1_slot(i) &&
(l1e_get_flags(l1e[i]) & _PAGE_PRESENT) )
l1e_add_flags(l1e[i], SHADOW_REFLECTS_SNAPSHOT);
- unmap_domain_mem(l1e);
+ unmap_domain_page(l1e);
}
if ( (smfn = __shadow_status(d, gpfn, PGT_l2_shadow)) )
{
- l2e = map_domain_mem(smfn << PAGE_SHIFT);
+ l2e = map_domain_page(smfn);
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
if ( is_guest_l2_slot(0, i) &&
(l2e_get_flags(l2e[i]) & _PAGE_PRESENT) )
l2e_add_flags(l2e[i], SHADOW_REFLECTS_SNAPSHOT);
- unmap_domain_mem(l2e);
+ unmap_domain_page(l2e);
}
}
@@ -3117,21 +3118,21 @@ static int check_l1_table(
{
snapshot_mfn = __shadow_status(d, gpfn, PGT_snapshot);
ASSERT(snapshot_mfn);
- p_snapshot = map_domain_mem(snapshot_mfn << PAGE_SHIFT);
+ p_snapshot = map_domain_page(snapshot_mfn);
}
- p_guest = map_domain_mem(gmfn << PAGE_SHIFT);
- p_shadow = map_domain_mem(smfn << PAGE_SHIFT);
+ p_guest = map_domain_page(gmfn);
+ p_shadow = map_domain_page(smfn);
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
errors += check_pte(v, p_guest+i, p_shadow+i,
p_snapshot ? p_snapshot+i : NULL,
1, l2_idx, i);
- unmap_domain_mem(p_shadow);
- unmap_domain_mem(p_guest);
+ unmap_domain_page(p_shadow);
+ unmap_domain_page(p_guest);
if ( p_snapshot )
- unmap_domain_mem(p_snapshot);
+ unmap_domain_page(p_snapshot);
return errors;
}
@@ -3146,8 +3147,8 @@ int check_l2_table(
struct vcpu *v, unsigned long gmfn, unsigned long smfn, int oos_pdes)
{
struct domain *d = v->domain;
- l2_pgentry_t *gpl2e = (l2_pgentry_t *)map_domain_mem(gmfn << PAGE_SHIFT);
- l2_pgentry_t *spl2e = (l2_pgentry_t *)map_domain_mem(smfn << PAGE_SHIFT);
+ l2_pgentry_t *gpl2e = (l2_pgentry_t *)map_domain_page(gmfn);
+ l2_pgentry_t *spl2e = (l2_pgentry_t *)map_domain_page(smfn);
l2_pgentry_t match;
int i;
int errors = 0;
@@ -3219,8 +3220,8 @@ int check_l2_table(
NULL,
2, i, 0);
- unmap_domain_mem(spl2e);
- unmap_domain_mem(gpl2e);
+ unmap_domain_page(spl2e);
+ unmap_domain_page(gpl2e);
#if 1
if ( errors )
@@ -3267,8 +3268,8 @@ int _check_pagetable(struct vcpu *v, char *s)
errors += check_l2_table(v, ptbase_mfn, smfn, oos_pdes);
- gpl2e = (l2_pgentry_t *) map_domain_mem( ptbase_mfn << PAGE_SHIFT );
- spl2e = (l2_pgentry_t *) map_domain_mem( smfn << PAGE_SHIFT );
+ gpl2e = (l2_pgentry_t *) map_domain_page(ptbase_mfn);
+ spl2e = (l2_pgentry_t *) map_domain_page(smfn);
/* Go back and recurse. */
#ifdef __i386__
@@ -3292,8 +3293,8 @@ int _check_pagetable(struct vcpu *v, char *s)
}
}
- unmap_domain_mem(spl2e);
- unmap_domain_mem(gpl2e);
+ unmap_domain_page(spl2e);
+ unmap_domain_page(gpl2e);
#if 0
SH_VVLOG("PT verified : l2_present = %d, l1_present = %d",
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 9e9d82d130..cf7aaa3d19 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -39,8 +39,8 @@
#include <xen/irq.h>
#include <xen/perfc.h>
#include <xen/softirq.h>
+#include <xen/domain_page.h>
#include <asm/shadow.h>
-#include <asm/domain_page.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/atomic.h>
diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c
index 8aa476f3c6..deff128ea1 100644
--- a/xen/arch/x86/vmx.c
+++ b/xen/arch/x86/vmx.c
@@ -24,6 +24,7 @@
#include <xen/sched.h>
#include <xen/irq.h>
#include <xen/softirq.h>
+#include <xen/domain_page.h>
#include <asm/current.h>
#include <asm/io.h>
#include <asm/shadow.h>
@@ -102,7 +103,7 @@ void stop_vmx(void)
}
/*
- * Not all cases recevie valid value in the VM-exit instruction length field.
+ * Not all cases receive valid value in the VM-exit instruction length field.
*/
#define __get_instruction_length(len) \
__vmread(INSTRUCTION_LEN, &(len)); \
@@ -118,8 +119,6 @@ static void inline __update_guest_eip(unsigned long inst_len)
}
-#include <asm/domain_page.h>
-
static int vmx_do_page_fault(unsigned long va, struct cpu_user_regs *regs)
{
unsigned long eip;
@@ -468,23 +467,24 @@ enum { COPY_IN = 0, COPY_OUT };
static inline int
vmx_copy(void *buf, unsigned long laddr, int size, int dir)
{
- unsigned char *addr;
+ char *addr;
unsigned long mfn;
- if ((size + (laddr & (PAGE_SIZE - 1))) >= PAGE_SIZE) {
+ if ( (size + (laddr & (PAGE_SIZE - 1))) >= PAGE_SIZE )
+ {
printf("vmx_copy exceeds page boundary\n");
- return 0;
+ return 0;
}
mfn = phys_to_machine_mapping(laddr >> PAGE_SHIFT);
- addr = map_domain_mem((mfn << PAGE_SHIFT) | (laddr & ~PAGE_MASK));
+ addr = (char *)map_domain_page(mfn) + (laddr & ~PAGE_MASK);
if (dir == COPY_IN)
memcpy(buf, addr, size);
else
memcpy(addr, buf, size);
- unmap_domain_mem(addr);
+ unmap_domain_page(addr);
return 1;
}
diff --git a/xen/arch/x86/vmx_platform.c b/xen/arch/x86/vmx_platform.c
index 7d976a42e8..96e7572750 100644
--- a/xen/arch/x86/vmx_platform.c
+++ b/xen/arch/x86/vmx_platform.c
@@ -21,7 +21,7 @@
#include <xen/types.h>
#include <xen/mm.h>
#include <asm/shadow.h>
-#include <asm/domain_page.h>
+#include <xen/domain_page.h>
#include <asm/page.h>
#include <xen/event.h>
#include <xen/trace.h>
@@ -411,43 +411,41 @@ int inst_copy_from_guest(unsigned char *buf, unsigned long guest_eip,
{
l1_pgentry_t gpte;
unsigned long mfn;
- unsigned long ma;
- unsigned char * inst_start;
+ unsigned char *inst_start;
int remaining = 0;
- if (inst_len > MAX_INST_LEN || inst_len <= 0) {
+ if ( (inst_len > MAX_INST_LEN) || (inst_len <= 0) )
return 0;
- }
- if (vmx_paging_enabled(current)) {
+ if ( vmx_paging_enabled(current) )
+ {
gpte = gva_to_gpte(guest_eip);
mfn = phys_to_machine_mapping(l1e_get_pfn(gpte));
/* Does this cross a page boundary ? */
- if ((guest_eip & PAGE_MASK) != ((guest_eip + inst_len) & PAGE_MASK)) {
+ if ( (guest_eip & PAGE_MASK) != ((guest_eip + inst_len) & PAGE_MASK) )
+ {
remaining = (guest_eip + inst_len) & ~PAGE_MASK;
inst_len -= remaining;
}
-
- } else {
+ }
+ else
+ {
mfn = phys_to_machine_mapping(guest_eip >> PAGE_SHIFT);
}
- ma = (mfn << PAGE_SHIFT) | (guest_eip & (PAGE_SIZE - 1));
- inst_start = (unsigned char *)map_domain_mem(ma);
-
- memcpy((char *)buf, inst_start, inst_len);
- unmap_domain_mem(inst_start);
- if (remaining) {
+ inst_start = map_domain_page(mfn);
+ memcpy((char *)buf, inst_start + (guest_eip & ~PAGE_MASK), inst_len);
+ unmap_domain_page(inst_start);
+
+ if ( remaining )
+ {
gpte = gva_to_gpte(guest_eip+inst_len+remaining);
mfn = phys_to_machine_mapping(l1e_get_pfn(gpte));
-
- ma = (mfn << PAGE_SHIFT);
- inst_start = (unsigned char *)map_domain_mem(ma);
-
+ inst_start = map_domain_page(mfn);
memcpy((char *)buf+inst_len, inst_start, remaining);
- unmap_domain_mem(inst_start);
-
+ unmap_domain_page(inst_start);
}
+
return inst_len+remaining;
}
diff --git a/xen/arch/x86/vmx_vmcs.c b/xen/arch/x86/vmx_vmcs.c
index fa01316aa2..c27daedc48 100644
--- a/xen/arch/x86/vmx_vmcs.c
+++ b/xen/arch/x86/vmx_vmcs.c
@@ -22,7 +22,7 @@
#include <xen/mm.h>
#include <xen/lib.h>
#include <xen/errno.h>
-
+#include <xen/domain_page.h>
#include <asm/current.h>
#include <asm/cpufeature.h>
#include <asm/processor.h>
@@ -31,7 +31,6 @@
#include <xen/event.h>
#include <xen/kernel.h>
#include <public/io/ioreq.h>
-#include <asm/domain_page.h>
#ifdef CONFIG_VMX
@@ -122,8 +121,9 @@ int vmx_setup_platform(struct vcpu *d, struct cpu_user_regs *regs)
addr = regs->edi;
offset = (addr & ~PAGE_MASK);
addr = round_pgdown(addr);
+
mpfn = phys_to_machine_mapping(addr >> PAGE_SHIFT);
- p = map_domain_mem(mpfn << PAGE_SHIFT);
+ p = map_domain_page(mpfn);
e820p = (struct e820entry *) ((unsigned long) p + offset);
@@ -131,28 +131,28 @@ int vmx_setup_platform(struct vcpu *d, struct cpu_user_regs *regs)
print_e820_memory_map(e820p, n);
#endif
- for (i = 0; i < n; i++) {
- if (e820p[i].type == E820_SHARED_PAGE) {
+ for ( i = 0; i < n; i++ )
+ {
+ if ( e820p[i].type == E820_SHARED_PAGE )
+ {
gpfn = (e820p[i].addr >> PAGE_SHIFT);
break;
}
}
- if (gpfn == 0) {
- printk("No shared Page ?\n");
- unmap_domain_mem(p);
+ if ( gpfn == 0 )
+ {
+ unmap_domain_page(p);
return -1;
}
- unmap_domain_mem(p);
- mpfn = phys_to_machine_mapping(gpfn);
- p = map_domain_mem(mpfn << PAGE_SHIFT);
- ASSERT(p != NULL);
+ unmap_domain_page(p);
/* Initialise shared page */
+ mpfn = phys_to_machine_mapping(gpfn);
+ p = map_domain_page(mpfn);
memset(p, 0, PAGE_SIZE);
-
- d->arch.arch_vmx.vmx_platform.shared_page_va = (unsigned long) p;
+ d->arch.arch_vmx.vmx_platform.shared_page_va = (unsigned long)p;
return 0;
}
diff --git a/xen/arch/x86/x86_32/domain_page.c b/xen/arch/x86/x86_32/domain_page.c
index c1a0172462..6bec96bc87 100644
--- a/xen/arch/x86/x86_32/domain_page.c
+++ b/xen/arch/x86/x86_32/domain_page.c
@@ -15,16 +15,19 @@
#include <xen/sched.h>
#include <xen/mm.h>
#include <xen/perfc.h>
+#include <xen/domain_page.h>
#include <asm/current.h>
-#include <asm/domain_page.h>
#include <asm/flushtlb.h>
#include <asm/hardirq.h>
+#define MAPCACHE_ORDER 10
+#define MAPCACHE_ENTRIES (1 << MAPCACHE_ORDER)
+
l1_pgentry_t *mapcache;
static unsigned int map_idx, epoch, shadow_epoch[NR_CPUS];
static spinlock_t map_lock = SPIN_LOCK_UNLOCKED;
-void *map_domain_mem(unsigned long pa)
+void *map_domain_page(unsigned long pfn)
{
unsigned long va;
unsigned int idx, cpu = smp_processor_id();
@@ -34,7 +37,7 @@ void *map_domain_mem(unsigned long pa)
#endif
ASSERT(!in_irq());
- perfc_incrc(map_domain_mem_count);
+ perfc_incrc(map_domain_page_count);
spin_lock(&map_lock);
@@ -58,15 +61,15 @@ void *map_domain_mem(unsigned long pa)
}
while ( l1e_get_flags(cache[idx]) & _PAGE_PRESENT );
- cache[idx] = l1e_from_paddr(pa & PAGE_MASK, __PAGE_HYPERVISOR);
+ cache[idx] = l1e_from_pfn(pfn, __PAGE_HYPERVISOR);
spin_unlock(&map_lock);
- va = MAPCACHE_VIRT_START + (idx << PAGE_SHIFT) + (pa & ~PAGE_MASK);
+ va = MAPCACHE_VIRT_START + (idx << PAGE_SHIFT);
return (void *)va;
}
-void unmap_domain_mem(void *va)
+void unmap_domain_page(void *va)
{
unsigned int idx;
ASSERT((void *)MAPCACHE_VIRT_START <= va);
diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c
index 99dd178fea..686064baa4 100644
--- a/xen/arch/x86/x86_32/mm.c
+++ b/xen/arch/x86/x86_32/mm.c
@@ -22,11 +22,13 @@
#include <xen/lib.h>
#include <xen/init.h>
#include <xen/mm.h>
+#include <xen/sched.h>
#include <asm/current.h>
#include <asm/page.h>
#include <asm/flushtlb.h>
#include <asm/fixmap.h>
-#include <asm/domain_page.h>
+
+extern l1_pgentry_t *mapcache;
unsigned int PAGE_HYPERVISOR = __PAGE_HYPERVISOR;
unsigned int PAGE_HYPERVISOR_NOCACHE = __PAGE_HYPERVISOR_NOCACHE;
diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c
index 4221c18c7e..216af3854a 100644
--- a/xen/common/dom0_ops.c
+++ b/xen/common/dom0_ops.c
@@ -10,15 +10,15 @@
#include <xen/types.h>
#include <xen/lib.h>
#include <xen/mm.h>
-#include <public/dom0_ops.h>
#include <xen/sched.h>
#include <xen/domain.h>
#include <xen/event.h>
-#include <asm/domain_page.h>
+#include <xen/domain_page.h>
#include <xen/trace.h>
#include <xen/console.h>
-#include <public/sched_ctl.h>
#include <asm/current.h>
+#include <public/dom0_ops.h>
+#include <public/sched_ctl.h>
extern long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op);
extern void arch_getdomaininfo_ctxt(
diff --git a/xen/common/dom_mem_ops.c b/xen/common/dom_mem_ops.c
index 9e974be44d..ad53b91d1c 100644
--- a/xen/common/dom_mem_ops.c
+++ b/xen/common/dom_mem_ops.c
@@ -15,7 +15,6 @@
#include <xen/event.h>
#include <xen/shadow.h>
#include <asm/current.h>
-#include <asm/domain_page.h>
#include <asm/hardirq.h>
/*
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 127c57fe17..5c5214926c 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -15,9 +15,9 @@
#include <xen/time.h>
#include <xen/console.h>
#include <xen/softirq.h>
-#include <public/dom0_ops.h>
-#include <asm/domain_page.h>
+#include <xen/domain_page.h>
#include <asm/debugger.h>
+#include <public/dom0_ops.h>
/* Both these structures are protected by the domlist_lock. */
rwlock_t domlist_lock = RW_LOCK_UNLOCKED;
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index d2524ba009..610fbdb020 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -31,7 +31,7 @@
#include <xen/irq.h>
#include <xen/softirq.h>
#include <xen/shadow.h>
-#include <asm/domain_page.h>
+#include <xen/domain_page.h>
#include <asm/page.h>
/*
@@ -383,9 +383,9 @@ void scrub_heap_pages(void)
}
else
{
- p = map_domain_mem(pfn << PAGE_SHIFT);
+ p = map_domain_page(pfn);
clear_page(p);
- unmap_domain_mem(p);
+ unmap_domain_page(p);
}
}
@@ -674,9 +674,9 @@ static void page_scrub_softirq(void)
{
pg = list_entry(ent, struct pfn_info, list);
ent = ent->prev;
- p = map_domain_mem(page_to_phys(pg));
+ p = map_domain_page(page_to_pfn(pg));
clear_page(p);
- unmap_domain_mem(p);
+ unmap_domain_page(p);
free_heap_pages(MEMZONE_DOM, pg, 0);
}
} while ( (NOW() - start) < MILLISECS(1) );
diff --git a/xen/include/asm-ia64/domain_page.h b/xen/include/asm-ia64/domain_page.h
deleted file mode 100644
index d131576267..0000000000
--- a/xen/include/asm-ia64/domain_page.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/******************************************************************************
- * domain_page.h
- *
- * This is a trivial no-op on ia64, where we can 1:1 map all RAM.
- */
-
-#ifndef __ASM_DOMAIN_PAGE_H__
-#define __ASM_DOMAIN_PAGE_H__
-
-#define map_domain_mem(_pa) phys_to_virt(_pa)
-#define unmap_domain_mem(_va) ((void)(_va))
-
-#endif /* __ASM_DOMAIN_PAGE_H__ */
-
diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
index 48fe47a953..bf196d0b17 100644
--- a/xen/include/asm-x86/config.h
+++ b/xen/include/asm-x86/config.h
@@ -189,7 +189,8 @@ extern unsigned long _end; /* standard ELF symbol */
#elif defined(__i386__)
-#define CONFIG_X86_32 1
+#define CONFIG_X86_32 1
+#define CONFIG_DOMAIN_PAGE 1
#define asmlinkage __attribute__((regparm(0)))
@@ -198,7 +199,7 @@ extern unsigned long _end; /* standard ELF symbol */
* ------ ------
* I/O remapping area ( 4MB)
* Direct-map (1:1) area [Xen code/data/heap] (12MB)
- * map_domain_mem cache ( 4MB)
+ * map_domain_page cache ( 4MB)
* Per-domain mappings ( 4MB)
* Shadow linear pagetable ( 4MB) ( 8MB)
* Guest linear pagetable ( 4MB) ( 8MB)
diff --git a/xen/include/asm-x86/domain_page.h b/xen/include/asm-x86/domain_page.h
deleted file mode 100644
index 3eae53933d..0000000000
--- a/xen/include/asm-x86/domain_page.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __x86_64__
-#include <asm/x86_64/domain_page.h>
-#else
-#include <asm/x86_32/domain_page.h>
-#endif
diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
index 08c4339f16..e4788054e0 100644
--- a/xen/include/asm-x86/shadow.h
+++ b/xen/include/asm-x86/shadow.h
@@ -27,14 +27,12 @@
#include <xen/perfc.h>
#include <xen/sched.h>
#include <xen/mm.h>
+#include <xen/domain_page.h>
#include <asm/current.h>
#include <asm/flushtlb.h>
#include <asm/processor.h>
-#include <asm/domain_page.h>
-#include <public/dom0_ops.h>
-#ifdef CONFIG_VMX
#include <asm/vmx.h>
-#endif
+#include <public/dom0_ops.h>
/* Shadow PT operation mode : shadow-mode variable in arch_domain. */
diff --git a/xen/include/asm-x86/x86_32/domain_page.h b/xen/include/asm-x86/x86_32/domain_page.h
deleted file mode 100644
index c8dcb6003a..0000000000
--- a/xen/include/asm-x86/x86_32/domain_page.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/******************************************************************************
- * domain_page.h
- *
- * Allow temporary mapping of domain page frames into Xen space.
- */
-
-#ifndef __ASM_DOMAIN_PAGE_H__
-#define __ASM_DOMAIN_PAGE_H__
-
-#include <xen/config.h>
-#include <xen/sched.h>
-
-extern l1_pgentry_t *mapcache;
-#define MAPCACHE_ORDER 10
-#define MAPCACHE_ENTRIES (1 << MAPCACHE_ORDER)
-
-/*
- * Maps a given physical address, returning corresponding virtual address.
- * The entire page containing that VA is now accessible until a
- * corresponding call to unmap_domain_mem().
- */
-extern void *map_domain_mem(unsigned long pa);
-
-/*
- * Pass a VA within a page previously mapped with map_domain_mem().
- * That page will then be removed from the mapping lists.
- */
-extern void unmap_domain_mem(void *va);
-
-#define DMCACHE_ENTRY_VALID 1UL
-#define DMCACHE_ENTRY_HELD 2UL
-
-struct domain_mmap_cache {
- unsigned long pa;
- void *va;
-};
-
-static inline void
-domain_mmap_cache_init(struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- cache->pa = 0;
-}
-
-static inline void *
-map_domain_mem_with_cache(unsigned long pa, struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- BUG_ON(cache->pa & DMCACHE_ENTRY_HELD);
-
- if ( likely(cache->pa) )
- {
- cache->pa |= DMCACHE_ENTRY_HELD;
- if ( likely((pa & PAGE_MASK) == (cache->pa & PAGE_MASK)) )
- goto done;
- unmap_domain_mem(cache->va);
- }
-
- cache->pa = (pa & PAGE_MASK) | DMCACHE_ENTRY_HELD | DMCACHE_ENTRY_VALID;
- cache->va = map_domain_mem(cache->pa);
-
- done:
- return (void *)(((unsigned long)cache->va & PAGE_MASK) |
- (pa & ~PAGE_MASK));
-}
-
-static inline void
-unmap_domain_mem_with_cache(void *va, struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- cache->pa &= ~DMCACHE_ENTRY_HELD;
-}
-
-static inline void
-domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- if ( likely(cache->pa) )
- {
- unmap_domain_mem(cache->va);
- cache->pa = 0;
- }
-}
-
-#endif /* __ASM_DOMAIN_PAGE_H__ */
diff --git a/xen/include/asm-x86/x86_64/domain_page.h b/xen/include/asm-x86/x86_64/domain_page.h
deleted file mode 100644
index ae0e6d2413..0000000000
--- a/xen/include/asm-x86/x86_64/domain_page.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/******************************************************************************
- * domain_page.h
- *
- * This is a trivial no-op on x86/64, where we can 1:1 map all RAM.
- */
-
-#ifndef __ASM_DOMAIN_PAGE_H__
-#define __ASM_DOMAIN_PAGE_H__
-
-#define map_domain_mem(_pa) phys_to_virt(_pa)
-#define unmap_domain_mem(_va) ((void)(_va))
-
-struct domain_mmap_cache {
-};
-
-#define domain_mmap_cache_init(_c) ((void)(_c))
-#define map_domain_mem_with_cache(_p,_c) (map_domain_mem(_p))
-#define unmap_domain_mem_with_cache(_v,_c) ((void)(_v))
-#define domain_mmap_cache_destroy(_c) ((void)(_c))
-
-#endif /* __ASM_DOMAIN_PAGE_H__ */
diff --git a/xen/include/xen/domain_page.h b/xen/include/xen/domain_page.h
new file mode 100644
index 0000000000..f20e3f28c3
--- /dev/null
+++ b/xen/include/xen/domain_page.h
@@ -0,0 +1,100 @@
+/******************************************************************************
+ * domain_page.h
+ *
+ * Allow temporary mapping of domain page frames into Xen space.
+ */
+
+#ifndef __XEN_DOMAIN_PAGE_H__
+#define __XEN_DOMAIN_PAGE_H__
+
+#include <xen/config.h>
+#include <xen/mm.h>
+
+#ifdef CONFIG_DOMAIN_PAGE
+
+/*
+ * Maps a given page frame, returning the mmap'ed virtual address. The page is
+ * now accessible until a corresponding call to unmap_domain_page().
+ */
+extern void *map_domain_page(unsigned long pfn);
+
+/*
+ * Pass a VA within a page previously mapped with map_domain_page().
+ * That page will then be removed from the mapping lists.
+ */
+extern void unmap_domain_page(void *va);
+
+#define DMCACHE_ENTRY_VALID 1U
+#define DMCACHE_ENTRY_HELD 2U
+
+struct domain_mmap_cache {
+ unsigned long pfn;
+ void *va;
+ unsigned int flags;
+};
+
+static inline void
+domain_mmap_cache_init(struct domain_mmap_cache *cache)
+{
+ ASSERT(cache != NULL);
+ cache->flags = 0;
+}
+
+static inline void *
+map_domain_page_with_cache(unsigned long pfn, struct domain_mmap_cache *cache)
+{
+ ASSERT(cache != NULL);
+ BUG_ON(cache->flags & DMCACHE_ENTRY_HELD);
+
+ if ( likely(cache->flags & DMCACHE_ENTRY_VALID) )
+ {
+ cache->flags |= DMCACHE_ENTRY_HELD;
+ if ( likely(pfn == cache->pfn) )
+ goto done;
+ unmap_domain_page(cache->va);
+ }
+
+ cache->pfn = pfn;
+ cache->va = map_domain_page(pfn);
+ cache->flags = DMCACHE_ENTRY_HELD | DMCACHE_ENTRY_VALID;
+
+ done:
+ return cache->va;
+}
+
+static inline void
+unmap_domain_page_with_cache(void *va, struct domain_mmap_cache *cache)
+{
+ ASSERT(cache != NULL);
+ cache->flags &= ~DMCACHE_ENTRY_HELD;
+}
+
+static inline void
+domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
+{
+ ASSERT(cache != NULL);
+ BUG_ON(cache->flags & DMCACHE_ENTRY_HELD);
+
+ if ( likely(cache->flags & DMCACHE_ENTRY_VALID) )
+ {
+ unmap_domain_page(cache->va);
+ cache->flags = 0;
+ }
+}
+
+#else /* !CONFIG_DOMAIN_PAGE */
+
+#define map_domain_page(pfn) phys_to_virt((pfn)<<PAGE_SHIFT)
+#define unmap_domain_page(va) ((void)(va))
+
+struct domain_mmap_cache {
+};
+
+#define domain_mmap_cache_init(c) ((void)(c))
+#define map_domain_page_with_cache(pfn,c) (map_domain_page(pfn))
+#define unmap_domain_page_with_cache(va,c) ((void)(va))
+#define domain_mmap_cache_destroy(c) ((void)(c))
+
+#endif /* !CONFIG_DOMAIN_PAGE */
+
+#endif /* __XEN_DOMAIN_PAGE_H__ */
diff --git a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h
index c7f2493a1a..abc17e0b68 100644
--- a/xen/include/xen/perfc_defn.h
+++ b/xen/include/xen/perfc_defn.h
@@ -1,112 +1,127 @@
+#ifndef __XEN_PERFC_DEFN_H__
+#define __XEN_PERFC_DEFN_H__
+
#define PERFC_MAX_PT_UPDATES 64
#define PERFC_PT_UPDATES_BUCKET_SIZE 3
-PERFCOUNTER_ARRAY( wpt_updates, "writable pt updates", PERFC_MAX_PT_UPDATES )
-PERFCOUNTER_ARRAY( bpt_updates, "batched pt updates", PERFC_MAX_PT_UPDATES )
-PERFCOUNTER_ARRAY( l1_entries_checked, "l1 entries checked", PERFC_MAX_PT_UPDATES )
-PERFCOUNTER_ARRAY( shm_l2_updates, "shadow mode L2 pt updates", PERFC_MAX_PT_UPDATES )
-PERFCOUNTER_ARRAY( shm_hl2_updates, "shadow mode HL2 pt updates", PERFC_MAX_PT_UPDATES )
-PERFCOUNTER_ARRAY( snapshot_copies, "entries copied per snapshot", PERFC_MAX_PT_UPDATES )
-
-PERFCOUNTER_ARRAY( hypercalls, "hypercalls", NR_hypercalls )
-PERFCOUNTER_ARRAY( exceptions, "exceptions", 32 )
+PERFCOUNTER_ARRAY(wpt_updates, "writable pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(bpt_updates, "batched pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(l1_entries_checked, "l1 entries checked",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(shm_l2_updates, "shadow mode L2 pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(shm_hl2_updates, "shadow mode HL2 pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(snapshot_copies, "entries copied per snapshot",
+ PERFC_MAX_PT_UPDATES)
+
+PERFCOUNTER_ARRAY(hypercalls, "hypercalls", NR_hypercalls)
+PERFCOUNTER_ARRAY(exceptions, "exceptions", 32)
#define VMX_PERF_EXIT_REASON_SIZE 37
#define VMX_PERF_VECTOR_SIZE 0x20
-PERFCOUNTER_ARRAY( vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE )
-PERFCOUNTER_ARRAY( cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE )
-
-PERFCOUNTER_CPU (seg_fixups, "segmentation fixups" )
-
-PERFCOUNTER_CPU( irqs, "#interrupts" )
-PERFCOUNTER_CPU( ipis, "#IPIs" )
-PERFCOUNTER_CPU( irq_time, "cycles spent in irq handler" )
-
-PERFCOUNTER_CPU( apic_timer, "apic timer interrupts" )
-PERFCOUNTER_CPU( ac_timer_max, "ac_timer max error (ns)" )
-PERFCOUNTER_CPU( sched_irq, "sched: timer" )
-PERFCOUNTER_CPU( sched_run, "sched: runs through scheduler" )
-PERFCOUNTER_CPU( sched_ctx, "sched: context switches" )
-
-PERFCOUNTER_CPU( domain_page_tlb_flush, "domain page tlb flushes" )
-PERFCOUNTER_CPU( need_flush_tlb_flush, "PG_need_flush tlb flushes" )
-
-PERFCOUNTER_CPU( calls_to_mmu_update, "calls_to_mmu_update" )
-PERFCOUNTER_CPU( num_page_updates, "num_page_updates" )
-PERFCOUNTER_CPU( calls_to_update_va, "calls_to_update_va_map" )
-PERFCOUNTER_CPU( page_faults, "page faults" )
-PERFCOUNTER_CPU( copy_user_faults, "copy_user faults" )
-
-PERFCOUNTER_CPU(shadow_fault_calls, "calls to shadow_fault")
-PERFCOUNTER_CPU(shadow_fault_bail_pde_not_present, "sf bailed due to pde not present")
-PERFCOUNTER_CPU(shadow_fault_bail_pte_not_present, "sf bailed due to pte not present")
-PERFCOUNTER_CPU(shadow_fault_bail_ro_mapping, "sf bailed due to a ro mapping")
-PERFCOUNTER_CPU(shadow_fault_fixed, "sf fixed the pgfault")
-PERFCOUNTER_CPU(write_fault_bail, "sf bailed due to write_fault")
-PERFCOUNTER_CPU(read_fault_bail, "sf bailed due to read_fault")
-
-PERFCOUNTER_CPU( map_domain_mem_count, "map_domain_mem count" )
-PERFCOUNTER_CPU( ptwr_emulations, "writable pt emulations" )
-
-PERFCOUNTER_CPU( shadow_l2_table_count, "shadow_l2_table count" )
-PERFCOUNTER_CPU( shadow_l1_table_count, "shadow_l1_table count" )
-PERFCOUNTER_CPU( unshadow_table_count, "unshadow_table count" )
-PERFCOUNTER_CPU( shadow_fixup_count, "shadow_fixup count" )
-PERFCOUNTER_CPU( shadow_update_va_fail1, "shadow_update_va_fail1" )
-PERFCOUNTER_CPU( shadow_update_va_fail2, "shadow_update_va_fail2" )
+PERFCOUNTER_ARRAY(vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE)
+PERFCOUNTER_ARRAY(cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE)
+
+PERFCOUNTER_CPU(seg_fixups, "segmentation fixups")
+
+PERFCOUNTER_CPU(irqs, "#interrupts")
+PERFCOUNTER_CPU(ipis, "#IPIs")
+PERFCOUNTER_CPU(irq_time, "cycles spent in irq handler")
+
+PERFCOUNTER_CPU(apic_timer, "apic timer interrupts")
+PERFCOUNTER_CPU(ac_timer_max, "ac_timer max error (ns)")
+PERFCOUNTER_CPU(sched_irq, "sched: timer")
+PERFCOUNTER_CPU(sched_run, "sched: runs through scheduler")
+PERFCOUNTER_CPU(sched_ctx, "sched: context switches")
+
+PERFCOUNTER_CPU(domain_page_tlb_flush, "domain page tlb flushes")
+PERFCOUNTER_CPU(need_flush_tlb_flush, "PG_need_flush tlb flushes")
+
+PERFCOUNTER_CPU(calls_to_mmu_update, "calls_to_mmu_update")
+PERFCOUNTER_CPU(num_page_updates, "num_page_updates")
+PERFCOUNTER_CPU(calls_to_update_va, "calls_to_update_va_map")
+PERFCOUNTER_CPU(page_faults, "page faults")
+PERFCOUNTER_CPU(copy_user_faults, "copy_user faults")
+
+PERFCOUNTER_CPU(shadow_fault_calls, "calls to shadow_fault")
+PERFCOUNTER_CPU(shadow_fault_bail_pde_not_present,
+ "sf bailed due to pde not present")
+PERFCOUNTER_CPU(shadow_fault_bail_pte_not_present,
+ "sf bailed due to pte not present")
+PERFCOUNTER_CPU(shadow_fault_bail_ro_mapping,
+ "sf bailed due to a ro mapping")
+PERFCOUNTER_CPU(shadow_fault_fixed, "sf fixed the pgfault")
+PERFCOUNTER_CPU(write_fault_bail, "sf bailed due to write_fault")
+PERFCOUNTER_CPU(read_fault_bail, "sf bailed due to read_fault")
+
+PERFCOUNTER_CPU(map_domain_page_count, "map_domain_page count")
+PERFCOUNTER_CPU(ptwr_emulations, "writable pt emulations")
+
+PERFCOUNTER_CPU(shadow_l2_table_count, "shadow_l2_table count")
+PERFCOUNTER_CPU(shadow_l1_table_count, "shadow_l1_table count")
+PERFCOUNTER_CPU(unshadow_table_count, "unshadow_table count")
+PERFCOUNTER_CPU(shadow_fixup_count, "shadow_fixup count")
+PERFCOUNTER_CPU(shadow_update_va_fail1, "shadow_update_va_fail1")
+PERFCOUNTER_CPU(shadow_update_va_fail2, "shadow_update_va_fail2")
/* STATUS counters do not reset when 'P' is hit */
-PERFSTATUS( shadow_l2_pages, "current # shadow L2 pages" )
-PERFSTATUS( shadow_l1_pages, "current # shadow L1 pages" )
-PERFSTATUS( hl2_table_pages, "current # hl2 pages" )
-PERFSTATUS( snapshot_pages, "current # fshadow snapshot pages" )
-PERFSTATUS( writable_pte_predictions, "# writable pte predictions")
-PERFSTATUS( free_l1_pages, "current # free shadow L1 pages" )
-
-PERFCOUNTER_CPU( check_pagetable, "calls to check_pagetable" )
-PERFCOUNTER_CPU( check_all_pagetables, "calls to check_all_pagetables" )
-
-PERFCOUNTER_CPU( shadow_hl2_table_count, "shadow_hl2_table count" )
-PERFCOUNTER_CPU( shadow_set_l1e_force_map, "shadow_set_l1e forced to map l1" )
-PERFCOUNTER_CPU( shadow_set_l1e_unlinked, "shadow_set_l1e found unlinked l1" )
-PERFCOUNTER_CPU( shadow_set_l1e_fail, "shadow_set_l1e failed (no sl1)" )
-PERFCOUNTER_CPU( shadow_invlpg_faults, "shadow_invlpg's get_user faulted")
-PERFCOUNTER_CPU( unshadow_l2_count, "unpinned L2 count")
+PERFSTATUS(shadow_l2_pages, "current # shadow L2 pages")
+PERFSTATUS(shadow_l1_pages, "current # shadow L1 pages")
+PERFSTATUS(hl2_table_pages, "current # hl2 pages")
+PERFSTATUS(snapshot_pages, "current # fshadow snapshot pages")
+PERFSTATUS(writable_pte_predictions, "# writable pte predictions")
+PERFSTATUS(free_l1_pages, "current # free shadow L1 pages")
+
+PERFCOUNTER_CPU(check_pagetable, "calls to check_pagetable")
+PERFCOUNTER_CPU(check_all_pagetables, "calls to check_all_pagetables")
+
+PERFCOUNTER_CPU(shadow_hl2_table_count, "shadow_hl2_table count")
+PERFCOUNTER_CPU(shadow_set_l1e_force_map, "shadow_set_l1e forced to map l1")
+PERFCOUNTER_CPU(shadow_set_l1e_unlinked, "shadow_set_l1e found unlinked l1")
+PERFCOUNTER_CPU(shadow_set_l1e_fail, "shadow_set_l1e failed (no sl1)")
+PERFCOUNTER_CPU(shadow_invlpg_faults, "shadow_invlpg's get_user faulted")
+PERFCOUNTER_CPU(unshadow_l2_count, "unpinned L2 count")
PERFCOUNTER_CPU(shadow_status_shortcut, "fastpath miss on shadow cache")
-PERFCOUNTER_CPU(shadow_status_calls, "calls to ___shadow_status" )
-PERFCOUNTER_CPU(shadow_status_miss, "missed shadow cache" )
-PERFCOUNTER_CPU(shadow_status_hit_head, "hits on head of bucket" )
-PERFCOUNTER_CPU(shadow_max_type, "calls to shadow_max_type" )
-
-PERFCOUNTER_CPU(shadow_sync_all, "calls to shadow_sync_all")
-PERFCOUNTER_CPU(shadow_sync_va, "calls to shadow_sync_va")
-PERFCOUNTER_CPU(resync_l1, "resync L1 page")
-PERFCOUNTER_CPU(resync_l2, "resync L2 page")
-PERFCOUNTER_CPU(resync_hl2, "resync HL2 page")
-PERFCOUNTER_CPU(shadow_make_snapshot, "snapshots created")
-PERFCOUNTER_CPU(shadow_mark_mfn_out_of_sync_calls, "calls to shadow_mk_out_of_sync")
-PERFCOUNTER_CPU(shadow_out_of_sync_calls, "calls to shadow_out_of_sync")
-PERFCOUNTER_CPU(snapshot_entry_matches_calls, "calls to ss_entry_matches")
-PERFCOUNTER_CPU(snapshot_entry_matches_true, "ss_entry_matches returns true")
-
-PERFCOUNTER_CPU(validate_pte_calls, "calls to validate_pte_change")
-PERFCOUNTER_CPU(validate_pte_changes1, "validate_pte makes changes1")
-PERFCOUNTER_CPU(validate_pte_changes2, "validate_pte makes changes2")
-PERFCOUNTER_CPU(validate_pte_changes3, "validate_pte makes changes3")
-PERFCOUNTER_CPU(validate_pte_changes4, "validate_pte makes changes4")
-PERFCOUNTER_CPU(validate_pde_calls, "calls to validate_pde_change")
-PERFCOUNTER_CPU(validate_pde_changes, "validate_pde makes changes")
-PERFCOUNTER_CPU(shadow_get_page_fail, "shadow_get_page_from_l1e fails" )
-PERFCOUNTER_CPU(validate_hl2e_calls, "calls to validate_hl2e_change")
-PERFCOUNTER_CPU(validate_hl2e_changes, "validate_hl2e makes changes")
-PERFCOUNTER_CPU(exception_fixed, "pre-exception fixed")
-PERFCOUNTER_CPU(gpfn_to_mfn_foreign, "calls to gpfn_to_mfn_foreign")
-PERFCOUNTER_CPU(remove_all_access, "calls to remove_all_access")
-PERFCOUNTER_CPU(remove_write_access, "calls to remove_write_access")
-PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access")
-PERFCOUNTER_CPU(remove_write_no_work, "no work in remove_write_access")
-PERFCOUNTER_CPU(remove_write_not_writable, "remove_write non-writable page")
-PERFCOUNTER_CPU(remove_write_fast_exit, "remove_write hit predicted entry")
-PERFCOUNTER_CPU(remove_write_predicted, "remove_write predict hit&exit")
-PERFCOUNTER_CPU(remove_write_bad_prediction, "remove_write bad prediction")
-PERFCOUNTER_CPU(update_hl2e_invlpg, "update_hl2e calls invlpg")
+PERFCOUNTER_CPU(shadow_status_calls, "calls to ___shadow_status")
+PERFCOUNTER_CPU(shadow_status_miss, "missed shadow cache")
+PERFCOUNTER_CPU(shadow_status_hit_head, "hits on head of bucket")
+PERFCOUNTER_CPU(shadow_max_type, "calls to shadow_max_type")
+
+PERFCOUNTER_CPU(shadow_sync_all, "calls to shadow_sync_all")
+PERFCOUNTER_CPU(shadow_sync_va, "calls to shadow_sync_va")
+PERFCOUNTER_CPU(resync_l1, "resync L1 page")
+PERFCOUNTER_CPU(resync_l2, "resync L2 page")
+PERFCOUNTER_CPU(resync_hl2, "resync HL2 page")
+PERFCOUNTER_CPU(shadow_make_snapshot, "snapshots created")
+PERFCOUNTER_CPU(shadow_mark_mfn_out_of_sync_calls,
+ "calls to shadow_mk_out_of_sync")
+PERFCOUNTER_CPU(shadow_out_of_sync_calls, "calls to shadow_out_of_sync")
+PERFCOUNTER_CPU(snapshot_entry_matches_calls, "calls to ss_entry_matches")
+PERFCOUNTER_CPU(snapshot_entry_matches_true, "ss_entry_matches returns true")
+
+PERFCOUNTER_CPU(validate_pte_calls, "calls to validate_pte_change")
+PERFCOUNTER_CPU(validate_pte_changes1, "validate_pte makes changes1")
+PERFCOUNTER_CPU(validate_pte_changes2, "validate_pte makes changes2")
+PERFCOUNTER_CPU(validate_pte_changes3, "validate_pte makes changes3")
+PERFCOUNTER_CPU(validate_pte_changes4, "validate_pte makes changes4")
+PERFCOUNTER_CPU(validate_pde_calls, "calls to validate_pde_change")
+PERFCOUNTER_CPU(validate_pde_changes, "validate_pde makes changes")
+PERFCOUNTER_CPU(shadow_get_page_fail, "shadow_get_page_from_l1e fails")
+PERFCOUNTER_CPU(validate_hl2e_calls, "calls to validate_hl2e_change")
+PERFCOUNTER_CPU(validate_hl2e_changes, "validate_hl2e makes changes")
+PERFCOUNTER_CPU(exception_fixed, "pre-exception fixed")
+PERFCOUNTER_CPU(gpfn_to_mfn_foreign, "calls to gpfn_to_mfn_foreign")
+PERFCOUNTER_CPU(remove_all_access, "calls to remove_all_access")
+PERFCOUNTER_CPU(remove_write_access, "calls to remove_write_access")
+PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access")
+PERFCOUNTER_CPU(remove_write_no_work, "no work in remove_write_access")
+PERFCOUNTER_CPU(remove_write_not_writable, "remove_write non-writable page")
+PERFCOUNTER_CPU(remove_write_fast_exit, "remove_write hit predicted entry")
+PERFCOUNTER_CPU(remove_write_predicted, "remove_write predict hit&exit")
+PERFCOUNTER_CPU(remove_write_bad_prediction, "remove_write bad prediction")
+PERFCOUNTER_CPU(update_hl2e_invlpg, "update_hl2e calls invlpg")
+
+#endif /* __XEN_PERFC_DEFN_H__ */