Subject: Re: cacheable page tables
To: None <port-arm@netbsd.org>
From: Jason R Thorpe <thorpej@wasabisystems.com>
List: port-arm
Date: 08/23/2002 19:11:52
--St7VIuEGZ6dlpu13
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Wed, Aug 21, 2002 at 10:03:38PM -0700, Jason R Thorpe wrote:

 > I'm going to let this ferment overnight, and check it in in the morning,
 > and then work on improving it some more tomorrow.

...and it's a good thing I let it ferment :-)  There were some bugs in
the original patch, which are now fixed[*].  Attached is the patch I am
checking in.

[*] For the curious, there were two problems:

	1. PTEs in APTE space (i.e. non-curpmap) were being written back,
	   but they also need to be completely evicted from the cache
	   (unlike PTE space PTEs, which are evicted at context switch
	   time).

	2. Yes, they need to be evicted even if you don't change them :-)

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>

--St7VIuEGZ6dlpu13
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=ptp-cache

Index: acorn32/acorn32/rpc_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/acorn32/acorn32/rpc_machdep.c,v
retrieving revision 1.40
diff -c -r1.40 rpc_machdep.c
*** acorn32/acorn32/rpc_machdep.c	2002/08/22 01:13:53	1.40
--- acorn32/acorn32/rpc_machdep.c	2002/08/24 01:58:58
***************
*** 777,800 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    kernel_ptpt.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (VMEM_VBASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_VMEM].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE+ (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop) {
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	}
  
  	/* Map the vector page. */
--- 777,800 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_CACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    kernel_ptpt.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (VMEM_VBASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_VMEM].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_CACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE+ (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop) {
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	}
  
  	/* Map the vector page. */
Index: arm/arm32/pmap.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/arm32/pmap.c,v
retrieving revision 1.112
diff -c -r1.112 pmap.c
*** arm/arm32/pmap.c	2002/08/22 01:13:55	1.112
--- arm/arm32/pmap.c	2002/08/24 01:59:02
***************
*** 340,346 ****
  
  struct l1pt *pmap_alloc_l1pt __P((void));
  static __inline void pmap_map_in_l1 __P((struct pmap *pmap, vaddr_t va,
!      vaddr_t l2pa, boolean_t));
  
  static pt_entry_t *pmap_map_ptes __P((struct pmap *));
  static void pmap_unmap_ptes __P((struct pmap *));
--- 340,346 ----
  
  struct l1pt *pmap_alloc_l1pt __P((void));
  static __inline void pmap_map_in_l1 __P((struct pmap *pmap, vaddr_t va,
!      vaddr_t l2pa, int));
  
  static pt_entry_t *pmap_map_ptes __P((struct pmap *));
  static void pmap_unmap_ptes __P((struct pmap *));
***************
*** 421,426 ****
--- 421,453 ----
  }
  
  /*
+  * PTE_SYNC_CURRENT:
+  *
+  *	Make sure the pte is flushed to RAM.  If the pmap is
+  *	not the current pmap, then also evict the pte from
+  *	any cache lines.
+  */
+ #define	PTE_SYNC_CURRENT(pmap, pte)					\
+ do {									\
+ 	if (pmap_is_curpmap(pmap))					\
+ 		PTE_SYNC(pte);						\
+ 	else								\
+ 		PTE_FLUSH(pte);						\
+ } while (/*CONSTCOND*/0)
+ 
+ /*
+  * PTE_FLUSH_ALT:
+  *
+  *	Make sure the pte is not in any cache lines.  We expect
+  *	this to be used only when a pte has not been modified.
+  */
+ #define	PTE_FLUSH_ALT(pmap, pte)					\
+ do {									\
+ 	if (pmap_is_curpmap(pmap) == 0)					\
+ 		PTE_FLUSH(pte);						\
+ } while (/*CONSTCOND*/0)
+ 
+ /*
   * p v _ e n t r y   f u n c t i o n s
   */
  
***************
*** 903,910 ****
   * the given pmap to cover a chunk of virtual address space starting from the
   * address specified.
   */
  static __inline void
! pmap_map_in_l1(struct pmap *pmap, vaddr_t va, paddr_t l2pa, boolean_t selfref)
  {
  	vaddr_t ptva;
  
--- 930,940 ----
   * the given pmap to cover a chunk of virtual address space starting from the
   * address specified.
   */
+ #define	PMAP_PTP_SELFREF	0x01
+ #define	PMAP_PTP_CACHEABLE	0x02
+ 
  static __inline void
! pmap_map_in_l1(struct pmap *pmap, vaddr_t va, paddr_t l2pa, int flags)
  {
  	vaddr_t ptva;
  
***************
*** 919,927 ****
  	cpu_dcache_wb_range((vaddr_t) &pmap->pm_pdir[ptva + 0], 16);
  
  	/* Map the page table into the page table area. */
! 	if (selfref)
  		*((pt_entry_t *)(pmap->pm_vptpt + ptva)) = L2_S_PROTO | l2pa |
! 		    L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE);
  }
  
  #if 0
--- 949,960 ----
  	cpu_dcache_wb_range((vaddr_t) &pmap->pm_pdir[ptva + 0], 16);
  
  	/* Map the page table into the page table area. */
! 	if (flags & PMAP_PTP_SELFREF) {
  		*((pt_entry_t *)(pmap->pm_vptpt + ptva)) = L2_S_PROTO | l2pa |
! 		    L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE) |
! 		    ((flags & PMAP_PTP_CACHEABLE) ? pte_l2_s_cache_mode : 0);
! 		PTE_SYNC_CURRENT(pmap, (pt_entry_t *)(pmap->pm_vptpt + ptva));
! 	}
  }
  
  #if 0
***************
*** 942,947 ****
--- 975,981 ----
  
  	/* Unmap the page table from the page table area. */
  	*((pt_entry_t *)(pmap->pm_vptpt + ptva)) = 0;
+ 	PTE_SYNC_CURRENT(pmap, (pt_entry_t *)(pmap->pm_vptpt + ptva));
  }
  #endif
  
***************
*** 1446,1452 ****
  	    (L1_TABLE_SIZE - KERNEL_PD_SIZE), KERNEL_PD_SIZE);
  
  	/* Wire in this page table */
! 	pmap_map_in_l1(pmap, PTE_BASE, pmap->pm_pptpt, TRUE);
  
  	pt->pt_flags &= ~PTFLAG_CLEAN;	/* L1 is dirty now */
  
--- 1480,1486 ----
  	    (L1_TABLE_SIZE - KERNEL_PD_SIZE), KERNEL_PD_SIZE);
  
  	/* Wire in this page table */
! 	pmap_map_in_l1(pmap, PTE_BASE, pmap->pm_pptpt, PMAP_PTP_SELFREF);
  
  	pt->pt_flags &= ~PTFLAG_CLEAN;	/* L1 is dirty now */
  
***************
*** 1600,1605 ****
--- 1634,1642 ----
  	simple_lock(&pmap->pm_obj.vmobjlock);
  	while ((page = TAILQ_FIRST(&pmap->pm_obj.memq)) != NULL) {
  		KASSERT((page->flags & PG_BUSY) == 0);
+ 		/* XXXJRT Clean this up. */
+ 		cpu_dcache_inv_range(trunc_page((vaddr_t)vtopte(page->offset)),
+ 		    PAGE_SIZE);
  		page->wire_count = 0;
  		uvm_pagefree(page);
  	}
***************
*** 1796,1801 ****
--- 1833,1839 ----
  	 */
  	*cdst_pte = L2_S_PROTO | phys |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_WRITE) | pte_l2_s_cache_mode;
+ 	PTE_SYNC(cdst_pte);
  	cpu_tlb_flushD_SE(cdstp);
  	cpu_cpwait();
  	bzero_page(cdstp);
***************
*** 1823,1828 ****
--- 1861,1867 ----
  	*cdst_pte = L2_S_PROTO | phys |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_WRITE) |
  	    L2_C | L2_XSCALE_T_TEX(TEX_XSCALE_X);	/* mini-data */
+ 	PTE_SYNC(cdst_pte);
  	cpu_tlb_flushD_SE(cdstp);
  	cpu_cpwait();
  	bzero_page(cdstp);
***************
*** 1857,1862 ****
--- 1896,1902 ----
  	 */
  	*cdst_pte = L2_S_PROTO | phys |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_WRITE) | pte_l2_s_cache_mode;
+ 	PTE_SYNC(cdst_pte);
  	cpu_tlb_flushD_SE(cdstp);
  	cpu_cpwait();
  
***************
*** 1921,1928 ****
--- 1961,1970 ----
  	 */
  	*csrc_pte = L2_S_PROTO | src |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_READ) | pte_l2_s_cache_mode;
+ 	PTE_SYNC(csrc_pte);
  	*cdst_pte = L2_S_PROTO | dst |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_WRITE) | pte_l2_s_cache_mode;
+ 	PTE_SYNC(cdst_pte);
  	cpu_tlb_flushD_SE(csrcp);
  	cpu_tlb_flushD_SE(cdstp);
  	cpu_cpwait();
***************
*** 1964,1972 ****
--- 2006,2016 ----
  	*csrc_pte = L2_S_PROTO | src |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_READ) |
  	    L2_C | L2_XSCALE_T_TEX(TEX_XSCALE_X);	/* mini-data */
+ 	PTE_SYNC(csrc_pte);
  	*cdst_pte = L2_S_PROTO | dst |
  	    L2_S_PROT(PTE_KERNEL, VM_PROT_WRITE) |
  	    L2_C | L2_XSCALE_T_TEX(TEX_XSCALE_X);	/* mini-data */
+ 	PTE_SYNC(cdst_pte);
  	cpu_tlb_flushD_SE(csrcp);
  	cpu_tlb_flushD_SE(cdstp);
  	cpu_cpwait();
***************
*** 2232,2237 ****
--- 2276,2283 ----
  			    || kpmap == npv->pv_pmap) && 
  			    (npv->pv_flags & PVF_NC) == 0) {
  				ptes[arm_btop(npv->pv_va)] &= ~L2_S_CACHE_MASK;
+ 				PTE_SYNC_CURRENT(pmap,
+ 				    &ptes[arm_btop(npv->pv_va)]);
   				npv->pv_flags |= PVF_NC;
  				/*
  				 * If this page needs flushing from the
***************
*** 2265,2270 ****
--- 2311,2318 ----
  			    (npv->pv_flags & PVF_NC)) {
  				ptes[arm_btop(npv->pv_va)] |=
  				    pte_l2_s_cache_mode;
+ 				PTE_SYNC_CURRENT(pmap,
+ 				    &ptes[arm_btop(npv->pv_va)]);
  				npv->pv_flags &= ~PVF_NC;
  			}
  		}
***************
*** 2331,2342 ****
  	/* Now loop along */
  	while (sva < eva) {
  		/* Check if we can move to the next PDE (l1 chunk) */
! 		if (!(sva & L2_ADDR_BITS))
  			if (!pmap_pde_page(pmap_pde(pmap, sva))) {
  				sva += L1_S_SIZE;
  				pte += arm_btop(L1_S_SIZE);
  				continue;
  			}
  
  		/* We've found a valid PTE, so this page of PTEs has to go. */
  		if (pmap_pte_v(pte)) {
--- 2379,2391 ----
  	/* Now loop along */
  	while (sva < eva) {
  		/* Check if we can move to the next PDE (l1 chunk) */
! 		if ((sva & L2_ADDR_BITS) == 0) {
  			if (!pmap_pde_page(pmap_pde(pmap, sva))) {
  				sva += L1_S_SIZE;
  				pte += arm_btop(L1_S_SIZE);
  				continue;
  			}
+ 		}
  
  		/* We've found a valid PTE, so this page of PTEs has to go. */
  		if (pmap_pte_v(pte)) {
***************
*** 2374,2384 ****
  				 * Roll back the previous PTE list,
  				 * and zero out the current PTE.
  				 */
! 				for (cnt = 0; cnt < PMAP_REMOVE_CLEAN_LIST_SIZE; cnt++) {
  					*cleanlist[cnt].pte = 0;
! 					pmap_pte_delref(pmap, cleanlist[cnt].va);
  				}
  				*pte = 0;
  				pmap_pte_delref(pmap, sva);
  				cleanlist_idx++;
  			} else {
--- 2423,2444 ----
  				 * Roll back the previous PTE list,
  				 * and zero out the current PTE.
  				 */
! 				for (cnt = 0;
! 				     cnt < PMAP_REMOVE_CLEAN_LIST_SIZE;
! 				     cnt++) {
  					*cleanlist[cnt].pte = 0;
! 					if (pmap_active)
! 						PTE_SYNC(cleanlist[cnt].pte);
! 					else
! 						PTE_FLUSH(cleanlist[cnt].pte);
! 					pmap_pte_delref(pmap,
! 					    cleanlist[cnt].va);
  				}
  				*pte = 0;
+ 				if (pmap_active)
+ 					PTE_SYNC(pte);
+ 				else
+ 					PTE_FLUSH(pte);
  				pmap_pte_delref(pmap, sva);
  				cleanlist_idx++;
  			} else {
***************
*** 2388,2393 ****
--- 2448,2457 ----
  				 * and we won't need to do it again
  				 */
  				*pte = 0;
+ 				if (pmap_active)
+ 					PTE_SYNC(pte);
+ 				else
+ 					PTE_FLUSH(pte);
  				pmap_pte_delref(pmap, sva);
  			}
  
***************
*** 2404,2410 ****
  				pmap_vac_me_harder(pmap, pg, ptes, FALSE);
  				simple_unlock(&pg->mdpage.pvh_slock);
  			}
! 		}
  		sva += NBPG;
  		pte++;
  	}
--- 2468,2475 ----
  				pmap_vac_me_harder(pmap, pg, ptes, FALSE);
  				simple_unlock(&pg->mdpage.pvh_slock);
  			}
! 		} else if (pmap_active == 0)
! 			PTE_FLUSH(pte);
  		sva += NBPG;
  		pte++;
  	}
***************
*** 2422,2429 ****
  				    NBPG);
  				*cleanlist[cnt].pte = 0;
  				cpu_tlb_flushID_SE(cleanlist[cnt].va);
! 			} else
  				*cleanlist[cnt].pte = 0;
  			pmap_pte_delref(pmap, cleanlist[cnt].va);
  		}
  	}
--- 2487,2497 ----
  				    NBPG);
  				*cleanlist[cnt].pte = 0;
  				cpu_tlb_flushID_SE(cleanlist[cnt].va);
! 				PTE_SYNC(cleanlist[cnt].pte);
! 			} else {
  				*cleanlist[cnt].pte = 0;
+ 				PTE_FLUSH(cleanlist[cnt].pte);
+ 			}
  			pmap_pte_delref(pmap, cleanlist[cnt].va);
  		}
  	}
***************
*** 2498,2503 ****
--- 2566,2572 ----
  #endif
  
  		*pte = 0;
+ 		PTE_SYNC_CURRENT(pmap, pte);
  		pmap_pte_delref(pmap, pv->pv_va);
  
  		npv = pv->pv_next;
***************
*** 2580,2594 ****
  			}
  		}
  
! 		if (!pmap_pte_v(pte))
  			goto next;
  
  		flush = 1;
  
  		*pte &= ~L2_S_PROT_W;		/* clear write bit */
  
  		/* Clear write flag */
! 		if ((pg = PHYS_TO_VM_PAGE(pmap_pte_pa(pte))) != NULL) {
  			simple_lock(&pg->mdpage.pvh_slock);
  			(void) pmap_modify_pv(pmap, sva, pg, PVF_WRITE, 0);
  			pmap_vac_me_harder(pmap, pg, ptes, FALSE);
--- 2649,2668 ----
  			}
  		}
  
! 		if (!pmap_pte_v(pte)) {
! 			PTE_FLUSH_ALT(pmap, pte);
  			goto next;
+ 		}
  
  		flush = 1;
  
+ 		pg = PHYS_TO_VM_PAGE(pmap_pte_pa(pte));
+ 
  		*pte &= ~L2_S_PROT_W;		/* clear write bit */
+ 		PTE_SYNC_CURRENT(pmap, pte);	/* XXXJRT optimize */
  
  		/* Clear write flag */
! 		if (pg != NULL) {
  			simple_lock(&pg->mdpage.pvh_slock);
  			(void) pmap_modify_pv(pmap, sva, pg, PVF_WRITE, 0);
  			pmap_vac_me_harder(pmap, pg, ptes, FALSE);
***************
*** 2749,2754 ****
--- 2823,2830 ----
  				pve = pmap_alloc_pv(pmap, ALLOCPV_NEED);
  				if (pve == NULL) {
  					if (flags & PMAP_CANFAIL) {
+ 						PTE_FLUSH_ALT(pmap,
+ 						    ptes[arm_btop(va)]);
  						error = ENOMEM;
  						goto out;
  					}
***************
*** 2806,2811 ****
--- 2882,2888 ----
  		npte &= ~L2_XSCALE_T_TEX(TEX_XSCALE_X);
  #endif
  	ptes[arm_btop(va)] = npte;
+ 	PTE_SYNC_CURRENT(pmap, &ptes[arm_btop(va)]);
  
  	if (pg != NULL) {
  		simple_lock(&pg->mdpage.pvh_slock);
***************
*** 2973,2978 ****
--- 3050,3056 ----
  #endif
  		/* Extract the physical address of the page */
  		pa = l2pte_pa(ptes[arm_btop(va)]);
+ 		PTE_FLUSH_ALT(pmap, &ptes[arm_btop(va)]);
  
  		if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL)
  			goto out;
***************
*** 3034,3043 ****
--- 3112,3123 ----
  	if (pap != NULL)
  		*pap = pa;
  
+ 	PTE_FLUSH_ALT(pmap, &ptes[arm_btop(va)]);
  	pmap_unmap_ptes(pmap);			/* unlocks pmap */
  	return (TRUE);
  
   failed:
+ 	PTE_FLUSH_ALT(pmap, &ptes[arm_btop(va)]);
  	pmap_unmap_ptes(pmap);			/* unlocks pmap */
  	return (FALSE);
  }
***************
*** 3111,3118 ****
  		simple_lock(&pmap->pm_obj.vmobjlock);
  	}
      
! 	pmap_map_in_l1(p->p_vmspace->vm_map.pmap, APTE_BASE, pmap->pm_pptpt,
! 	    FALSE);
  	cpu_tlb_flushD();
  	cpu_cpwait();
  	return (pt_entry_t *)APTE_BASE;
--- 3191,3198 ----
  		simple_lock(&pmap->pm_obj.vmobjlock);
  	}
      
! 	pmap_map_in_l1(p->p_vmspace->vm_map.pmap, APTE_BASE,
! 	    pmap->pm_pptpt, 0);
  	cpu_tlb_flushD();
  	cpu_cpwait();
  	return (pt_entry_t *)APTE_BASE;
***************
*** 3151,3163 ****
  	struct pv_entry *pv;
  	pt_entry_t *ptes, npte, opte;
  	vaddr_t va;
- 	int tlbentry;
  
  	PDEBUG(1, printf("pmap_clearbit: pa=%08lx mask=%08x\n",
  	    VM_PAGE_TO_PHYS(pg), maskbits));
  
- 	tlbentry = 0;
- 	
  	PMAP_HEAD_TO_MAP_LOCK();
  	simple_lock(&pg->mdpage.pvh_slock);
  	
--- 3231,3240 ----
***************
*** 3254,3263 ****
  
  		if (npte != opte) {
  			ptes[arm_btop(va)] = npte;
  			/* Flush the TLB entry if a current pmap. */
  			if (pmap_is_curpmap(pv->pv_pmap))
  				cpu_tlb_flushID_SE(pv->pv_va);
! 		}
  
  		pmap_unmap_ptes(pv->pv_pmap);		/* unlocks pmap */
  	}
--- 3331,3342 ----
  
  		if (npte != opte) {
  			ptes[arm_btop(va)] = npte;
+ 			PTE_SYNC_CURRENT(pv->pv_pmap, &ptes[arm_btop(va)]);
  			/* Flush the TLB entry if a current pmap. */
  			if (pmap_is_curpmap(pv->pv_pmap))
  				cpu_tlb_flushID_SE(pv->pv_va);
! 		} else
! 			PTE_FLUSH_ALT(pv->pv_pmap, &ptes[arm_btop(va)]);
  
  		pmap_unmap_ptes(pv->pv_pmap);		/* unlocks pmap */
  	}
***************
*** 3346,3351 ****
--- 3425,3435 ----
  
  	PDEBUG(1, printf("pte=%08x\n", ptes[arm_btop(va)]));
  
+ 	/*
+ 	 * Don't need to PTE_FLUSH_ALT() here; this is always done
+ 	 * with the current pmap.
+ 	 */
+ 
  	/* Check for a invalid pte */
  	if (l2pte_valid(ptes[arm_btop(va)]) == 0)
  		goto out;
***************
*** 3391,3396 ****
--- 3475,3481 ----
  	 */
  	ptes[arm_btop(va)] =
  	    (ptes[arm_btop(va)] & ~L2_TYPE_MASK) | L2_S_PROTO | L2_S_PROT_W;
+ 	PTE_SYNC(&ptes[arm_btop(va)]);
  	PDEBUG(0, printf("->(%08x)\n", ptes[arm_btop(va)]));
  
  	simple_unlock(&pg->mdpage.pvh_slock);
***************
*** 3424,3429 ****
--- 3509,3519 ----
  
  	PDEBUG(1, printf("pte=%08x\n", ptes[arm_btop(va)]));
  
+ 	/*
+ 	 * Don't need to PTE_FLUSH_ALT() here; this is always done
+ 	 * with the current pmap.
+ 	 */
+ 
  	/* Check for invalid pte */
  	if (l2pte_valid(ptes[arm_btop(va)]) == 0)
  		goto out;
***************
*** 3449,3454 ****
--- 3539,3545 ----
  	pg->mdpage.pvh_attrs |= PVF_REF;
  
  	ptes[arm_btop(va)] = (ptes[arm_btop(va)] & ~L2_TYPE_MASK) | L2_S_PROTO;
+ 	PTE_SYNC(&ptes[arm_btop(va)]);
  	PDEBUG(0, printf("->(%08x)\n", ptes[arm_btop(va)]));
  
  	simple_unlock(&pg->mdpage.pvh_slock);
***************
*** 3546,3552 ****
  	/* got one! */
  	ptp->flags &= ~PG_BUSY;	/* never busy */
  	ptp->wire_count = 1;	/* no mappings yet */
! 	pmap_map_in_l1(pmap, va, VM_PAGE_TO_PHYS(ptp), TRUE);
  	pmap->pm_stats.resident_count++;	/* count PTP as resident */
  	pmap->pm_ptphint = ptp;
  	return (ptp);
--- 3637,3644 ----
  	/* got one! */
  	ptp->flags &= ~PG_BUSY;	/* never busy */
  	ptp->wire_count = 1;	/* no mappings yet */
! 	pmap_map_in_l1(pmap, va, VM_PAGE_TO_PHYS(ptp),
! 	    PMAP_PTP_SELFREF | PMAP_PTP_CACHEABLE);
  	pmap->pm_stats.resident_count++;	/* count PTP as resident */
  	pmap->pm_ptphint = ptp;
  	return (ptp);
***************
*** 3588,3594 ****
  			pmap_zero_page(ptaddr);
  
  			/* map this page in */
! 			pmap_map_in_l1(kpm, pmap_curmaxkvaddr, ptaddr, TRUE);
  
  			/* count PTP as resident */
  			kpm->pm_stats.resident_count++;
--- 3680,3687 ----
  			pmap_zero_page(ptaddr);
  
  			/* map this page in */
! 			pmap_map_in_l1(kpm, pmap_curmaxkvaddr, ptaddr,
! 			    PMAP_PTP_SELFREF | PMAP_PTP_CACHEABLE);
  
  			/* count PTP as resident */
  			kpm->pm_stats.resident_count++;
***************
*** 3608,3614 ****
  		simple_lock(&pmaps_lock);
  		LIST_FOREACH(pm, &pmaps, pm_list) {
  			pmap_map_in_l1(pm, pmap_curmaxkvaddr,
! 			    VM_PAGE_TO_PHYS(ptp), TRUE); 
  		}
  
  		/* Invalidate the PTPT cache. */
--- 3701,3708 ----
  		simple_lock(&pmaps_lock);
  		LIST_FOREACH(pm, &pmaps, pm_list) {
  			pmap_map_in_l1(pm, pmap_curmaxkvaddr,
! 			    VM_PAGE_TO_PHYS(ptp),
! 			    PMAP_PTP_SELFREF | PMAP_PTP_CACHEABLE); 
  		}
  
  		/* Invalidate the PTPT cache. */
Index: arm/include/arm32/pmap.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/include/arm32/pmap.h,v
retrieving revision 1.57
diff -c -r1.57 pmap.h
*** arm/include/arm32/pmap.h	2002/08/22 01:13:55	1.57
--- arm/include/arm32/pmap.h	2002/08/24 01:59:02
***************
*** 231,247 ****
  #define vtophys(va) \
  	((*vtopte(va) & L2_S_FRAME) | ((vaddr_t) (va) & L2_S_OFFSET))
  
- #if 0 /* Not yet... */
  #define	PTE_SYNC(pte) \
  	cpu_dcache_wb_range((vaddr_t)(pte), sizeof(pt_entry_t))
  
  #define	PTE_SYNC_RANGE(pte, cnt) \
  	cpu_dcache_wb_range((vaddr_t)(pte), (cnt) << 2) /* * sizeof(...) */
! #else
! #define	PTE_SYNC(pte)			(void)(pte)
! 
! #define	PTE_SYNC_RANGE(pte, cnt)	(void)(pte), (void)(cnt)
! #endif
  
  #define	l1pte_valid(pde)	((pde) != 0)
  #define	l1pte_section_p(pde)	(((pde) & L1_TYPE_MASK) == L1_TYPE_S)
--- 231,245 ----
  #define vtophys(va) \
  	((*vtopte(va) & L2_S_FRAME) | ((vaddr_t) (va) & L2_S_OFFSET))
  
  #define	PTE_SYNC(pte) \
  	cpu_dcache_wb_range((vaddr_t)(pte), sizeof(pt_entry_t))
+ #define	PTE_FLUSH(pte) \
+ 	cpu_dcache_wbinv_range((vaddr_t)(pte), sizeof(pt_entry_t))
  
  #define	PTE_SYNC_RANGE(pte, cnt) \
  	cpu_dcache_wb_range((vaddr_t)(pte), (cnt) << 2) /* * sizeof(...) */
! #define	PTE_FLUSH_RANGE(pte) \
! 	cpu_dcache_wbinv_range((vaddr_t)(pte), (cnt) << 2) /* * sizeof(...) */
  
  #define	l1pte_valid(pde)	((pde) != 0)
  #define	l1pte_section_p(pde)	(((pde) & L1_TYPE_MASK) == L1_TYPE_S)
Index: cats/cats/cats_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/cats/cats/cats_machdep.c,v
retrieving revision 1.33
diff -c -r1.33 cats_machdep.c
*** cats/cats/cats_machdep.c	2002/08/21 18:34:31	1.33
--- cats/cats/cats_machdep.c	2002/08/24 01:59:06
***************
*** 632,638 ****
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 632,638 ----
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
***************
*** 641,653 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
--- 641,653 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
Index: evbarm/integrator/integrator_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/evbarm/integrator/integrator_machdep.c,v
retrieving revision 1.26
diff -c -r1.26 integrator_machdep.c
*** evbarm/integrator/integrator_machdep.c	2002/08/21 18:34:32	1.26
--- evbarm/integrator/integrator_machdep.c	2002/08/24 01:59:11
***************
*** 661,667 ****
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 661,667 ----
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
***************
*** 669,681 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* Map the vector page. */
  #if 1
--- 669,681 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* Map the vector page. */
  #if 1
Index: evbarm/iq80310/iq80310_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/evbarm/iq80310/iq80310_machdep.c,v
retrieving revision 1.43
diff -c -r1.43 iq80310_machdep.c
*** evbarm/iq80310/iq80310_machdep.c	2002/08/21 18:34:32	1.43
--- evbarm/iq80310/iq80310_machdep.c	2002/08/24 01:59:11
***************
*** 621,627 ****
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 621,627 ----
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
***************
*** 629,641 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
--- 629,641 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
Index: evbarm/iq80321/iq80321_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/evbarm/iq80321/iq80321_machdep.c,v
retrieving revision 1.10
diff -c -r1.10 iq80321_machdep.c
*** evbarm/iq80321/iq80321_machdep.c	2002/08/21 18:34:32	1.10
--- evbarm/iq80321/iq80321_machdep.c	2002/08/24 01:59:12
***************
*** 620,626 ****
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 620,626 ----
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
***************
*** 628,640 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
--- 628,640 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
Index: evbarm/ixm1200/ixm1200_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/evbarm/ixm1200/ixm1200_machdep.c,v
retrieving revision 1.6
diff -c -r1.6 ixm1200_machdep.c
*** evbarm/ixm1200/ixm1200_machdep.c	2002/08/22 01:13:57	1.6
--- evbarm/ixm1200/ixm1200_machdep.c	2002/08/24 01:59:13
***************
*** 587,607 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 587,607 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_KERNEL + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
Index: hpcarm/hpcarm/hpc_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/hpcarm/hpcarm/hpc_machdep.c,v
retrieving revision 1.53
diff -c -r1.53 hpc_machdep.c
*** hpcarm/hpcarm/hpc_machdep.c	2002/08/22 01:13:57	1.53
--- hpcarm/hpcarm/hpc_machdep.c	2002/08/24 01:59:16
***************
*** 589,605 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop) {
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
--- 589,605 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop) {
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	}
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
***************
*** 607,613 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (SAIPIO_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_IO].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_NOCACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
--- 607,613 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (SAIPIO_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_IO].pv_pa, VM_PROT_READ|VM_PROT_WRITE,
! 	    PTE_CACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
Index: netwinder/netwinder/netwinder_machdep.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/netwinder/netwinder/netwinder_machdep.c,v
retrieving revision 1.35
diff -c -r1.35 netwinder_machdep.c
*** netwinder/netwinder/netwinder_machdep.c	2002/08/21 18:34:33	1.35
--- netwinder/netwinder/netwinder_machdep.c	2002/08/24 01:59:17
***************
*** 617,623 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    kernel_ptpt.pv_pa,
--- 617,623 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (KERNEL_BASE >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_KERNEL].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    kernel_ptpt.pv_pa,
***************
*** 625,637 ****
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
--- 625,637 ----
  	pmap_map_entry(l1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    kernel_pt_table[KERNEL_PT_SYS].pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; ++loop)
  		pmap_map_entry(l1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE +
  		    (loop * 0x00400000)) >> (PGSHIFT-2)),
  		    kernel_pt_table[KERNEL_PT_VMDATA + loop].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* Map the vector page. */
  	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
Index: shark/ofw/ofw.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/shark/ofw/ofw.c,v
retrieving revision 1.19
diff -c -r1.19 ofw.c
*** shark/ofw/ofw.c	2002/08/22 01:13:58	1.19
--- shark/ofw/ofw.c	2002/08/24 01:59:18
***************
*** 1464,1475 ****
  	pmap_map_entry(L1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    proc0_pt_sys.pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (i = 0; i < KERNEL_IMG_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((KERNEL_BASE + i * 0x00400000) >> (PGSHIFT-2)),
  		    proc0_pt_kernel[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	pmap_map_entry(L1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    proc0_pt_pte.pv_pa,
--- 1464,1475 ----
  	pmap_map_entry(L1pagetable,
  	    PTE_BASE + (0x00000000 >> (PGSHIFT-2)),
  	    proc0_pt_sys.pv_pa,
! 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (i = 0; i < KERNEL_IMG_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((KERNEL_BASE + i * 0x00400000) >> (PGSHIFT-2)),
  		    proc0_pt_kernel[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	pmap_map_entry(L1pagetable,
  	    PTE_BASE + (PTE_BASE >> (PGSHIFT-2)),
  	    proc0_pt_pte.pv_pa,
***************
*** 1478,1494 ****
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_vmdata[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (i = 0; i < KERNEL_OFW_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((OFW_VIRT_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_ofw[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  	for (i = 0; i < KERNEL_IO_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((IO_VIRT_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_io[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
  
  	/* update the top of the kernel VM */
  	pmap_curmaxkvaddr =
--- 1478,1494 ----
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((KERNEL_VM_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_vmdata[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (i = 0; i < KERNEL_OFW_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((OFW_VIRT_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_ofw[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  	for (i = 0; i < KERNEL_IO_PTS; i++)
  		pmap_map_entry(L1pagetable,
  		    PTE_BASE + ((IO_VIRT_BASE + i * 0x00400000)
  		    >> (PGSHIFT-2)), proc0_pt_io[i].pv_pa,
! 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
  
  	/* update the top of the kernel VM */
  	pmap_curmaxkvaddr =

--St7VIuEGZ6dlpu13--