From owner-svn-src-user@FreeBSD.ORG Fri Mar 5 00:54:29 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 26403106564A; Fri, 5 Mar 2010 00:54:29 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 16B0D8FC18; Fri, 5 Mar 2010 00:54:29 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o250sSEe040405; Fri, 5 Mar 2010 00:54:28 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o250sS7E040401; Fri, 5 Mar 2010 00:54:28 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201003050054.o250sS7E040401@svn.freebsd.org> From: Juli Mallett Date: Fri, 5 Mar 2010 00:54:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r204746 - in user/jmallett/octeon/sys/mips: include mips X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Mar 2010 00:54:29 -0000 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 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 &&