diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-02-07 08:38:02 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-02-07 08:39:12 +0100 |
commit | ee5f05310f42a09fa274a3229ff840b639e93a1a (patch) | |
tree | fcb443a92ae727510b0b0c35101e4e0e85c61d2d /i386/intel | |
parent | f49fff2b5ecbe53432a484528207d9f2315617f5 (diff) | |
download | gnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.tar.gz gnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.tar.bz2 gnumach-ee5f05310f42a09fa274a3229ff840b639e93a1a.zip |
Lock get_mapwindow infrastructure
Diffstat (limited to 'i386/intel')
-rw-r--r-- | i386/intel/pmap.c | 5 |
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); } |