Module Name:    src
Committed By:   skrll
Date:           Fri Dec 18 15:20:15 UTC 2009

Modified Files:
        src/sys/arch/hppa/hppa: pmap.c

Log Message:
Fix pmap_dump_table so that it doesn't loop indefinitely for a space that
doesn't map anything in the last PDE.

Also, don't loop unnecessarily through the spaces.


To generate a diff of this commit:
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/hppa/hppa/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/hppa/hppa/pmap.c
diff -u src/sys/arch/hppa/hppa/pmap.c:1.60 src/sys/arch/hppa/hppa/pmap.c:1.61
--- src/sys/arch/hppa/hppa/pmap.c:1.60	Sat Nov 28 13:53:28 2009
+++ src/sys/arch/hppa/hppa/pmap.c	Fri Dec 18 15:20:15 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.60 2009/11/28 13:53:28 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.61 2009/12/18 15:20:15 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.60 2009/11/28 13:53:28 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61 2009/12/18 15:20:15 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -447,38 +447,39 @@
 pmap_dump_table(pa_space_t space, vaddr_t sva)
 {
 	char buf[64];
-	pa_space_t sp;
-
-	for (sp = 0; sp <= hppa_sid_max; sp++) {
-		volatile pt_entry_t *pde = NULL;
-		pt_entry_t pte;
-		vaddr_t va, pdemask;
-		uint32_t *pd;
+	volatile pt_entry_t *pde = NULL;
+	vaddr_t va = sva;
+	vaddr_t pdemask = 1;
+	pt_entry_t pte;
+	uint32_t *pd;
 
-		if (((int)space >= 0 && sp != space) ||
-		    !(pd = pmap_sdir_get(sp)))
-			continue;
+	if (space > hppa_sid_max)
+		return;
 
-		for (pdemask = 1, va = sva ? sva : 0;
-		    va < 0xfffff000; va += PAGE_SIZE) {
-			if (pdemask != (va & PDE_MASK)) {
-				pdemask = va & PDE_MASK;
-				if (!(pde = pmap_pde_get(pd, va))) {
-					va = pdemask + PDE_SIZE - PAGE_SIZE;
-					continue;
-				}
-				printf("%x:%8p:\n", sp, pde);
-			}
+	pd = pmap_sdir_get(space);
+	if (!pd)
+		return;
 
-			if (!(pte = pmap_pte_get(pde, va)))
+	do {
+		if (pdemask != (va & PDE_MASK)) {
+			pdemask = va & PDE_MASK;
+			pde = pmap_pde_get(pd, va);
+			if (!pde) {
+				va = pdemask + PDE_SIZE;
 				continue;
+			}
+			printf("%x:%8p:\n", space, pde);
+		}
 
+		pte = pmap_pte_get(pde, va);
+		if (pte) {
 			snprintb(buf, sizeof(buf), TLB_BITS,
 			   TLB_PROT(pte & PAGE_MASK));
 			printf("0x%08lx-0x%08x:%s\n", va, pte & ~PAGE_MASK,
 			    buf);
 		}
-	}
+		va += PAGE_SIZE;
+	} while (va != 0);
 }
 
 void

Reply via email to