Index: arm/pmap-v6.c =================================================================== --- arm/pmap-v6.c (revision 233911) +++ arm/pmap-v6.c (working copy) @@ -235,9 +235,6 @@ pt_entry_t pte_l1_s_cache_mode; pt_entry_t pte_l1_s_cache_mode_pt; -pt_entry_t pte_l2_l_cache_mode; -pt_entry_t pte_l2_l_cache_mode_pt; - pt_entry_t pte_l2_s_cache_mode; pt_entry_t pte_l2_s_cache_mode_pt; @@ -478,12 +475,10 @@ if (PTE_PAGETABLE >= 3) pmap_needs_pte_sync = 1; - pte_l1_s_cache_mode = l1_mem_types[PTE_CACHE]; - pte_l2_l_cache_mode = l2l_mem_types[PTE_CACHE]; - pte_l2_s_cache_mode = l2s_mem_types[PTE_CACHE]; + pte_l1_s_cache_mode = l1_mem_types[4]; + pte_l2_s_cache_mode = l2s_mem_types[4]; pte_l1_s_cache_mode_pt = l1_mem_types[PTE_PAGETABLE]; - pte_l2_l_cache_mode_pt = l2l_mem_types[PTE_PAGETABLE]; pte_l2_s_cache_mode_pt = l2s_mem_types[PTE_PAGETABLE]; } @@ -1944,6 +1939,8 @@ npv = TAILQ_NEXT(pv, pv_plist); continue; } + if (pmap_is_current(pv->pv_pmap)) + cpu_dcache_wbinv_range(pv->pv_va, PAGE_SIZE); pmap->pm_stats.resident_count--; l2b = pmap_get_l2_bucket(pmap, pv->pv_va); KASSERT(l2b != NULL, ("No L2 bucket in pmap_remove_pages")); @@ -2666,7 +2663,7 @@ if (!(prot & VM_PROT_EXECUTE) && m) npte |= L2_XN; - npte |= pte_l2_s_cache_mode; + npte |= l2s_mem_types[6]; if (m && m == opg) { /* @@ -3132,6 +3129,8 @@ pve = pmap_remove_pv(pg, pm, sva); if (pve) { + if (pmap_is_current(pm)) + cpu_dcache_wbinv_range(pve->pv_va, PAGE_SIZE); is_exec = PV_BEEN_EXECD(pve->pv_flags); is_refd = PV_BEEN_REFD(pve->pv_flags); pmap_free_pv_entry(pve); @@ -3198,6 +3197,7 @@ bzero((void *)(cdstp + off), size); else bzero_page(cdstp); + cpu_dcache_wbinv_range(cdstp, PAGE_SIZE); mtx_unlock(&cmtx); } @@ -3282,7 +3282,9 @@ cpu_tlb_flushD_SE(cdstp); cpu_cpwait(); + cpu_dcache_wbinv_range(csrcp, PAGE_SIZE); bcopy_page(csrcp, cdstp); + cpu_dcache_wbinv_range(cdstp, PAGE_SIZE); mtx_unlock(&cmtx); }