Simplify and clarify the implementation of the pmap_page_protect(9) API.
authorkettenis <kettenis@openbsd.org>
Tue, 17 Jan 2023 19:29:09 +0000 (19:29 +0000)
committerkettenis <kettenis@openbsd.org>
Tue, 17 Jan 2023 19:29:09 +0000 (19:29 +0000)
This function is only ever called with PROT_NONE or PROT_READ where
PROT_NONE removes the mapping from the page tables and PROT_READ takes
away write permission.  Add a KASSERT to make sure no other values are
passed.  This KASSERT should be optimized away by any decent compiler.

ok deraadt@, mpi@, guenther@

sys/arch/amd64/include/pmap.h

index e36c1f6..4cfd83e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pmap.h,v 1.82 2022/10/16 15:03:39 kettenis Exp $      */
+/*     $OpenBSD: pmap.h,v 1.83 2023/01/17 19:29:09 kettenis Exp $      */
 /*     $NetBSD: pmap.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $    */
 
 /*
@@ -70,6 +70,7 @@
 
 #ifndef _LOCORE
 #ifdef _KERNEL
+#include <lib/libkern/libkern.h>       /* for KASSERT() */
 #include <machine/cpufunc.h>
 #endif /* _KERNEL */
 #include <sys/mutex.h>
@@ -455,12 +456,11 @@ pmap_update_pg(vaddr_t va)
 static inline void
 pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
 {
-       if ((prot & PROT_WRITE) == 0) {
-               if (prot & (PROT_READ | PROT_EXEC)) {
-                       (void) pmap_clear_attrs(pg, PG_RW);
-               } else {
-                       pmap_page_remove(pg);
-               }
+       if (prot == PROT_READ) {
+               (void) pmap_clear_attrs(pg, PG_RW);
+       } else {
+               KASSERT(prot == PROT_NONE);
+               pmap_page_remove(pg);
        }
 }