svn commit: r204746 - in user/jmallett/octeon/sys/mips: include mips

Juli Mallett jmallett at FreeBSD.org
Fri Mar 5 00:54:29 UTC 2010


Author: jmallett
Date: Fri Mar  5 00:54:28 2010
New Revision: 204746
URL: http://svn.freebsd.org/changeset/base/204746

Log:
  o) Make SEGSHIFT users use consistent macros instead, so we can mask off the
     sign-extended bits (which is all we have since we don't use XKSEG, etc.,
     yet) and get reasonable values for e.g. nkpt.
  o) Use two pages for pgtab.  This is probably wrong, but since pointers double
     in size with n64, we need more space...though I suppose we could just store
     the 32-bit addresses.

Modified:
  user/jmallett/octeon/sys/mips/include/pmap.h
  user/jmallett/octeon/sys/mips/mips/pmap.c

Modified: user/jmallett/octeon/sys/mips/include/pmap.h
==============================================================================
--- user/jmallett/octeon/sys/mips/include/pmap.h	Fri Mar  5 00:33:05 2010	(r204745)
+++ user/jmallett/octeon/sys/mips/include/pmap.h	Fri Mar  5 00:54:28 2010	(r204746)
@@ -57,9 +57,6 @@
 #define	NKPDE		255	/* addressable number of page tables/pde's */
 #endif
 
-#define	KPTDI		(VM_MIN_KERNEL_ADDRESS >> SEGSHIFT)
-#define	NUSERPGTBLS	(VM_MAXUSER_ADDRESS >> SEGSHIFT)
-
 #ifndef LOCORE
 
 #include <sys/queue.h>

Modified: user/jmallett/octeon/sys/mips/mips/pmap.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/pmap.c	Fri Mar  5 00:33:05 2010	(r204745)
+++ user/jmallett/octeon/sys/mips/mips/pmap.c	Fri Mar  5 00:54:28 2010	(r204746)
@@ -117,8 +117,10 @@ __FBSDID("$FreeBSD$");
 /*
  * Get PDEs and PTEs for user/kernel address space
  */
-#define	pmap_pde(m, v)	       (&((m)->pm_segtab[(vm_offset_t)(v) >> SEGSHIFT]))
-#define	segtab_pde(m, v)	(m[(vm_offset_t)(v) >> SEGSHIFT])
+#define	pmap_segshift(v)	((uintptr_t)(((v) & 0xffffffffu) >> SEGSHIFT))
+#define	pmap_segbase(v)		((vm_offset_t)(intptr_t)(int32_t)((v) << SEGSHIFT))
+#define	pmap_pde(m, v)		(&((m)->pm_segtab[pmap_segshift((v))]))
+#define	segtab_pde(m, v)	((m)[pmap_segshift((v))])
 
 #define	pmap_pte_w(pte)		((*(int *)pte & PTE_W) != 0)
 #define	pmap_pde_v(pte)		((*(int *)pte) != 0)
@@ -128,6 +130,7 @@ __FBSDID("$FreeBSD$");
 #define	pmap_pte_set_w(pte, v)	((v)?(*(int *)pte |= PTE_W):(*(int *)pte &= ~PTE_W))
 #define	pmap_pte_set_prot(pte, v) ((*(int *)pte &= ~PG_PROT), (*(int *)pte |= (v)))
 
+#define	NUSERPGTBLS		(pmap_segshift(VM_MAXUSER_ADDRESS))
 #define	MIPS_SEGSIZE		(1L << SEGSHIFT)
 #define	mips_segtrunc(va)	((va) & ~(MIPS_SEGSIZE-1))
 #define	pmap_TLB_invalidate_all() MIPS_TBIAP()
@@ -217,7 +220,7 @@ pd_entry_t
 pmap_segmap(pmap_t pmap, vm_offset_t va)
 {
 	if (pmap->pm_segtab)
-		return (pmap->pm_segtab[((vm_offset_t)(va) >> SEGSHIFT)]);
+		return (*pmap_pde(pmap, va));
 	else
 		return ((pd_entry_t)0);
 }
@@ -418,9 +421,9 @@ again:
 		 * be somewhere above 0xC0000000 - 0xFFFFFFFF which results
 		 * in about 256 entries or so instead of the 120.
 		 */
-		nkpt = (PAGE_SIZE / sizeof(pd_entry_t)) - (virtual_avail >> SEGSHIFT);
+		nkpt = ((PAGE_SIZE * 2) / sizeof(pd_entry_t)) - pmap_segshift(virtual_avail);
 	}
-	pgtab = (pt_entry_t *)pmap_steal_memory(PAGE_SIZE * nkpt);
+	pgtab = (pt_entry_t *)pmap_steal_memory((PAGE_SIZE * 2) * nkpt);
 
 	/*
 	 * The R[4-7]?00 stores only one copy of the Global bit in the
@@ -436,7 +439,7 @@ again:
 	 * The segment table contains the KVA of the pages in the second
 	 * level page table.
 	 */
-	for (i = 0, j = (virtual_avail >> SEGSHIFT); i < nkpt; i++, j++)
+	for (i = 0, j = pmap_segshift(virtual_avail); i < nkpt; i++, j++)
 		kernel_segmap[j] = (pd_entry_t)(pgtab + (i * NPTEPG));
 
 	/*
@@ -988,7 +991,7 @@ pmap_unuse_pt(pmap_t pmap, vm_offset_t v
 		return (0);
 
 	if (mpte == NULL) {
-		ptepindex = (va >> SEGSHIFT);
+		ptepindex = pmap_segshift(va);
 		if (pmap->pm_ptphint &&
 		    (pmap->pm_ptphint->pindex == ptepindex)) {
 			mpte = pmap->pm_ptphint;
@@ -1150,7 +1153,7 @@ pmap_allocpte(pmap_t pmap, vm_offset_t v
 	/*
 	 * Calculate pagetable page index
 	 */
-	ptepindex = va >> SEGSHIFT;
+	ptepindex = pmap_segshift(va);
 retry:
 	/*
 	 * Get the page directory entry
@@ -2009,7 +2012,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_
 		/*
 		 * Calculate pagetable page index
 		 */
-		ptepindex = va >> SEGSHIFT;
+		ptepindex = pmap_segshift(va);
 		if (mpte && (mpte->pindex == ptepindex)) {
 			mpte->wire_count++;
 		} else {
@@ -3047,7 +3050,7 @@ pmap_pid_dump(int pid)
 			for (i = 0; i < NUSERPGTBLS; i++) {
 				pd_entry_t *pde;
 				pt_entry_t *pte;
-				unsigned base = i << SEGSHIFT;
+				unsigned base = pmap_segbase(i);
 
 				pde = &pmap->pm_segtab[i];
 				if (pde && pmap_pde_v(pde)) {
@@ -3107,7 +3110,7 @@ pads(pmap_t pm)
 	for (i = 0; i < NPTEPG; i++)
 		if (pm->pm_segtab[i])
 			for (j = 0; j < NPTEPG; j++) {
-				va = (i << SEGSHIFT) + (j << PAGE_SHIFT);
+				va = pmap_segbase(i) + (j << PAGE_SHIFT);
 				if (pm == kernel_pmap && va < KERNBASE)
 					continue;
 				if (pm != kernel_pmap &&


More information about the svn-src-user mailing list