# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID a248738166b189be8a11f57e305403399949b36c
# Parent 5ae96e117af2dccd599de6d3c794ca82fd8df94a
Fix 32-bit shadow mode to handle extended perdomain mapping
area now that mapcache is per domain.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 5ae96e117af2 -r a248738166b1 xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c Wed Jan 11 10:09:17 2006
+++ b/xen/arch/x86/shadow.c Wed Jan 11 10:34:05 2006
@@ -469,6 +469,7 @@
{
unsigned long smfn;
l2_pgentry_t *spl2e;
+ int i;
SH_VVLOG("shadow_l2_table(gpfn=%lx, gmfn=%lx)", gpfn, gmfn);
@@ -503,9 +504,11 @@
spl2e[l2_table_offset(SH_LINEAR_PT_VIRT_START)] =
l2e_from_pfn(smfn, __PAGE_HYPERVISOR);
- spl2e[l2_table_offset(PERDOMAIN_VIRT_START)] =
-
l2e_from_paddr(__pa(page_get_owner(pfn_to_page(gmfn))->arch.mm_perdomain_pt),
- __PAGE_HYPERVISOR);
+ for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
+ spl2e[l2_table_offset(PERDOMAIN_VIRT_START) + i] =
+ l2e_from_page(virt_to_page(page_get_owner(pfn_to_page(gmfn))->
+ arch.mm_perdomain_pt) + i,
+ __PAGE_HYPERVISOR);
if ( shadow_mode_translate(d) ) // NB: not external
{
diff -r 5ae96e117af2 -r a248738166b1 xen/arch/x86/shadow32.c
--- a/xen/arch/x86/shadow32.c Wed Jan 11 10:09:17 2006
+++ b/xen/arch/x86/shadow32.c Wed Jan 11 10:34:05 2006
@@ -726,6 +726,7 @@
l2_pgentry_t *mpl2e;
struct pfn_info *mmfn_info;
struct domain *d = v->domain;
+ int i;
ASSERT(pagetable_get_paddr(v->arch.monitor_table) == 0);
@@ -740,9 +741,10 @@
&idle_pg_table[DOMAIN_ENTRIES_PER_L2_PAGETABLE],
HYPERVISOR_ENTRIES_PER_L2_PAGETABLE * sizeof(l2_pgentry_t));
- mpl2e[l2_table_offset(PERDOMAIN_VIRT_START)] =
- l2e_from_paddr(__pa(d->arch.mm_perdomain_pt),
- __PAGE_HYPERVISOR);
+ for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
+ mpl2e[l2_table_offset(PERDOMAIN_VIRT_START) + i] =
+ l2e_from_page(virt_to_page(d->arch.mm_perdomain_pt) + i,
+ __PAGE_HYPERVISOR);
// map the phys_to_machine map into the Read-Only MPT space for this domain
mpl2e[l2_table_offset(RO_MPT_VIRT_START)] =
@@ -1508,6 +1510,7 @@
{
unsigned long smfn;
l2_pgentry_t *spl2e;
+ int i;
SH_VVLOG("shadow_l2_table(gpfn=%lx, gmfn=%lx)", gpfn, gmfn);
@@ -1542,9 +1545,11 @@
spl2e[l2_table_offset(SH_LINEAR_PT_VIRT_START)] =
l2e_from_pfn(smfn, __PAGE_HYPERVISOR);
- spl2e[l2_table_offset(PERDOMAIN_VIRT_START)] =
-
l2e_from_paddr(__pa(page_get_owner(pfn_to_page(gmfn))->arch.mm_perdomain_pt),
- __PAGE_HYPERVISOR);
+ for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
+ spl2e[l2_table_offset(PERDOMAIN_VIRT_START) + i] =
+ l2e_from_page(virt_to_page(page_get_owner(pfn_to_page(gmfn))->
+ arch.mm_perdomain_pt) + i,
+ __PAGE_HYPERVISOR);
if ( shadow_mode_translate(d) ) // NB: not external
{
diff -r 5ae96e117af2 -r a248738166b1 xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c Wed Jan 11 10:09:17 2006
+++ b/xen/arch/x86/shadow_public.c Wed Jan 11 10:34:05 2006
@@ -328,6 +328,7 @@
l2_pgentry_t *mpl2e;
struct pfn_info *mmfn_info;
struct domain *d = v->domain;
+ int i;
ASSERT(pagetable_get_paddr(v->arch.monitor_table) == 0);
@@ -342,9 +343,10 @@
&idle_pg_table[DOMAIN_ENTRIES_PER_L2_PAGETABLE],
HYPERVISOR_ENTRIES_PER_L2_PAGETABLE * sizeof(l2_pgentry_t));
- mpl2e[l2_table_offset(PERDOMAIN_VIRT_START)] =
- l2e_from_paddr(__pa(d->arch.mm_perdomain_pt),
- __PAGE_HYPERVISOR);
+ for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
+ mpl2e[l2_table_offset(PERDOMAIN_VIRT_START) + i] =
+ l2e_from_page(virt_to_page(d->arch.mm_perdomain_pt) + i,
+ __PAGE_HYPERVISOR);
// map the phys_to_machine map into the Read-Only MPT space for this domain
mpl2e[l2_table_offset(RO_MPT_VIRT_START)] =
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|