Date: Tue, 6 Apr 2010 05:52:22 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r206249 - in user/jmallett/octeon/sys/mips: include mips Message-ID: <201004060552.o365qMtW062973@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jmallett Date: Tue Apr 6 05:52:22 2010 New Revision: 206249 URL: http://svn.freebsd.org/changeset/base/206249 Log: o) Retire pmap_segbase for the near future... o) Make pmap_segshift mask based on the number of page directory entries in the page directory. Exception processing code should do the same thing and then we should tune NPDEPG downwards so that we don't end up with (as we do with this commit) a bunch of empty page tables in the kernel page directory on N64. Of course, on N64 we should really switch to allocating virtual addresses from the XKSEG, which we could now do quite easily... Modified: user/jmallett/octeon/sys/mips/include/param.h user/jmallett/octeon/sys/mips/mips/pmap.c Modified: user/jmallett/octeon/sys/mips/include/param.h ============================================================================== --- user/jmallett/octeon/sys/mips/include/param.h Tue Apr 6 05:20:46 2010 (r206248) +++ user/jmallett/octeon/sys/mips/include/param.h Tue Apr 6 05:52:22 2010 (r206249) @@ -104,6 +104,7 @@ #define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */ #define PAGE_MASK (PAGE_SIZE-1) #define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t))) +#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t))) #define MAXPAGESIZES 1 /* maximum number of supported page sizes */ Modified: user/jmallett/octeon/sys/mips/mips/pmap.c ============================================================================== --- user/jmallett/octeon/sys/mips/mips/pmap.c Tue Apr 6 05:20:46 2010 (r206248) +++ user/jmallett/octeon/sys/mips/mips/pmap.c Tue Apr 6 05:52:22 2010 (r206249) @@ -118,8 +118,7 @@ __FBSDID("$FreeBSD$"); /* * Get PDEs and PTEs for user/kernel address space */ -#define pmap_segshift(v) ((uintptr_t)(((v) & 0xffffffffu) >> SEGSHIFT)) -#define pmap_segbase(v) ((vm_offset_t)(intptr_t)(int32_t)((v) << SEGSHIFT)) +#define pmap_segshift(v) (((v) >> SEGSHIFT) & (NPDEPG - 1)) #define pmap_pde(m, v) (&((m)->pm_segtab[pmap_segshift((v))])) #define segtab_pde(m, v) ((m)[pmap_segshift((v))]) @@ -3099,127 +3098,6 @@ pmap_align_superpage(vm_object_t object, *addr = ((*addr + SEGOFSET) & ~SEGOFSET) + superpage_offset; } -int pmap_pid_dump(int pid); - -int -pmap_pid_dump(int pid) -{ - pmap_t pmap; - struct proc *p; - int npte = 0; - int index; - - sx_slock(&allproc_lock); - LIST_FOREACH(p, &allproc, p_list) { - if (p->p_pid != pid) - continue; - - if (p->p_vmspace) { - int i, j; - - printf("vmspace is %p\n", - p->p_vmspace); - index = 0; - pmap = vmspace_pmap(p->p_vmspace); - printf("pmap asid:%x generation:%x\n", - pmap->pm_asid[0].asid, - pmap->pm_asid[0].gen); - for (i = 0; i < NUSERPGTBLS; i++) { - pd_entry_t *pde; - pt_entry_t *pte; - unsigned base = pmap_segbase(i); - - pde = &pmap->pm_segtab[i]; - if (pde && *pde != 0) { - for (j = 0; j < 1024; j++) { - vm_offset_t va = base + - (j << PAGE_SHIFT); - - pte = pmap_pte(pmap, va); - if (pte && pte_test(pte, PG_V)) { - vm_offset_t pa; - vm_page_t m; - - pa = TLBLO_PTE_TO_PA(*pte); - m = PHYS_TO_VM_PAGE(pa); - printf("va: %p, pt: %p, h: %d, w: %d, f: 0x%x", - (void *)va, - (void *)pa, - m->hold_count, - m->wire_count, - m->flags); - npte++; - index++; - if (index >= 2) { - index = 0; - printf("\n"); - } else { - printf(" "); - } - } - } - } - } - } else { - printf("Process pid:%d has no vm_space\n", pid); - } - break; - } - sx_sunlock(&allproc_lock); - return npte; -} - - -#if defined(DEBUG) - -static void pads(pmap_t pm); -void pmap_pvdump(vm_offset_t pa); - -/* print address space of pmap*/ -static void -pads(pmap_t pm) -{ - unsigned va, i, j; - pt_entry_t *ptep; - - if (pm == kernel_pmap) - return; - for (i = 0; i < NPTEPG; i++) - if (pm->pm_segtab[i]) - for (j = 0; j < NPTEPG; j++) { - va = pmap_segbase(i) + (j << PAGE_SHIFT); - if (pm == kernel_pmap && va < KERNBASE) - continue; - if (pm != kernel_pmap && - va >= VM_MAXUSER_ADDRESS) - continue; - ptep = pmap_pte(pm, va); - if (pmap_pte_v(ptep)) - printf("%x:%x ", va, *(int *)ptep); - } - -} - -void -pmap_pvdump(vm_offset_t pa) -{ - pv_entry_t pv; - vm_page_t m; - - printf("pa %x", pa); - m = PHYS_TO_VM_PAGE(pa); - for (pv = TAILQ_FIRST(&m->md.pv_list); pv; - pv = TAILQ_NEXT(pv, pv_list)) { - printf(" -> pmap %p, va %x", (void *)pv->pv_pmap, pv->pv_va); - pads(pv->pv_pmap); - } - printf(" "); -} - -/* N/C */ -#endif - - /* * Allocate TLB address space tag (called ASID or TLBPID) and return it. * It takes almost as much or more time to search the TLB for a
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004060552.o365qMtW062973>