diff --git a/sys/arch/mips/include/pmap.h b/sys/arch/mips/include/pmap.h index 281715f5c056..9e9276184c91 100644 --- a/sys/arch/mips/include/pmap.h +++ b/sys/arch/mips/include/pmap.h @@ -140,6 +140,24 @@ pmap_md_cache_prefer_mask(void) { return MIPS_HAS_R4K_MMU ? mips_cache_info.mci_cache_prefer_mask : 0; } + +static inline void +pmap_md_xtab_activate(struct pmap *pm, struct lwp *l) +{ + const struct mips_cache_info * const mci = &mips_cache_info; + + if (mci->mci_picache_vivt) + mips_icache_sync_all(); + +} + +static inline void +pmap_md_xtab_deactivate(struct pmap *pm) +{ + + /* nothing */ +} + #endif /* __PMAP_PRIVATE */ struct tlbmask { diff --git a/sys/uvm/pmap/pmap.c b/sys/uvm/pmap/pmap.c index b69f2cdf8995..dc9f6805571b 100644 --- a/sys/uvm/pmap/pmap.c +++ b/sys/uvm/pmap/pmap.c @@ -869,11 +869,8 @@ pmap_deactivate(struct lwp *l) kpreempt_disable(); KASSERT(l == curlwp || l->l_cpu == curlwp->l_cpu); pmap_tlb_miss_lock_enter(); - curcpu()->ci_pmap_user_segtab = PMAP_INVALID_SEGTAB_ADDRESS; -#ifdef _LP64 - curcpu()->ci_pmap_user_seg0tab = NULL; -#endif pmap_tlb_asid_deactivate(pmap); + pmap_segtab_deactivate(pmap); pmap_tlb_miss_lock_exit(); kpreempt_enable(); diff --git a/sys/uvm/pmap/pmap.h b/sys/uvm/pmap/pmap.h index 0a84f92d18b7..6046d450b8ee 100644 --- a/sys/uvm/pmap/pmap.h +++ b/sys/uvm/pmap/pmap.h @@ -114,6 +114,7 @@ pt_entry_t *pmap_pte_reserve(struct pmap *, vaddr_t, int); void pmap_pte_process(struct pmap *, vaddr_t, vaddr_t, pte_callback_t, uintptr_t); void pmap_segtab_activate(struct pmap *, struct lwp *); +void pmap_segtab_deactivate(struct pmap *); void pmap_segtab_init(struct pmap *); void pmap_segtab_destroy(struct pmap *, pte_callback_t, uintptr_t); extern kmutex_t pmap_segtab_lock; diff --git a/sys/uvm/pmap/pmap_segtab.c b/sys/uvm/pmap/pmap_segtab.c index c7e2e78f2b04..d710f2f6d61a 100644 --- a/sys/uvm/pmap/pmap_segtab.c +++ b/sys/uvm/pmap/pmap_segtab.c @@ -370,6 +370,7 @@ pmap_segtab_activate(struct pmap *pm, struct lwp *l) { if (l == curlwp) { struct cpu_info * const ci = l->l_cpu; + pmap_md_xtab_activate(pm, l); KASSERT(pm == l->l_proc->p_vmspace->vm_map.pmap); if (pm == pmap_kernel()) { ci->ci_pmap_user_segtab = PMAP_INVALID_SEGTAB_ADDRESS; @@ -385,6 +386,20 @@ pmap_segtab_activate(struct pmap *pm, struct lwp *l) } } + +void +pmap_segtab_deactivate(pmap_t pm) +{ + + pmap_md_xtab_deactivate(pm); + + curcpu()->ci_pmap_user_segtab = PMAP_INVALID_SEGTAB_ADDRESS; +#ifdef _LP64 + curcpu()->ci_pmap_user_seg0tab = NULL; +#endif + +} + /* * Act on the given range of addresses from the specified map. *