aboutsummaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-07 08:38:02 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-07 08:39:12 +0100
commitee5f05310f42a09fa274a3229ff840b639e93a1a (patch)
treefcb443a92ae727510b0b0c35101e4e0e85c61d2d /i386
parentf49fff2b5ecbe53432a484528207d9f2315617f5 (diff)
downloadgnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.tar.gz
gnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.tar.bz2
gnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.zip
Lock get_mapwindow infrastructure
Diffstat (limited to 'i386')
-rw-r--r--i386/intel/pmap.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 3c57d732..91f797bf 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -427,6 +427,7 @@ pt_entry_t *kernel_page_dir;
* physical-to-physical transfers.
*/
static pmap_mapwindow_t mapwindows[PMAP_NMAPWINDOWS];
+decl_simple_lock_data(static, pmapwindows_lock)
static inline pt_entry_t *
pmap_pde(const pmap_t pmap, vm_offset_t addr)
@@ -951,6 +952,7 @@ pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry)
assert(entry != 0);
+ simple_lock(&pmapwindows_lock);
/* Find an empty one. */
for (map = &mapwindows[0]; map < &mapwindows[sizeof (mapwindows) / sizeof (*mapwindows)]; map++)
if (!(*map->entry))
@@ -963,6 +965,7 @@ pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry)
#else /* MACH_PV_PAGETABLES */
WRITE_PTE(map->entry, entry);
#endif /* MACH_PV_PAGETABLES */
+ simple_unlock(&pmapwindows_lock);
return map;
}
@@ -971,12 +974,14 @@ pmap_mapwindow_t *pmap_get_mapwindow(pt_entry_t entry)
*/
void pmap_put_mapwindow(pmap_mapwindow_t *map)
{
+ simple_lock(&pmapwindows_lock);
#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 */
+ simple_unlock(&pmapwindows_lock);
PMAP_UPDATE_TLBS(kernel_pmap, map->vaddr, map->vaddr + PAGE_SIZE);
}