diff options
author | Richard Braun <rbraun@sceen.net> | 2016-09-01 23:35:46 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2016-09-01 23:36:48 +0200 |
commit | 094cfe430457e15d34098af6a04e7f9af950d414 (patch) | |
tree | 5e850593e3952554b97e2c51c2ab45d283af8c78 /i386/intel | |
parent | 3604c418a73fedeb29b8902f36e6ee4dbbb68113 (diff) | |
download | gnumach-094cfe430457e15d34098af6a04e7f9af950d414.tar.gz gnumach-094cfe430457e15d34098af6a04e7f9af950d414.tar.bz2 gnumach-094cfe430457e15d34098af6a04e7f9af950d414.zip |
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.
Diffstat (limited to 'i386/intel')
-rw-r--r-- | i386/intel/pmap.c | 12 |
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); } |