summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-12-29 02:27:07 +0000
committerdyson <dyson@FreeBSD.org>1996-12-29 02:27:07 +0000
commit6a2a246ed77070189503398f3271ae65ad03e4e9 (patch)
tree46f688159e458ce69cc002d772dab15410a52ed3 /sys
parent412ed002942f7e3ccccd462d668ad4af45295cb4 (diff)
downloadFreeBSD-src-6a2a246ed77070189503398f3271ae65ad03e4e9.zip
FreeBSD-src-6a2a246ed77070189503398f3271ae65ad03e4e9.tar.gz
Allow pmap_protect to increase permissions. This mod can eliminate
the need for unnecessary vm_faults. Submitted by: Alan Cox <alc@cs.rice.edu>
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/pmap.c12
-rw-r--r--sys/i386/i386/pmap.c12
2 files changed, 14 insertions, 10 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 58a079f..6555810 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.130 1996/11/07 14:44:01 joerg Exp $
+ * $Id: pmap.c,v 1.131 1996/11/11 04:20:19 dyson Exp $
*/
/*
@@ -1835,9 +1835,6 @@ pmap_protect(pmap, sva, eva, prot)
pmap_remove(pmap, sva, eva);
return;
}
- if (prot & VM_PROT_WRITE) {
- return;
- }
anychanged = 0;
@@ -1866,7 +1863,12 @@ pmap_protect(pmap, sva, eva, prot)
unsigned pbits = ptbase[sindex];
- if (pbits & PG_RW) {
+ if (prot & VM_PROT_WRITE) {
+ if ((pbits & (PG_RW|PG_V)) == PG_V) {
+ ptbase[sindex] = pbits | PG_RW;
+ anychanged = 1;
+ }
+ } else if (pbits & PG_RW) {
if (pbits & PG_M) {
vm_offset_t sva = i386_ptob(sindex);
if (pmap_track_modified(sva)) {
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 58a079f..6555810 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.130 1996/11/07 14:44:01 joerg Exp $
+ * $Id: pmap.c,v 1.131 1996/11/11 04:20:19 dyson Exp $
*/
/*
@@ -1835,9 +1835,6 @@ pmap_protect(pmap, sva, eva, prot)
pmap_remove(pmap, sva, eva);
return;
}
- if (prot & VM_PROT_WRITE) {
- return;
- }
anychanged = 0;
@@ -1866,7 +1863,12 @@ pmap_protect(pmap, sva, eva, prot)
unsigned pbits = ptbase[sindex];
- if (pbits & PG_RW) {
+ if (prot & VM_PROT_WRITE) {
+ if ((pbits & (PG_RW|PG_V)) == PG_V) {
+ ptbase[sindex] = pbits | PG_RW;
+ anychanged = 1;
+ }
+ } else if (pbits & PG_RW) {
if (pbits & PG_M) {
vm_offset_t sva = i386_ptob(sindex);
if (pmap_track_modified(sva)) {
OpenPOWER on IntegriCloud