Module Name:    src
Committed By:   matt
Date:           Sat Feb  6 06:02:29 UTC 2010

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: pmap.c

Log Message:
Add some prelim poolpage debugging code.
Don't use ptoa to expand pfns to paddrs since it's cast with a vaddr_t.


To generate a diff of this commit:
cvs rdiff -u -r1.179.16.14 -r1.179.16.15 src/sys/arch/mips/mips/pmap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/mips/pmap.c
diff -u src/sys/arch/mips/mips/pmap.c:1.179.16.14 src/sys/arch/mips/mips/pmap.c:1.179.16.15
--- src/sys/arch/mips/mips/pmap.c:1.179.16.14	Tue Jan 26 22:49:58 2010
+++ src/sys/arch/mips/mips/pmap.c	Sat Feb  6 06:02:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.179.16.14 2010/01/26 22:49:58 snj Exp $	*/
+/*	$NetBSD: pmap.c,v 1.179.16.15 2010/02/06 06:02:29 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.179.16.14 2010/01/26 22:49:58 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.179.16.15 2010/02/06 06:02:29 matt Exp $");
 
 /*
  *	Manages physical address maps.
@@ -264,6 +264,15 @@
 pt_entry_t	*Sysmap;		/* kernel pte table */
 unsigned int	Sysmapsize;		/* number of pte's in Sysmap */
 
+#ifdef PMAP_POOLPAGE_DEBUG
+struct poolpage_info {
+	vaddr_t base;
+	vaddr_t size;
+	vaddr_t hint;
+	pt_entry_t *sysmap;
+} poolpage;
+#endif
+
 /*
  * The pools from which pmap structures and sub-structures are allocated.
  */
@@ -463,6 +472,10 @@
 #ifdef KSEG2IOBUFSIZE
 	Sysmapsize += (KSEG2IOBUFSIZE >> PGSHIFT);
 #endif
+#ifdef PMAP_POOLPAGE_DEBUG
+	poolpage.size = nkmempages + MCLBYTES * nmbclusters;
+	Sysmapsize += poolpage.size;
+#endif
 	/* XXX: else runs out of space on 256MB sbmips!! */
 	Sysmapsize += 20000;
 
@@ -472,8 +485,8 @@
 	 * for us.  Must do this before uvm_pageboot_alloc()
 	 * can be called.
 	 */
-	mips_avail_start = ptoa(vm_physmem[0].start);
-	mips_avail_end = ptoa(vm_physmem[vm_nphysseg - 1].end);
+	mips_avail_start = vm_physmem[0].start << PGSHIFT;
+	mips_avail_end = vm_physmem[vm_nphysseg - 1].end << PGSHIFT;
 	mips_virtual_end = VM_MIN_KERNEL_ADDRESS + Sysmapsize * NBPG;
 #ifndef _LP64
 	if (mips_virtual_end > VM_MAX_KERNEL_ADDRESS) {
@@ -490,6 +503,11 @@
 	Sysmap = (pt_entry_t *)
 	    uvm_pageboot_alloc(sizeof(pt_entry_t) * Sysmapsize);
 
+#ifdef PMAP_POOLPAGE_DEBUG
+	mips_virtual_end -= poolpage.limit;
+	poolpage.base = mips_virtual_end;
+	poolpage.sysmap += Sysmap + atop(poolpage.size);
+#endif
 	/*
 	 * Initialize the pools.
 	 */
@@ -654,8 +672,10 @@
 	if (mips_avail_end > MIPS_KSEG1_START - MIPS_KSEG0_START) {
 		curcpu()->ci_pmap_dstbase = uvm_km_alloc(kernel_map,
 		    uvmexp.ncolors * PAGE_SIZE, 0, UVM_KMF_VAONLY);
+		KASSERT(curcpu()->ci_pmap_dstbase);
 		curcpu()->ci_pmap_srcbase = uvm_km_alloc(kernel_map,
 		    uvmexp.ncolors * PAGE_SIZE, 0, UVM_KMF_VAONLY);
+		KASSERT(curcpu()->ci_pmap_srcbase);
 	}
 #endif
 	
@@ -2178,6 +2198,35 @@
 {
 	vaddr_t va;
 
+	struct vm_page *pg = PHYS_TO_VM_PAGE(pa);
+	KASSERT(pg);
+	pmap_set_page_attributes(pg, PG_MD_POOLPAGE);
+
+#ifdef PMAP_POOLPAGE_DEBUG
+	KASSERT((poolpage.hint & MIPS_CACHE_ALIAS_MASK) == 0);
+	vaddr_t va_offset = poolpage.hint + mips_cache_indexof(pa);
+	pt_entry_t *pte = poolpage.sysmap + atop(va_offset);
+	const size_t va_inc = MIPS_CACHE_ALIAS_MASK + PAGE_SIZE;
+	const size_t pte_inc = atop(va_inc);
+
+	for (; va_offset < poolpage.size;
+	     va_offset += va_inc, pte += pte_inc) {
+		if (!mips_pg_v(pte->pt_entry))
+			break;
+	}
+	if (va_offset >= poolpage.size) {
+		for (va_offset -= poolpage.size, pte -= atop(poolpage.size);
+		     va_offset < poolpage.hint;
+		     va_offset += va_inc, pte += pte_inc) {
+			if (!mips_pg_v(pte->pt_entry))
+				break;
+		}
+	}
+	KASSERT(!mips_pg_v(pte->pt_entry));
+	va = poolpage.base + va_offset;
+	poolpage.hint = roundup2(va_offset + 1, va_inc);
+	pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PORT_WRITE);
+#else
 #ifdef _LP64
 	KASSERT(mips_options.mips3_xkphys_cached);
 	va = MIPS_PHYS_TO_XKPHYS_CACHED(pa);
@@ -2188,10 +2237,8 @@
 
 	va = MIPS_PHYS_TO_KSEG0(pa);
 #endif
-	struct vm_page *pg = PHYS_TO_VM_PAGE(pa);
-	KASSERT(pg);
-	pmap_set_page_attributes(pg, PG_MD_POOLPAGE);
-#if defined(MIPS3_PLUS)
+#endif
+#if !defined(_LP64) || defined(PMAP_POOLPAGE_DEBUG)
 	if (MIPS_CACHE_VIRTUAL_ALIAS) {
 		/*
 		 * If this page was last mapped with an address that might
@@ -2211,8 +2258,10 @@
 mips_pmap_unmap_poolpage(vaddr_t va)
 {
 	paddr_t pa;
-
-#ifdef _LP64
+#ifdef PMAP_POOLPAGE_DEBUG
+	KASSERT(poolpage.start <= va && va < poolpage.start + poolpage.size);
+	pa = mips_tlbpfn_to_paddr(kvtopte(va)->pt_entry);
+#elif defined(_LP64)
 	KASSERT(MIPS_XKPHYS_P(va));
 	pa = MIPS_XKPHYS_TO_PHYS(va);
 #else
@@ -2220,12 +2269,19 @@
 	pa = MIPS_KSEG0_TO_PHYS(va);
 #endif
 	struct vm_page *pg = PHYS_TO_VM_PAGE(pa);
+	KASSERT(pg);
 	pmap_clear_page_attributes(pg, PG_MD_POOLPAGE);
 #if defined(MIPS3_PLUS)
 	if (MIPS_CACHE_VIRTUAL_ALIAS) {
+		/*
+		 * We've unmapped a poolpage.  Its contents are irrelavent.
+		 */
 		mips_dcache_inv_range(va, PAGE_SIZE);
 	}
 #endif
+#ifdef PMAP_POOLPAGE_DEBUG
+	pmap_kremove(va, PAGE_SIZE);
+#endif
 	return pa;
 }
 

Reply via email to