Module Name:    src
Committed By:   uwe
Date:           Tue Jun  9 02:38:27 UTC 2009

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

Log Message:
In pmap_protect(), compute the bitmask to set in the ptes only once, instead
of every iteration.  From OpenBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.73 src/sys/arch/sh3/sh3/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/sh3/sh3/pmap.c
diff -u src/sys/arch/sh3/sh3/pmap.c:1.72 src/sys/arch/sh3/sh3/pmap.c:1.73
--- src/sys/arch/sh3/sh3/pmap.c:1.72	Tue Apr 21 21:30:00 2009
+++ src/sys/arch/sh3/sh3/pmap.c	Tue Jun  9 02:38:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.72 2009/04/21 21:30:00 cegger Exp $	*/
+/*	$NetBSD: pmap.c,v 1.73 2009/06/09 02:38:27 uwe Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.72 2009/04/21 21:30:00 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.73 2009/06/09 02:38:27 uwe Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -649,7 +649,7 @@
 pmap_protect(pmap_t pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
 {
 	bool kernel = pmap == pmap_kernel();
-	pt_entry_t *pte, entry;
+	pt_entry_t *pte, entry, protbits;
 	vaddr_t va;
 
 	sva = trunc_page(sva);
@@ -659,6 +659,22 @@
 		return;
 	}
 
+	switch (prot) {
+	default:
+		panic("pmap_protect: invalid protection mode %x", prot);
+		/* NOTREACHED */
+	case VM_PROT_READ:
+		/* FALLTHROUGH */
+	case VM_PROT_READ | VM_PROT_EXECUTE:
+		protbits = kernel ? PG_PR_KRO : PG_PR_URO;
+		break;
+	case VM_PROT_READ | VM_PROT_WRITE:
+		/* FALLTHROUGH */
+	case VM_PROT_ALL:
+		protbits = kernel ? PG_PR_KRW : PG_PR_URW;
+		break;
+	}
+
 	for (va = sva; va < eva; va += PAGE_SIZE) {
 
 		if (((pte = __pmap_pte_lookup(pmap, va)) == NULL) ||
@@ -672,22 +688,7 @@
 				sh_dcache_wbinv_range_index(va, PAGE_SIZE);
 		}
 
-		entry &= ~PG_PR_MASK;
-		switch (prot) {
-		default:
-			panic("pmap_protect: invalid protection mode %x", prot);
-			/* NOTREACHED */
-		case VM_PROT_READ:
-			/* FALLTHROUGH */
-		case VM_PROT_READ | VM_PROT_EXECUTE:
-			entry |= kernel ? PG_PR_KRO : PG_PR_URO;
-			break;
-		case VM_PROT_READ | VM_PROT_WRITE:
-			/* FALLTHROUGH */
-		case VM_PROT_ALL:
-			entry |= kernel ? PG_PR_KRW : PG_PR_URW;
-			break;
-		}
+		entry = (entry & ~PG_PR_MASK) | protbits;
 		*pte = entry;
 
 		if (pmap->pm_asid != -1)

Reply via email to