summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2016-09-01 23:35:46 +0200
committerRichard Braun <rbraun@sceen.net>2016-09-01 23:36:48 +0200
commit094cfe430457e15d34098af6a04e7f9af950d414 (patch)
tree5e850593e3952554b97e2c51c2ab45d283af8c78
parent3604c418a73fedeb29b8902f36e6ee4dbbb68113 (diff)
pmap: fix map window creation on xen
* i386/intel/pmap.c (pmap_get_mapwindow, pmap_put_mapwindow): Use the appropriate xen hypercall if building for paravirtualized page table management.
-rw-r--r--i386/intel/pmap.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index be1dec7a..e85e5480 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -891,13 +891,20 @@ pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry)
{
pmap_mapwindow_t *map;
+ assert(entry != 0);
+
/* Find an empty one. */
for (map = &mapwindows[0]; map < &mapwindows[sizeof (mapwindows) / sizeof (*mapwindows)]; map++)
if (!(*map->entry))
break;
assert(map < &mapwindows[sizeof (mapwindows) / sizeof (*mapwindows)]);
+#ifdef MACH_PV_PAGETABLES
+ if (!hyp_mmu_update_pte(kv_to_ma(map->entry), pa_to_ma(entry)))
+ panic("pmap_get_mapwindow");
+#else /* MACH_PV_PAGETABLES */
WRITE_PTE(map->entry, entry);
+#endif /* MACH_PV_PAGETABLES */
return map;
}
@@ -906,7 +913,12 @@ pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry)
*/
void pmap_put_mapwindow(pmap_mapwindow_t *map)
{
+#ifdef MACH_PV_PAGETABLES
+ if (!hyp_mmu_update_pte(kv_to_ma(map->entry), 0))
+ panic("pmap_put_mapwindow");
+#else /* MACH_PV_PAGETABLES */
WRITE_PTE(map->entry, 0);
+#endif /* MACH_PV_PAGETABLES */
PMAP_UPDATE_TLBS(kernel_pmap, map->vaddr, map->vaddr + PAGE_SIZE);
}