svn commit: r206249 - in user/jmallett/octeon/sys/mips: include mips
Juli Mallett
jmallett at FreeBSD.org
Tue Apr 6 05:52:22 UTC 2010
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
More information about the svn-src-user
mailing list