Date: Fri, 5 Mar 2010 00:54:28 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r204746 - in user/jmallett/octeon/sys/mips: include mips Message-ID: <201003050054.o250sS7E040401@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 &&
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003050054.o250sS7E040401>