aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-05-08 16:58:33 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-05-08 16:58:33 +0100
commit836885deb0fbe2dfabec10e63bd55499649011e1 (patch)
treeb69af991facf8adbb1e9e311d7b19517c0352fb8
parent126d4342c64edb68b9a1dfb9cb1ae0db20c63b67 (diff)
downloadxen-836885deb0fbe2dfabec10e63bd55499649011e1.tar.gz
xen-836885deb0fbe2dfabec10e63bd55499649011e1.tar.bz2
xen-836885deb0fbe2dfabec10e63bd55499649011e1.zip
Clean up shadow code after the removal of non-PAE 32-bit builds
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
-rw-r--r--xen/arch/x86/mm/p2m.c37
-rw-r--r--xen/arch/x86/mm/shadow/Makefile13
-rw-r--r--xen/arch/x86/mm/shadow/common.c174
-rw-r--r--xen/arch/x86/mm/shadow/multi.c98
-rw-r--r--xen/arch/x86/mm/shadow/multi.h58
-rw-r--r--xen/arch/x86/mm/shadow/private.h34
-rw-r--r--xen/arch/x86/mm/shadow/types.h105
-rw-r--r--xen/include/asm-x86/mtrr.h3
8 files changed, 174 insertions, 348 deletions
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index c525a171c5..9c29b20048 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -220,7 +220,6 @@ p2m_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
L4_PAGETABLE_ENTRIES, PGT_l3_page_table) )
goto out;
#endif
-#if CONFIG_PAGING_LEVELS >= 3
/*
* When using PAE Xen, we only allow 33 bits of pseudo-physical
* address in translated guests (i.e. 8 GBytes). This restriction
@@ -235,7 +234,7 @@ p2m_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
: L3_PAGETABLE_ENTRIES),
PGT_l2_page_table) )
goto out;
-#endif
+
if ( !p2m_next_level(d, &table_mfn, &table, &gfn_remainder, gfn,
L2_PAGETABLE_SHIFT - PAGE_SHIFT,
L2_PAGETABLE_ENTRIES, PGT_l1_page_table) )
@@ -308,7 +307,6 @@ p2m_gfn_to_mfn(struct domain *d, unsigned long gfn, p2m_type_t *t)
unmap_domain_page(l4e);
}
#endif
-#if CONFIG_PAGING_LEVELS >= 3
{
l3_pgentry_t *l3e = map_domain_page(mfn_x(mfn));
#if CONFIG_PAGING_LEVELS == 3
@@ -329,7 +327,6 @@ p2m_gfn_to_mfn(struct domain *d, unsigned long gfn, p2m_type_t *t)
mfn = _mfn(l3e_get_pfn(*l3e));
unmap_domain_page(l3e);
}
-#endif
l2e = map_domain_page(mfn_x(mfn));
l2e += l2_table_offset(addr);
@@ -486,7 +483,7 @@ int p2m_alloc_table(struct domain *d,
p2m_top->u.inuse.type_info =
#if CONFIG_PAGING_LEVELS == 4
PGT_l4_page_table
-#elif CONFIG_PAGING_LEVELS == 3
+#else
PGT_l3_page_table
#endif
| 1 | PGT_validated;
@@ -657,16 +654,13 @@ static void audit_p2m(struct domain *d)
l3_pgentry_t *l3e;
int i3, i4;
l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
-#elif CONFIG_PAGING_LEVELS == 3
+#else /* CONFIG_PAGING_LEVELS == 3 */
l3_pgentry_t *l3e;
int i3;
l3e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
-#else /* CONFIG_PAGING_LEVELS == 2 */
- l2e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
#endif
gfn = 0;
-#if CONFIG_PAGING_LEVELS >= 3
#if CONFIG_PAGING_LEVELS >= 4
for ( i4 = 0; i4 < L4_PAGETABLE_ENTRIES; i4++ )
{
@@ -676,7 +670,7 @@ static void audit_p2m(struct domain *d)
continue;
}
l3e = map_domain_page(mfn_x(_mfn(l4e_get_pfn(l4e[i4]))));
-#endif /* now at levels 3 or 4... */
+#endif
for ( i3 = 0;
i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8);
i3++ )
@@ -687,7 +681,6 @@ static void audit_p2m(struct domain *d)
continue;
}
l2e = map_domain_page(mfn_x(_mfn(l3e_get_pfn(l3e[i3]))));
-#endif /* all levels... */
for ( i2 = 0; i2 < L2_PAGETABLE_ENTRIES; i2++ )
{
if ( !(l2e_get_flags(l2e[i2]) & _PAGE_PRESENT) )
@@ -714,21 +707,17 @@ static void audit_p2m(struct domain *d)
}
unmap_domain_page(l1e);
}
-#if CONFIG_PAGING_LEVELS >= 3
unmap_domain_page(l2e);
}
#if CONFIG_PAGING_LEVELS >= 4
unmap_domain_page(l3e);
}
#endif
-#endif
#if CONFIG_PAGING_LEVELS == 4
unmap_domain_page(l4e);
-#elif CONFIG_PAGING_LEVELS == 3
+#else /* CONFIG_PAGING_LEVELS == 3 */
unmap_domain_page(l3e);
-#else /* CONFIG_PAGING_LEVELS == 2 */
- unmap_domain_page(l2e);
#endif
}
@@ -864,14 +853,12 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
l2_pgentry_t *l2e;
mfn_t l1mfn;
int i1, i2;
-#if CONFIG_PAGING_LEVELS >= 3
l3_pgentry_t *l3e;
int i3;
#if CONFIG_PAGING_LEVELS == 4
l4_pgentry_t *l4e;
int i4;
#endif /* CONFIG_PAGING_LEVELS == 4 */
-#endif /* CONFIG_PAGING_LEVELS >= 3 */
if ( !paging_mode_translate(d) )
return;
@@ -883,13 +870,10 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
#if CONFIG_PAGING_LEVELS == 4
l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
-#elif CONFIG_PAGING_LEVELS == 3
+#else /* CONFIG_PAGING_LEVELS == 3 */
l3e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
-#else /* CONFIG_PAGING_LEVELS == 2 */
- l2e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
#endif
-#if CONFIG_PAGING_LEVELS >= 3
#if CONFIG_PAGING_LEVELS >= 4
for ( i4 = 0; i4 < L4_PAGETABLE_ENTRIES; i4++ )
{
@@ -898,7 +882,7 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
continue;
}
l3e = map_domain_page(l4e_get_pfn(l4e[i4]));
-#endif /* now at levels 3 or 4... */
+#endif
for ( i3 = 0;
i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8);
i3++ )
@@ -908,7 +892,6 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
continue;
}
l2e = map_domain_page(l3e_get_pfn(l3e[i3]));
-#endif /* all levels... */
for ( i2 = 0; i2 < L2_PAGETABLE_ENTRIES; i2++ )
{
if ( !(l2e_get_flags(l2e[i2]) & _PAGE_PRESENT) )
@@ -934,21 +917,17 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
}
unmap_domain_page(l1e);
}
-#if CONFIG_PAGING_LEVELS >= 3
unmap_domain_page(l2e);
}
#if CONFIG_PAGING_LEVELS >= 4
unmap_domain_page(l3e);
}
#endif
-#endif
#if CONFIG_PAGING_LEVELS == 4
unmap_domain_page(l4e);
-#elif CONFIG_PAGING_LEVELS == 3
+#else /* CONFIG_PAGING_LEVELS == 3 */
unmap_domain_page(l3e);
-#else /* CONFIG_PAGING_LEVELS == 2 */
- unmap_domain_page(l2e);
#endif
}
diff --git a/xen/arch/x86/mm/shadow/Makefile b/xen/arch/x86/mm/shadow/Makefile
index ddf3d71c0b..76c879ee81 100644
--- a/xen/arch/x86/mm/shadow/Makefile
+++ b/xen/arch/x86/mm/shadow/Makefile
@@ -1,10 +1,5 @@
-obj-$(x86_32) += common.o g2_on_s3.o g3_on_s3.o
-obj-$(x86_64) += common.o g4_on_s4.o g3_on_s3.o g2_on_s3.o
+obj-$(x86_32) += common.o guest_2.o guest_3.o
+obj-$(x86_64) += common.o guest_2.o guest_3.o guest_4.o
-guest_levels = $(subst g,,$(filter g%,$(subst ., ,$(subst _, ,$(1)))))
-shadow_levels = $(subst s,,$(filter s%,$(subst ., ,$(subst _, ,$(1)))))
-shadow_defns = -DGUEST_PAGING_LEVELS=$(call guest_levels,$(1)) \
- -DSHADOW_PAGING_LEVELS=$(call shadow_levels,$(1))
-
-g%.o: multi.c $(HDRS) Makefile
- $(CC) $(CFLAGS) $(call shadow_defns,$(@F)) -c $< -o $@
+guest_%.o: multi.c $(HDRS) Makefile
+ $(CC) $(CFLAGS) -DGUEST_PAGING_LEVELS=$* -c $< -o $@
diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
index 29a1b95c99..070efdc0af 100644
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -64,11 +64,7 @@ void shadow_domain_init(struct domain *d)
*/
void shadow_vcpu_init(struct vcpu *v)
{
-#if CONFIG_PAGING_LEVELS == 4
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,3,3);
-#elif CONFIG_PAGING_LEVELS == 3
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,3,3);
-#endif
+ v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 3);
}
#if SHADOW_AUDIT
@@ -503,38 +499,37 @@ sh_validate_guest_entry(struct vcpu *v, mfn_t gmfn, void *entry, u32 size)
return 0; /* Not shadowed at all */
if ( page->shadow_flags & SHF_L1_32 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 3, 2)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 2)
(v, gmfn, entry, size);
-
if ( page->shadow_flags & SHF_L2_32 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 3, 2)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 2)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L1_PAE )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 3, 3)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 3)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L2_PAE )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 3, 3)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 3)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L2H_PAE )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, 3, 3)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, 3)
(v, gmfn, entry, size);
#if CONFIG_PAGING_LEVELS >= 4
if ( page->shadow_flags & SHF_L1_64 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 4, 4)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, 4)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L2_64 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 4, 4)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 4)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L2H_64 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, 4, 4)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, 4)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L3_64 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl3e, 4, 4)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl3e, 4)
(v, gmfn, entry, size);
if ( page->shadow_flags & SHF_L4_64 )
- result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl4e, 4, 4)
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl4e, 4)
(v, gmfn, entry, size);
#else /* 32-bit hypervisor does not support 64-bit guests */
ASSERT((page->shadow_flags
@@ -613,7 +608,7 @@ int shadow_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p,
* Most shadow pages are allocated singly, but there is one case where
* we need to allocate multiple pages together: shadowing 32-bit guest
* tables on PAE or 64-bit shadows. A 32-bit guest l1 table covers 4MB
- * of virtuial address space, and needs to be shadowed by two PAE/64-bit
+ * of virtual address space, and needs to be shadowed by two PAE/64-bit
* l1 tables (covering 2MB of virtual address space each). Similarly, a
* 32-bit guest l2 table (4GB va) needs to be shadowed by four
* PAE/64-bit l2 tables (1GB va each). These multi-page shadows are
@@ -622,15 +617,15 @@ int shadow_cmpxchg_guest_entry(struct vcpu *v, intpte_t *p,
*
* This table shows the allocation behaviour of the different modes:
*
- * Xen paging 32b pae pae 64b 64b 64b
- * Guest paging 32b 32b pae 32b pae 64b
- * PV or HVM * HVM * HVM HVM *
- * Shadow paging 32b pae pae pae pae 64b
+ * Xen paging pae pae 64b 64b 64b
+ * Guest paging 32b pae 32b pae 64b
+ * PV or HVM HVM * HVM HVM *
+ * Shadow paging pae pae pae pae 64b
*
- * sl1 size 4k 8k 4k 8k 4k 4k
- * sl2 size 4k 16k 4k 16k 4k 4k
- * sl3 size - - - - - 4k
- * sl4 size - - - - - 4k
+ * sl1 size 8k 4k 8k 4k 4k
+ * sl2 size 16k 4k 16k 4k 4k
+ * sl3 size - - - - 4k
+ * sl4 size - - - - 4k
*
* We allocate memory from xen in four-page units and break them down
* with a simple buddy allocator. Can't use the xen allocator to handle
@@ -723,15 +718,15 @@ static void shadow_unhook_mappings(struct vcpu *v, mfn_t smfn)
switch ( sp->type )
{
case SH_type_l2_32_shadow:
- SHADOW_INTERNAL_NAME(sh_unhook_32b_mappings,3,2)(v,smfn);
+ SHADOW_INTERNAL_NAME(sh_unhook_32b_mappings, 2)(v,smfn);
break;
case SH_type_l2_pae_shadow:
case SH_type_l2h_pae_shadow:
- SHADOW_INTERNAL_NAME(sh_unhook_pae_mappings,3,3)(v,smfn);
+ SHADOW_INTERNAL_NAME(sh_unhook_pae_mappings, 3)(v,smfn);
break;
#if CONFIG_PAGING_LEVELS >= 4
case SH_type_l4_64_shadow:
- SHADOW_INTERNAL_NAME(sh_unhook_64b_mappings,4,4)(v,smfn);
+ SHADOW_INTERNAL_NAME(sh_unhook_64b_mappings, 4)(v,smfn);
break;
#endif
default:
@@ -1573,37 +1568,37 @@ void sh_destroy_shadow(struct vcpu *v, mfn_t smfn)
{
case SH_type_l1_32_shadow:
case SH_type_fl1_32_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 3, 2)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 2)(v, smfn);
break;
case SH_type_l2_32_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 3, 2)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 2)(v, smfn);
break;
case SH_type_l1_pae_shadow:
case SH_type_fl1_pae_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 3, 3)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 3)(v, smfn);
break;
case SH_type_l2_pae_shadow:
case SH_type_l2h_pae_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 3, 3)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 3)(v, smfn);
break;
#if CONFIG_PAGING_LEVELS >= 4
case SH_type_l1_64_shadow:
case SH_type_fl1_64_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 4, 4)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 4)(v, smfn);
break;
case SH_type_l2h_64_shadow:
ASSERT(is_pv_32on64_vcpu(v));
/* Fall through... */
case SH_type_l2_64_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 4, 4)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 4)(v, smfn);
break;
case SH_type_l3_64_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l3_shadow, 4, 4)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l3_shadow, 4)(v, smfn);
break;
case SH_type_l4_64_shadow:
- SHADOW_INTERNAL_NAME(sh_destroy_l4_shadow, 4, 4)(v, smfn);
+ SHADOW_INTERNAL_NAME(sh_destroy_l4_shadow, 4)(v, smfn);
break;
#endif
default:
@@ -1626,16 +1621,16 @@ int sh_remove_write_access(struct vcpu *v, mfn_t gmfn,
/* Dispatch table for getting per-type functions */
static hash_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,3,2), /* l1_32 */
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,3,2), /* fl1_32 */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 2), /* l1_32 */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 2), /* fl1_32 */
NULL, /* l2_32 */
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,3,3), /* l1_pae */
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,3,3), /* fl1_pae */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 3), /* l1_pae */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 3), /* fl1_pae */
NULL, /* l2_pae */
NULL, /* l2h_pae */
#if CONFIG_PAGING_LEVELS >= 4
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,4,4), /* l1_64 */
- SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1,4,4), /* fl1_64 */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 4), /* l1_64 */
+ SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 4), /* fl1_64 */
#else
NULL, /* l1_64 */
NULL, /* fl1_64 */
@@ -1711,7 +1706,6 @@ int sh_remove_write_access(struct vcpu *v, mfn_t gmfn,
GUESS(0xC0000000UL + (gfn << PAGE_SHIFT), 4);
}
-#if CONFIG_PAGING_LEVELS >= 3
else if ( v->arch.paging.mode->guest_levels == 3 )
{
/* 32bit PAE w2k3: linear map at 0xC0000000 */
@@ -1746,7 +1740,6 @@ int sh_remove_write_access(struct vcpu *v, mfn_t gmfn,
GUESS(0x0000010000000000UL + (gfn << PAGE_SHIFT), 4);
}
#endif /* CONFIG_PAGING_LEVELS >= 4 */
-#endif /* CONFIG_PAGING_LEVELS >= 3 */
#undef GUESS
}
@@ -1810,16 +1803,16 @@ int sh_remove_all_mappings(struct vcpu *v, mfn_t gmfn)
/* Dispatch table for getting per-type functions */
static hash_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,3,2), /* l1_32 */
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,3,2), /* fl1_32 */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 2), /* l1_32 */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 2), /* fl1_32 */
NULL, /* l2_32 */
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,3,3), /* l1_pae */
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,3,3), /* fl1_pae */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 3), /* l1_pae */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 3), /* fl1_pae */
NULL, /* l2_pae */
NULL, /* l2h_pae */
#if CONFIG_PAGING_LEVELS >= 4
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,4,4), /* l1_64 */
- SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1,4,4), /* fl1_64 */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 4), /* l1_64 */
+ SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 4), /* fl1_64 */
#else
NULL, /* l1_64 */
NULL, /* fl1_64 */
@@ -1918,12 +1911,12 @@ static int sh_remove_shadow_via_pointer(struct vcpu *v, mfn_t smfn)
{
case SH_type_l1_32_shadow:
case SH_type_l2_32_shadow:
- SHADOW_INTERNAL_NAME(sh_clear_shadow_entry,3,2)(v, vaddr, pmfn);
+ SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, 2)(v, vaddr, pmfn);
break;
case SH_type_l1_pae_shadow:
case SH_type_l2_pae_shadow:
case SH_type_l2h_pae_shadow:
- SHADOW_INTERNAL_NAME(sh_clear_shadow_entry,3,3)(v, vaddr, pmfn);
+ SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, 3)(v, vaddr, pmfn);
break;
#if CONFIG_PAGING_LEVELS >= 4
case SH_type_l1_64_shadow:
@@ -1931,7 +1924,7 @@ static int sh_remove_shadow_via_pointer(struct vcpu *v, mfn_t smfn)
case SH_type_l2h_64_shadow:
case SH_type_l3_64_shadow:
case SH_type_l4_64_shadow:
- SHADOW_INTERNAL_NAME(sh_clear_shadow_entry,4,4)(v, vaddr, pmfn);
+ SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, 4)(v, vaddr, pmfn);
break;
#endif
default: BUG(); /* Some wierd unknown shadow type */
@@ -1966,18 +1959,18 @@ void sh_remove_shadows(struct vcpu *v, mfn_t gmfn, int fast, int all)
NULL, /* none */
NULL, /* l1_32 */
NULL, /* fl1_32 */
- SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,3,2), /* l2_32 */
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 2), /* l2_32 */
NULL, /* l1_pae */
NULL, /* fl1_pae */
- SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,3,3), /* l2_pae */
- SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,3,3), /* l2h_pae */
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 3), /* l2_pae */
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 3), /* l2h_pae */
NULL, /* l1_64 */
NULL, /* fl1_64 */
#if CONFIG_PAGING_LEVELS >= 4
- SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,4,4), /* l2_64 */
- SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,4,4), /* l2h_64 */
- SHADOW_INTERNAL_NAME(sh_remove_l2_shadow,4,4), /* l3_64 */
- SHADOW_INTERNAL_NAME(sh_remove_l3_shadow,4,4), /* l4_64 */
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 4), /* l2_64 */
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 4), /* l2h_64 */
+ SHADOW_INTERNAL_NAME(sh_remove_l2_shadow, 4), /* l3_64 */
+ SHADOW_INTERNAL_NAME(sh_remove_l3_shadow, 4), /* l4_64 */
#else
NULL, /* l2_64 */
NULL, /* l2h_64 */
@@ -2061,7 +2054,6 @@ void sh_remove_shadows(struct vcpu *v, mfn_t gmfn, int fast, int all)
DO_UNSHADOW(SH_type_l2_32_shadow);
DO_UNSHADOW(SH_type_l1_32_shadow);
-#if CONFIG_PAGING_LEVELS >= 3
DO_UNSHADOW(SH_type_l2h_pae_shadow);
DO_UNSHADOW(SH_type_l2_pae_shadow);
DO_UNSHADOW(SH_type_l1_pae_shadow);
@@ -2072,7 +2064,6 @@ void sh_remove_shadows(struct vcpu *v, mfn_t gmfn, int fast, int all)
DO_UNSHADOW(SH_type_l2_64_shadow);
DO_UNSHADOW(SH_type_l1_64_shadow);
#endif
-#endif
#undef DO_UNSHADOW
@@ -2154,11 +2145,9 @@ static void sh_update_paging_modes(struct vcpu *v)
/// PV guest
///
#if CONFIG_PAGING_LEVELS == 4
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,4,4);
-#elif CONFIG_PAGING_LEVELS == 3
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,3,3);
-#else
-#error unexpected paging mode
+ v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 4);
+#else /* CONFIG_PAGING_LEVELS == 3 */
+ v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 3);
#endif
}
else
@@ -2175,11 +2164,7 @@ static void sh_update_paging_modes(struct vcpu *v)
* pagetable for it, mapping 4 GB one-to-one using a single l2
* page of 1024 superpage mappings */
v->arch.guest_table = d->arch.paging.shadow.unpaged_pagetable;
-#if CONFIG_PAGING_LEVELS >= 3
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 3, 2);
-#else
- v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 2, 2);
-#endif
+ v->arch.paging.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode, 2);
}
else
{
@@ -2188,32 +2173,21 @@ static void sh_update_paging_modes(struct vcpu *v)
{
// long mode guest...
v->arch.paging.mode =
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 4, 4);
+ &SHADOW_INTERNAL_NAME(sh_paging_mode, 4);
}
else
#endif
if ( hvm_pae_enabled(v) )
{
-#if CONFIG_PAGING_LEVELS >= 3
// 32-bit PAE mode guest...
v->arch.paging.mode =
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 3, 3);
-#else
- SHADOW_ERROR("PAE not supported in 32-bit Xen\n");
- domain_crash(d);
- return;
-#endif
+ &SHADOW_INTERNAL_NAME(sh_paging_mode, 3);
}
else
{
// 32-bit 2 level guest...
-#if CONFIG_PAGING_LEVELS >= 3
v->arch.paging.mode =
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 3, 2);
-#else
- v->arch.paging.mode =
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 2, 2);
-#endif
+ &SHADOW_INTERNAL_NAME(sh_paging_mode, 2);
}
}
@@ -2227,7 +2201,7 @@ static void sh_update_paging_modes(struct vcpu *v)
if ( v->arch.paging.mode != old_mode )
{
- SHADOW_PRINTK("new paging mode: d=%u v=%u pe=%d g=%u s=%u "
+ SHADOW_PRINTK("new paging mode: d=%u v=%u pe=%d gl=%u "
"(was g=%u s=%u)\n",
d->domain_id, v->vcpu_id,
is_hvm_domain(d) ? hvm_paging_enabled(v) : 1,
@@ -3033,20 +3007,20 @@ void shadow_audit_tables(struct vcpu *v)
/* Dispatch table for getting per-type functions */
static hash_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
- SHADOW_INTERNAL_NAME(sh_audit_l1_table,3,2), /* l1_32 */
- SHADOW_INTERNAL_NAME(sh_audit_fl1_table,3,2), /* fl1_32 */
- SHADOW_INTERNAL_NAME(sh_audit_l2_table,3,2), /* l2_32 */
- SHADOW_INTERNAL_NAME(sh_audit_l1_table,3,3), /* l1_pae */
- SHADOW_INTERNAL_NAME(sh_audit_fl1_table,3,3), /* fl1_pae */
- SHADOW_INTERNAL_NAME(sh_audit_l2_table,3,3), /* l2_pae */
- SHADOW_INTERNAL_NAME(sh_audit_l2_table,3,3), /* l2h_pae */
+ SHADOW_INTERNAL_NAME(sh_audit_l1_table, 2), /* l1_32 */
+ SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 2), /* fl1_32 */
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table, 2), /* l2_32 */
+ SHADOW_INTERNAL_NAME(sh_audit_l1_table, 3), /* l1_pae */
+ SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 3), /* fl1_pae */
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table, 3), /* l2_pae */
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table, 3), /* l2h_pae */
#if CONFIG_PAGING_LEVELS >= 4
- SHADOW_INTERNAL_NAME(sh_audit_l1_table,4,4), /* l1_64 */
- SHADOW_INTERNAL_NAME(sh_audit_fl1_table,4,4), /* fl1_64 */
- SHADOW_INTERNAL_NAME(sh_audit_l2_table,4,4), /* l2_64 */
- SHADOW_INTERNAL_NAME(sh_audit_l2_table,4,4), /* l2h_64 */
- SHADOW_INTERNAL_NAME(sh_audit_l3_table,4,4), /* l3_64 */
- SHADOW_INTERNAL_NAME(sh_audit_l4_table,4,4), /* l4_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_l1_table, 4), /* l1_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 4), /* fl1_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table, 4), /* l2_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table, 4), /* l2h_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_l3_table, 4), /* l3_64 */
+ SHADOW_INTERNAL_NAME(sh_audit_l4_table, 4), /* l4_64 */
#endif /* CONFIG_PAGING_LEVELS >= 4 */
NULL /* All the rest */
};
diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index 0878aacf52..f9f88d6ad4 100644
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -605,7 +605,7 @@ static void sh_audit_gw(struct vcpu *v, walk_t *gw)
#endif /* audit code */
-#if (CONFIG_PAGING_LEVELS == GUEST_PAGING_LEVELS) && (CONFIG_PAGING_LEVELS == SHADOW_PAGING_LEVELS)
+#if (CONFIG_PAGING_LEVELS == GUEST_PAGING_LEVELS)
void *
sh_guest_map_l1e(struct vcpu *v, unsigned long addr,
unsigned long *gl1mfn)
@@ -643,7 +643,7 @@ sh_guest_get_eff_l1e(struct vcpu *v, unsigned long addr, void *eff_l1e)
(void) guest_walk_tables(v, addr, &gw, PFEC_page_present);
*(guest_l1e_t *)eff_l1e = gw.l1e;
}
-#endif /* CONFIG==SHADOW==GUEST */
+#endif /* CONFIG == GUEST (== SHADOW) */
/**************************************************************************/
/* Functions to compute the correct index into a shadow page, given an
@@ -678,7 +678,7 @@ guest_index(void *ptr)
static u32
shadow_l1_index(mfn_t *smfn, u32 guest_index)
{
-#if (GUEST_PAGING_LEVELS == 2) && (SHADOW_PAGING_LEVELS != 2)
+#if (GUEST_PAGING_LEVELS == 2)
*smfn = _mfn(mfn_x(*smfn) +
(guest_index / SHADOW_L1_PAGETABLE_ENTRIES));
return (guest_index % SHADOW_L1_PAGETABLE_ENTRIES);
@@ -690,14 +690,14 @@ shadow_l1_index(mfn_t *smfn, u32 guest_index)
static u32
shadow_l2_index(mfn_t *smfn, u32 guest_index)
{
-#if (GUEST_PAGING_LEVELS == 2) && (SHADOW_PAGING_LEVELS != 2)
+#if (GUEST_PAGING_LEVELS == 2)
// Because we use 2 shadow l2 entries for each guest entry, the number of
// guest entries per shadow page is SHADOW_L2_PAGETABLE_ENTRIES/2
//
*smfn = _mfn(mfn_x(*smfn) +
(guest_index / (SHADOW_L2_PAGETABLE_ENTRIES / 2)));
- // We multiple by two to get the index of the first of the two entries
+ // We multiply by two to get the index of the first of the two entries
// used to shadow the specified guest entry.
return (guest_index % (SHADOW_L2_PAGETABLE_ENTRIES / 2)) * 2;
#else
@@ -721,12 +721,7 @@ shadow_l4_index(mfn_t *smfn, u32 guest_index)
#endif // GUEST_PAGING_LEVELS >= 4
-extern u32 get_pat_flags(struct vcpu *v,
- u32 gl1e_flags,
- paddr_t gpaddr,
- paddr_t spaddr);
-unsigned char pat_type_2_pte_flags(unsigned char pat_type);
/**************************************************************************/
/* Function which computes shadow entries from their corresponding guest
* entries. This is the "heart" of the shadow code. It operates using
@@ -996,7 +991,7 @@ static inline void safe_write_entry(void *dst, void *src)
d[1] = s[1];
d[0] = s[0];
#else
- /* In 32-bit and 64-bit, sizeof(pte) == sizeof(ulong) == 1 word,
+ /* In 64-bit, sizeof(pte) == sizeof(ulong) == 1 word,
* which will be an atomic write, since the entry is aligned. */
BUILD_BUG_ON(sizeof (shadow_l1e_t) != sizeof (unsigned long));
*d = *s;
@@ -1204,7 +1199,7 @@ static int shadow_set_l2e(struct vcpu *v,
shadow_l2e_t old_sl2e;
paddr_t paddr;
-#if GUEST_PAGING_LEVELS == 2 && SHADOW_PAGING_LEVELS > 2
+#if GUEST_PAGING_LEVELS == 2
/* In 2-on-3 we work with pairs of l2es pointing at two-page
* shadows. Reference counting and up-pointers track from the first
* page of the shadow to the first l2e, so make sure that we're
@@ -1232,7 +1227,7 @@ static int shadow_set_l2e(struct vcpu *v,
}
/* Write the new entry */
-#if GUEST_PAGING_LEVELS == 2 && SHADOW_PAGING_LEVELS > 2
+#if GUEST_PAGING_LEVELS == 2
{
shadow_l2e_t pair[2] = { new_sl2e, new_sl2e };
/* The l1 shadow is two pages long and need to be pointed to by
@@ -1418,7 +1413,7 @@ static inline void increment_ptr_to_guest_entry(void *ptr)
#define _SHADOW_FOREACH_L1E(_sl1mfn, _sl1e, _gl1p, _done, _code) \
do { \
int _i; \
- shadow_l1e_t *_sp = map_shadow_page((_sl1mfn)); \
+ shadow_l1e_t *_sp = sh_map_domain_page((_sl1mfn)); \
ASSERT(mfn_to_shadow_page(_sl1mfn)->type == SH_type_l1_shadow \
|| mfn_to_shadow_page(_sl1mfn)->type == SH_type_fl1_shadow); \
for ( _i = 0; _i < SHADOW_L1_PAGETABLE_ENTRIES; _i++ ) \
@@ -1429,7 +1424,7 @@ do { \
if ( _done ) break; \
increment_ptr_to_guest_entry(_gl1p); \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
} while (0)
/* 32-bit l1, on PAE or 64-bit shadows: need to walk both pages of shadow */
@@ -1450,7 +1445,7 @@ do { \
#endif
-#if GUEST_PAGING_LEVELS == 2 && SHADOW_PAGING_LEVELS > 2
+#if GUEST_PAGING_LEVELS == 2
/* 32-bit l2 on PAE/64: four pages, touch every second entry, and avoid Xen */
#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
@@ -1460,7 +1455,7 @@ do { \
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_32_shadow); \
for ( _j = 0; _j < 4 && !__done; _j++ ) \
{ \
- shadow_l2e_t *_sp = map_shadow_page(_sl2mfn); \
+ shadow_l2e_t *_sp = sh_map_domain_page(_sl2mfn); \
for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i += 2 ) \
if ( (!(_xen)) \
|| ((_j * SHADOW_L2_PAGETABLE_ENTRIES) + _i) \
@@ -1472,34 +1467,11 @@ do { \
if ( (__done = (_done)) ) break; \
increment_ptr_to_guest_entry(_gl2p); \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
_sl2mfn = _mfn(mfn_x(_sl2mfn) + 1); \
} \
} while (0)
-#elif GUEST_PAGING_LEVELS == 2
-
-/* 32-bit on 32-bit: avoid Xen entries */
-#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
-do { \
- int _i; \
- int _xen = !shadow_mode_external(_dom); \
- shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
- ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_32_shadow); \
- for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
- if ( (!(_xen)) \
- || \
- (_i < (HYPERVISOR_VIRT_START >> SHADOW_L2_PAGETABLE_SHIFT)) ) \
- { \
- (_sl2e) = _sp + _i; \
- if ( shadow_l2e_get_flags(*(_sl2e)) & _PAGE_PRESENT ) \
- {_code} \
- if ( _done ) break; \
- increment_ptr_to_guest_entry(_gl2p); \
- } \
- unmap_shadow_page(_sp); \
-} while (0)
-
#elif GUEST_PAGING_LEVELS == 3
/* PAE: if it's an l2h, don't touch Xen mappings */
@@ -1507,7 +1479,7 @@ do { \
do { \
int _i; \
int _xen = !shadow_mode_external(_dom); \
- shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
+ shadow_l2e_t *_sp = sh_map_domain_page((_sl2mfn)); \
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_pae_shadow \
|| mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2h_pae_shadow);\
for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
@@ -1522,7 +1494,7 @@ do { \
if ( _done ) break; \
increment_ptr_to_guest_entry(_gl2p); \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
} while (0)
#else
@@ -1532,7 +1504,7 @@ do { \
do { \
int _i; \
int _xen = !shadow_mode_external(_dom); \
- shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
+ shadow_l2e_t *_sp = sh_map_domain_page((_sl2mfn)); \
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_64_shadow || \
mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2h_64_shadow); \
for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
@@ -1549,7 +1521,7 @@ do { \
increment_ptr_to_guest_entry(_gl2p); \
} \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
} while (0)
#endif /* different kinds of l2 */
@@ -1560,7 +1532,7 @@ do { \
#define SHADOW_FOREACH_L3E(_sl3mfn, _sl3e, _gl3p, _done, _code) \
do { \
int _i; \
- shadow_l3e_t *_sp = map_shadow_page((_sl3mfn)); \
+ shadow_l3e_t *_sp = sh_map_domain_page((_sl3mfn)); \
ASSERT(mfn_to_shadow_page(_sl3mfn)->type == SH_type_l3_64_shadow); \
for ( _i = 0; _i < SHADOW_L3_PAGETABLE_ENTRIES; _i++ ) \
{ \
@@ -1570,13 +1542,13 @@ do { \
if ( _done ) break; \
increment_ptr_to_guest_entry(_gl3p); \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
} while (0)
/* 64-bit l4: avoid Xen mappings */
#define SHADOW_FOREACH_L4E(_sl4mfn, _sl4e, _gl4p, _done, _dom, _code) \
do { \
- shadow_l4e_t *_sp = map_shadow_page((_sl4mfn)); \
+ shadow_l4e_t *_sp = sh_map_domain_page((_sl4mfn)); \
int _xen = !shadow_mode_external(_dom); \
int _i; \
ASSERT(mfn_to_shadow_page(_sl4mfn)->type == SH_type_l4_64_shadow); \
@@ -1591,7 +1563,7 @@ do { \
} \
increment_ptr_to_guest_entry(_gl4p); \
} \
- unmap_shadow_page(_sp); \
+ sh_unmap_domain_page(_sp); \
} while (0)
#endif
@@ -2606,7 +2578,7 @@ sh_map_and_validate(struct vcpu *v, mfn_t gmfn,
guest_idx = guest_index(new_gp);
map_mfn = smfn;
shadow_idx = shadow_index(&map_mfn, guest_idx);
- sl1p = map_shadow_page(map_mfn);
+ sl1p = sh_map_domain_page(map_mfn);
/* Validate one entry at a time */
while ( size )
@@ -2618,8 +2590,8 @@ sh_map_and_validate(struct vcpu *v, mfn_t gmfn,
{
/* We have moved to another page of the shadow */
map_mfn = smfn2;
- unmap_shadow_page(sl1p);
- sl1p = map_shadow_page(map_mfn);
+ sh_unmap_domain_page(sl1p);
+ sl1p = sh_map_domain_page(map_mfn);
}
result |= validate_ge(v,
new_gp,
@@ -2628,7 +2600,7 @@ sh_map_and_validate(struct vcpu *v, mfn_t gmfn,
size -= sizeof(guest_l1e_t);
new_gp += sizeof(guest_l1e_t);
}
- unmap_shadow_page(sl1p);
+ sh_unmap_domain_page(sl1p);
return result;
}
@@ -2875,7 +2847,7 @@ static int sh_page_fault(struct vcpu *v,
// bunch of 4K maps.
//
-#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH) && SHADOW_PAGING_LEVELS > 2
+#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH)
if ( (regs->error_code & PFEC_reserved_bit) )
{
/* The only reasons for reserved bits to be set in shadow entries
@@ -3282,7 +3254,7 @@ sh_invlpg(struct vcpu *v, unsigned long va)
if ( (!shadow_l3e_get_flags(sl3e) & _PAGE_PRESENT) )
return 0;
}
-#elif SHADOW_PAGING_LEVELS == 3
+#else /* SHADOW_PAGING_LEVELS == 3 */
if ( !(l3e_get_flags(v->arch.paging.shadow.l3table[shadow_l3_linear_offset(va)])
& _PAGE_PRESENT) )
// no need to flush anything if there's no SL2...
@@ -3827,10 +3799,6 @@ sh_update_cr3(struct vcpu *v, int do_locking)
#error this should never happen
#endif
-#if 0
- printk("%s %s %d gmfn=%05lx shadow.guest_vtable=%p\n",
- __func__, __FILE__, __LINE__, gmfn, v->arch.paging.shadow.guest_vtable);
-#endif
////
//// vcpu->arch.shadow_table[]
@@ -3891,8 +3859,6 @@ sh_update_cr3(struct vcpu *v, int do_locking)
#error This should never happen
#endif
-#if (CONFIG_PAGING_LEVELS == 3) && (GUEST_PAGING_LEVELS == 3)
-#endif
///
/// v->arch.paging.shadow.l3table
@@ -3937,7 +3903,7 @@ sh_update_cr3(struct vcpu *v, int do_locking)
ASSERT(virt_to_maddr(&v->arch.paging.shadow.l3table) <= 0xffffffe0ULL);
v->arch.cr3 = virt_to_maddr(&v->arch.paging.shadow.l3table);
#else
- /* 2-on-2 or 4-on-4: Just use the shadow top-level directly */
+ /* 4-on-4: Just use the shadow top-level directly */
make_cr3(v, pagetable_get_pfn(v->arch.shadow_table[0]));
#endif
}
@@ -3954,7 +3920,7 @@ sh_update_cr3(struct vcpu *v, int do_locking)
v->arch.hvm_vcpu.hw_cr[3] =
virt_to_maddr(&v->arch.paging.shadow.l3table);
#else
- /* 2-on-2 or 4-on-4: Just use the shadow top-level directly */
+ /* 4-on-4: Just use the shadow top-level directly */
v->arch.hvm_vcpu.hw_cr[3] =
pagetable_get_paddr(v->arch.shadow_table[0]);
#endif
@@ -3988,12 +3954,10 @@ static int sh_guess_wrmap(struct vcpu *v, unsigned long vaddr, mfn_t gmfn)
{
shadow_l1e_t sl1e, *sl1p;
shadow_l2e_t *sl2p;
-#if SHADOW_PAGING_LEVELS >= 3
shadow_l3e_t *sl3p;
#if SHADOW_PAGING_LEVELS >= 4
shadow_l4e_t *sl4p;
#endif
-#endif
mfn_t sl1mfn;
int r;
@@ -4005,7 +3969,7 @@ static int sh_guess_wrmap(struct vcpu *v, unsigned long vaddr, mfn_t gmfn)
sl3p = sh_linear_l3_table(v) + shadow_l3_linear_offset(vaddr);
if ( !(shadow_l3e_get_flags(*sl3p) & _PAGE_PRESENT) )
return 0;
-#elif SHADOW_PAGING_LEVELS == 3
+#else /* SHADOW_PAGING_LEVELS == 3 */
sl3p = ((shadow_l3e_t *) v->arch.paging.shadow.l3table)
+ shadow_l3_linear_offset(vaddr);
if ( !(shadow_l3e_get_flags(*sl3p) & _PAGE_PRESENT) )
@@ -4536,7 +4500,7 @@ int sh_audit_l1_table(struct vcpu *v, mfn_t sl1mfn, mfn_t x)
if ( sh_l1e_is_magic(*sl1e) )
{
-#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH) && SHADOW_PAGING_LEVELS > 2
+#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH)
if ( sh_l1e_is_gnp(*sl1e) )
{
if ( guest_l1e_get_flags(*gl1e) & _PAGE_PRESENT )
diff --git a/xen/arch/x86/mm/shadow/multi.h b/xen/arch/x86/mm/shadow/multi.h
index 323c0c7e64..2cd6e7a962 100644
--- a/xen/arch/x86/mm/shadow/multi.h
+++ b/xen/arch/x86/mm/shadow/multi.h
@@ -22,98 +22,96 @@
*/
extern int
-SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_map_and_validate_gl1e, GUEST_LEVELS)(
struct vcpu *v, mfn_t gl1mfn, void *new_gl1p, u32 size);
extern int
-SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, GUEST_LEVELS)(
struct vcpu *v, mfn_t gl2mfn, void *new_gl2p, u32 size);
extern int
-SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, GUEST_LEVELS)(
struct vcpu *v, mfn_t gl2mfn, void *new_gl2p, u32 size);
extern int
-SHADOW_INTERNAL_NAME(sh_map_and_validate_gl3e, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_map_and_validate_gl3e, GUEST_LEVELS)(
struct vcpu *v, mfn_t gl3mfn, void *new_gl3p, u32 size);
extern int
-SHADOW_INTERNAL_NAME(sh_map_and_validate_gl4e, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_map_and_validate_gl4e, GUEST_LEVELS)(
struct vcpu *v, mfn_t gl4mfn, void *new_gl4p, u32 size);
extern void
-SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, GUEST_LEVELS)(
struct vcpu *v, mfn_t smfn);
extern void
-SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, GUEST_LEVELS)(
struct vcpu *v, mfn_t smfn);
extern void
-SHADOW_INTERNAL_NAME(sh_destroy_l3_shadow, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_destroy_l3_shadow, GUEST_LEVELS)(
struct vcpu *v, mfn_t smfn);
extern void
-SHADOW_INTERNAL_NAME(sh_destroy_l4_shadow, SHADOW_LEVELS, GUEST_LEVELS)(
+SHADOW_INTERNAL_NAME(sh_destroy_l4_shadow, GUEST_LEVELS)(
struct vcpu *v, mfn_t smfn);
extern void
-SHADOW_INTERNAL_NAME(sh_unhook_32b_mappings, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_unhook_32b_mappings, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl2mfn);
extern void
-SHADOW_INTERNAL_NAME(sh_unhook_pae_mappings, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_unhook_pae_mappings, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl3mfn);
extern void
-SHADOW_INTERNAL_NAME(sh_unhook_64b_mappings, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_unhook_64b_mappings, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl4mfn);
extern int
-SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl1mfn, mfn_t readonly_mfn);
extern int
-SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl1mfn, mfn_t target_mfn);
extern void
-SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, GUEST_LEVELS)
(struct vcpu *v, void *ep, mfn_t smfn);
extern int
-SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl2mfn, mfn_t sl1mfn);
extern int
-SHADOW_INTERNAL_NAME(sh_remove_l2_shadow, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_remove_l2_shadow, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl3mfn, mfn_t sl2mfn);
extern int
-SHADOW_INTERNAL_NAME(sh_remove_l3_shadow, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_remove_l3_shadow, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl4mfn, mfn_t sl3mfn);
#if SHADOW_AUDIT & SHADOW_AUDIT_ENTRIES
int
-SHADOW_INTERNAL_NAME(sh_audit_l1_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_audit_l1_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl1mfn, mfn_t x);
int
-SHADOW_INTERNAL_NAME(sh_audit_fl1_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_audit_fl1_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl1mfn, mfn_t x);
int
-SHADOW_INTERNAL_NAME(sh_audit_l2_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_audit_l2_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl2mfn, mfn_t x);
int
-SHADOW_INTERNAL_NAME(sh_audit_l3_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_audit_l3_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl3mfn, mfn_t x);
int
-SHADOW_INTERNAL_NAME(sh_audit_l4_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_audit_l4_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t sl4mfn, mfn_t x);
#endif
extern void *
-SHADOW_INTERNAL_NAME(sh_guest_map_l1e, CONFIG_PAGING_LEVELS, CONFIG_PAGING_LEVELS)
+SHADOW_INTERNAL_NAME(sh_guest_map_l1e, CONFIG_PAGING_LEVELS)
(struct vcpu *v, unsigned long va, unsigned long *gl1mfn);
extern void
-SHADOW_INTERNAL_NAME(sh_guest_get_eff_l1e, CONFIG_PAGING_LEVELS, CONFIG_PAGING_LEVELS)
+SHADOW_INTERNAL_NAME(sh_guest_get_eff_l1e, CONFIG_PAGING_LEVELS)
(struct vcpu *v, unsigned long va, void *eff_l1e);
-#if SHADOW_LEVELS == GUEST_LEVELS
extern mfn_t
-SHADOW_INTERNAL_NAME(sh_make_monitor_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_make_monitor_table, GUEST_LEVELS)
(struct vcpu *v);
extern void
-SHADOW_INTERNAL_NAME(sh_destroy_monitor_table, SHADOW_LEVELS, GUEST_LEVELS)
+SHADOW_INTERNAL_NAME(sh_destroy_monitor_table, GUEST_LEVELS)
(struct vcpu *v, mfn_t mmfn);
-#endif
extern struct paging_mode
-SHADOW_INTERNAL_NAME(sh_paging_mode, SHADOW_LEVELS, GUEST_LEVELS);
+SHADOW_INTERNAL_NAME(sh_paging_mode, GUEST_LEVELS);
diff --git a/xen/arch/x86/mm/shadow/private.h b/xen/arch/x86/mm/shadow/private.h
index 0096764b12..de499ebe5c 100644
--- a/xen/arch/x86/mm/shadow/private.h
+++ b/xen/arch/x86/mm/shadow/private.h
@@ -157,49 +157,23 @@ extern void shadow_audit_tables(struct vcpu *v);
* Macro for dealing with the naming of the internal names of the
* shadow code's external entry points.
*/
-#define SHADOW_INTERNAL_NAME_HIDDEN(name, shadow_levels, guest_levels) \
- name ## __shadow_ ## shadow_levels ## _guest_ ## guest_levels
-#define SHADOW_INTERNAL_NAME(name, shadow_levels, guest_levels) \
- SHADOW_INTERNAL_NAME_HIDDEN(name, shadow_levels, guest_levels)
+#define SHADOW_INTERNAL_NAME_HIDDEN(name, guest_levels) \
+ name ## __guest_ ## guest_levels
+#define SHADOW_INTERNAL_NAME(name, guest_levels) \
+ SHADOW_INTERNAL_NAME_HIDDEN(name, guest_levels)
-#if CONFIG_PAGING_LEVELS == 3
#define GUEST_LEVELS 2
-#define SHADOW_LEVELS 3
#include "multi.h"
#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
#define GUEST_LEVELS 3
-#define SHADOW_LEVELS 3
#include "multi.h"
#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
-#endif /* CONFIG_PAGING_LEVELS == 3 */
#if CONFIG_PAGING_LEVELS == 4
-#define GUEST_LEVELS 2
-#define SHADOW_LEVELS 3
-#include "multi.h"
-#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
-
-#define GUEST_LEVELS 3
-#define SHADOW_LEVELS 3
-#include "multi.h"
-#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
-
-#define GUEST_LEVELS 3
-#define SHADOW_LEVELS 4
-#include "multi.h"
-#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
-
#define GUEST_LEVELS 4
-#define SHADOW_LEVELS 4
#include "multi.h"
#undef GUEST_LEVELS
-#undef SHADOW_LEVELS
#endif /* CONFIG_PAGING_LEVELS == 4 */
/******************************************************************************
diff --git a/xen/arch/x86/mm/shadow/types.h b/xen/arch/x86/mm/shadow/types.h
index f353230b6a..3f27a5742c 100644
--- a/xen/arch/x86/mm/shadow/types.h
+++ b/xen/arch/x86/mm/shadow/types.h
@@ -23,26 +23,13 @@
#ifndef _XEN_SHADOW_TYPES_H
#define _XEN_SHADOW_TYPES_H
-// Map a shadow page
-static inline void *
-map_shadow_page(mfn_t smfn)
-{
- // XXX -- Possible optimization/measurement question for 32-bit and PAE
- // hypervisors:
- // How often is this smfn already available in the shadow linear
- // table? Might it be worth checking that table first,
- // presumably using the reverse map hint in the page_info of this
- // smfn, rather than calling map_domain_page()?
- //
- return sh_map_domain_page(smfn);
-}
-
-// matching unmap for map_shadow_page()
-static inline void
-unmap_shadow_page(void *p)
-{
- sh_unmap_domain_page(p);
-}
+/* The number of levels in the shadow pagetable is entirely determined
+ * by the number of levels in the guest pagetable */
+#if GUEST_PAGING_LEVELS == 4
+#define SHADOW_PAGING_LEVELS 4
+#else
+#define SHADOW_PAGING_LEVELS 3
+#endif
/*
* Define various types for handling pagetabels, based on these options:
@@ -50,21 +37,6 @@ unmap_shadow_page(void *p)
* GUEST_PAGING_LEVELS : Number of levels of guest pagetables
*/
-#if (CONFIG_PAGING_LEVELS < SHADOW_PAGING_LEVELS)
-#error Cannot have more levels of shadow pagetables than host pagetables
-#endif
-
-#if (SHADOW_PAGING_LEVELS < GUEST_PAGING_LEVELS)
-#error Cannot have more levels of guest pagetables than shadow pagetables
-#endif
-
-#if SHADOW_PAGING_LEVELS == 2
-#define SHADOW_L1_PAGETABLE_ENTRIES 1024
-#define SHADOW_L2_PAGETABLE_ENTRIES 1024
-#define SHADOW_L1_PAGETABLE_SHIFT 12
-#define SHADOW_L2_PAGETABLE_SHIFT 22
-#endif
-
#if SHADOW_PAGING_LEVELS == 3
#define SHADOW_L1_PAGETABLE_ENTRIES 512
#define SHADOW_L2_PAGETABLE_ENTRIES 512
@@ -72,9 +44,7 @@ unmap_shadow_page(void *p)
#define SHADOW_L1_PAGETABLE_SHIFT 12
#define SHADOW_L2_PAGETABLE_SHIFT 21
#define SHADOW_L3_PAGETABLE_SHIFT 30
-#endif
-
-#if SHADOW_PAGING_LEVELS == 4
+#else /* SHADOW_PAGING_LEVELS == 4 */
#define SHADOW_L1_PAGETABLE_ENTRIES 512
#define SHADOW_L2_PAGETABLE_ENTRIES 512
#define SHADOW_L3_PAGETABLE_ENTRIES 512
@@ -88,52 +58,44 @@ unmap_shadow_page(void *p)
/* Types of the shadow page tables */
typedef l1_pgentry_t shadow_l1e_t;
typedef l2_pgentry_t shadow_l2e_t;
-#if SHADOW_PAGING_LEVELS >= 3
typedef l3_pgentry_t shadow_l3e_t;
#if SHADOW_PAGING_LEVELS >= 4
typedef l4_pgentry_t shadow_l4e_t;
#endif
-#endif
/* Access functions for them */
static inline paddr_t shadow_l1e_get_paddr(shadow_l1e_t sl1e)
{ return l1e_get_paddr(sl1e); }
static inline paddr_t shadow_l2e_get_paddr(shadow_l2e_t sl2e)
{ return l2e_get_paddr(sl2e); }
-#if SHADOW_PAGING_LEVELS >= 3
static inline paddr_t shadow_l3e_get_paddr(shadow_l3e_t sl3e)
{ return l3e_get_paddr(sl3e); }
#if SHADOW_PAGING_LEVELS >= 4
static inline paddr_t shadow_l4e_get_paddr(shadow_l4e_t sl4e)
{ return l4e_get_paddr(sl4e); }
#endif
-#endif
static inline mfn_t shadow_l1e_get_mfn(shadow_l1e_t sl1e)
{ return _mfn(l1e_get_pfn(sl1e)); }
static inline mfn_t shadow_l2e_get_mfn(shadow_l2e_t sl2e)
{ return _mfn(l2e_get_pfn(sl2e)); }
-#if SHADOW_PAGING_LEVELS >= 3
static inline mfn_t shadow_l3e_get_mfn(shadow_l3e_t sl3e)
{ return _mfn(l3e_get_pfn(sl3e)); }
#if SHADOW_PAGING_LEVELS >= 4
static inline mfn_t shadow_l4e_get_mfn(shadow_l4e_t sl4e)
{ return _mfn(l4e_get_pfn(sl4e)); }
#endif
-#endif
static inline u32 shadow_l1e_get_flags(shadow_l1e_t sl1e)
{ return l1e_get_flags(sl1e); }
static inline u32 shadow_l2e_get_flags(shadow_l2e_t sl2e)
{ return l2e_get_flags(sl2e); }
-#if SHADOW_PAGING_LEVELS >= 3
static inline u32 shadow_l3e_get_flags(shadow_l3e_t sl3e)
{ return l3e_get_flags(sl3e); }
#if SHADOW_PAGING_LEVELS >= 4
static inline u32 shadow_l4e_get_flags(shadow_l4e_t sl4e)
{ return l4e_get_flags(sl4e); }
#endif
-#endif
static inline shadow_l1e_t
shadow_l1e_remove_flags(shadow_l1e_t sl1e, u32 flags)
@@ -143,27 +105,23 @@ static inline shadow_l1e_t shadow_l1e_empty(void)
{ return l1e_empty(); }
static inline shadow_l2e_t shadow_l2e_empty(void)
{ return l2e_empty(); }
-#if SHADOW_PAGING_LEVELS >= 3
static inline shadow_l3e_t shadow_l3e_empty(void)
{ return l3e_empty(); }
#if SHADOW_PAGING_LEVELS >= 4
static inline shadow_l4e_t shadow_l4e_empty(void)
{ return l4e_empty(); }
#endif
-#endif
static inline shadow_l1e_t shadow_l1e_from_mfn(mfn_t mfn, u32 flags)
{ return l1e_from_pfn(mfn_x(mfn), flags); }
static inline shadow_l2e_t shadow_l2e_from_mfn(mfn_t mfn, u32 flags)
{ return l2e_from_pfn(mfn_x(mfn), flags); }
-#if SHADOW_PAGING_LEVELS >= 3
static inline shadow_l3e_t shadow_l3e_from_mfn(mfn_t mfn, u32 flags)
{ return l3e_from_pfn(mfn_x(mfn), flags); }
#if SHADOW_PAGING_LEVELS >= 4
static inline shadow_l4e_t shadow_l4e_from_mfn(mfn_t mfn, u32 flags)
{ return l4e_from_pfn(mfn_x(mfn), flags); }
#endif
-#endif
#define shadow_l1_table_offset(a) l1_table_offset(a)
#define shadow_l2_table_offset(a) l2_table_offset(a)
@@ -441,8 +399,7 @@ struct shadow_walk_t
/* macros for dealing with the naming of the internal function names of the
* shadow code's external entry points.
*/
-#define INTERNAL_NAME(name) \
- SHADOW_INTERNAL_NAME(name, SHADOW_PAGING_LEVELS, GUEST_PAGING_LEVELS)
+#define INTERNAL_NAME(name) SHADOW_INTERNAL_NAME(name, GUEST_PAGING_LEVELS)
/* macros for renaming the primary entry points, so that they are more
* easily distinguished from a debugger
@@ -481,42 +438,24 @@ struct shadow_walk_t
#define sh_guess_wrmap INTERNAL_NAME(sh_guess_wrmap)
#define sh_clear_shadow_entry INTERNAL_NAME(sh_clear_shadow_entry)
-/* The sh_guest_(map|get)_* functions only depends on the number of config
- * levels
- */
-#define sh_guest_map_l1e \
- SHADOW_INTERNAL_NAME(sh_guest_map_l1e, \
- CONFIG_PAGING_LEVELS, \
- CONFIG_PAGING_LEVELS)
-#define sh_guest_get_eff_l1e \
- SHADOW_INTERNAL_NAME(sh_guest_get_eff_l1e, \
- CONFIG_PAGING_LEVELS, \
- CONFIG_PAGING_LEVELS)
-
-/* sh_make_monitor_table only depends on the number of shadow levels */
-#define sh_make_monitor_table \
- SHADOW_INTERNAL_NAME(sh_make_monitor_table, \
- SHADOW_PAGING_LEVELS, \
- SHADOW_PAGING_LEVELS)
-#define sh_destroy_monitor_table \
- SHADOW_INTERNAL_NAME(sh_destroy_monitor_table, \
- SHADOW_PAGING_LEVELS, \
- SHADOW_PAGING_LEVELS)
+/* The sh_guest_(map|get)_* functions depends on Xen's paging levels */
+#define sh_guest_map_l1e \
+ SHADOW_INTERNAL_NAME(sh_guest_map_l1e, CONFIG_PAGING_LEVELS)
+#define sh_guest_get_eff_l1e \
+ SHADOW_INTERNAL_NAME(sh_guest_get_eff_l1e, CONFIG_PAGING_LEVELS)
+
+/* sh_make_monitor_table depends only on the number of shadow levels */
+#define sh_make_monitor_table \
+ SHADOW_INTERNAL_NAME(sh_make_monitor_table, SHADOW_PAGING_LEVELS)
+#define sh_destroy_monitor_table \
+ SHADOW_INTERNAL_NAME(sh_destroy_monitor_table, SHADOW_PAGING_LEVELS)
#if SHADOW_PAGING_LEVELS == 3
#define MFN_FITS_IN_HVM_CR3(_MFN) !(mfn_x(_MFN) >> 20)
#endif
-#if SHADOW_PAGING_LEVELS == 2
-#define SH_PRI_pte "08x"
-#else /* SHADOW_PAGING_LEVELS >= 3 */
-#ifndef __x86_64__
-#define SH_PRI_pte "016llx"
-#else
-#define SH_PRI_pte "016lx"
-#endif
-#endif /* SHADOW_PAGING_LEVELS >= 3 */
+#define SH_PRI_pte PRIpte
#if GUEST_PAGING_LEVELS == 2
#define SH_PRI_gpte "08x"
@@ -529,7 +468,7 @@ struct shadow_walk_t
#endif /* GUEST_PAGING_LEVELS >= 3 */
-#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH) && SHADOW_PAGING_LEVELS > 2
+#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH)
/******************************************************************************
* We implement a "fast path" for two special cases: faults that require
* MMIO emulation, and faults where the guest PTE is not present. We
diff --git a/xen/include/asm-x86/mtrr.h b/xen/include/asm-x86/mtrr.h
index caef7b9bf2..7d5ddbb54b 100644
--- a/xen/include/asm-x86/mtrr.h
+++ b/xen/include/asm-x86/mtrr.h
@@ -62,5 +62,8 @@ extern int mtrr_add_page(unsigned long base, unsigned long size,
extern int mtrr_del(int reg, unsigned long base, unsigned long size);
extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
+extern u32 get_pat_flags(struct vcpu *v, u32 gl1e_flags, paddr_t gpaddr,
+ paddr_t spaddr);
+extern unsigned char pat_type_2_pte_flags(unsigned char pat_type);
#endif /* __ASM_X86_MTRR_H__ */