summaryrefslogtreecommitdiffstats
path: root/sys/vm/pmap.h
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2006-07-20 17:48:41 +0000
committeralc <alc@FreeBSD.org>2006-07-20 17:48:41 +0000
commit004ef88e091610da1220afc72fb1ebd0bf2aae8a (patch)
tree0bfb8a63733288d79b2fd87044d51f9a844a908b /sys/vm/pmap.h
parent146016a7bbcca247253eb45157e1454f61dd304a (diff)
downloadFreeBSD-src-004ef88e091610da1220afc72fb1ebd0bf2aae8a.zip
FreeBSD-src-004ef88e091610da1220afc72fb1ebd0bf2aae8a.tar.gz
Add pmap_clear_write() to the interface between the virtual memory
system's machine-dependent and machine-independent layers. Once pmap_clear_write() is implemented on all of our supported architectures, I intend to replace all calls to pmap_page_protect() by calls to pmap_clear_write(). Why? Both the use and implementation of pmap_page_protect() in our virtual memory system has subtle errors, specifically, the management of execute permission is broken on some architectures. The "prot" argument to pmap_page_protect() should behave differently from the "prot" argument to other pmap functions. Instead of meaning, "give the specified access rights to all of the physical page's mappings," it means "don't take away the specified access rights from all of the physical page's mappings, but do take away the ones that aren't specified." However, owing to our i386 legacy, i.e., no support for no-execute rights, all but one invocation of pmap_page_protect() specifies VM_PROT_READ only, when the intent is, in fact, to remove only write permission. Consequently, a faithful implementation of pmap_page_protect(), e.g., ia64, would remove execute permission as well as write permission. On the other hand, some architectures that support execute permission have basically ignored whether or not VM_PROT_EXECUTE is passed to pmap_page_protect(), e.g., amd64 and sparc64. This change represents the first step in replacing pmap_page_protect() by the less subtle pmap_clear_write() that is already implemented on amd64, i386, and sparc64. Discussed with: grehan@ and marcel@
Diffstat (limited to 'sys/vm/pmap.h')
-rw-r--r--sys/vm/pmap.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h
index 57d62aa..8c1f9a3 100644
--- a/sys/vm/pmap.h
+++ b/sys/vm/pmap.h
@@ -93,6 +93,7 @@ extern vm_offset_t kernel_vm_end;
void pmap_change_wiring(pmap_t, vm_offset_t, boolean_t);
void pmap_clear_modify(vm_page_t m);
void pmap_clear_reference(vm_page_t m);
+void pmap_clear_write(vm_page_t m);
void pmap_copy(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t);
void pmap_copy_page(vm_page_t, vm_page_t);
void pmap_enter(pmap_t, vm_offset_t, vm_page_t, vm_prot_t,
OpenPOWER on IntegriCloud