Module Name:    src
Committed By:   uebayasi
Date:           Thu Jul  8 06:55:13 UTC 2010

Modified Files:
        src/sys/uvm [uebayasi-xip]: uvm_bio.c uvm_fault.c uvm_page.c

Log Message:
Mark XIP pages as PG_RDONLY.


To generate a diff of this commit:
cvs rdiff -u -r1.68.2.4 -r1.68.2.5 src/sys/uvm/uvm_bio.c
cvs rdiff -u -r1.166.2.10 -r1.166.2.11 src/sys/uvm/uvm_fault.c
cvs rdiff -u -r1.153.2.41 -r1.153.2.42 src/sys/uvm/uvm_page.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/uvm/uvm_bio.c
diff -u src/sys/uvm/uvm_bio.c:1.68.2.4 src/sys/uvm/uvm_bio.c:1.68.2.5
--- src/sys/uvm/uvm_bio.c:1.68.2.4	Wed Jul  7 16:35:26 2010
+++ src/sys/uvm/uvm_bio.c	Thu Jul  8 06:55:13 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_bio.c,v 1.68.2.4 2010/07/07 16:35:26 uebayasi Exp $	*/
+/*	$NetBSD: uvm_bio.c,v 1.68.2.5 2010/07/08 06:55:13 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1998 Chuck Silvers.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.68.2.4 2010/07/07 16:35:26 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.68.2.5 2010/07/08 06:55:13 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_ubc.h"
@@ -385,13 +385,10 @@
 		 * is marked as PG_RDONLY.
 		 */
 
-		/* XXXUEBS device pages are always read-only for now */
-		rdonly = uvm_pageisdirect_p(pg) ||
-		    ((access_type & VM_PROT_WRITE) == 0 &&
-		     (pg->flags & PG_RDONLY) != 0) ||
+		rdonly = ((access_type & VM_PROT_WRITE) == 0 &&
+		    (pg->flags & PG_RDONLY) != 0) ||
 		    UVM_OBJ_NEEDS_WRITEFAULT(uobj);
-		KASSERT(uvm_pageisdirect_p(pg) ||
-		    (pg->flags & PG_RDONLY) == 0 ||
+		KASSERT((pg->flags & PG_RDONLY) == 0 ||
 		    (access_type & VM_PROT_WRITE) == 0 ||
 		    pg->offset < umap->writeoff ||
 		    pg->offset + PAGE_SIZE > umap->writeoff + umap->writelen);

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.166.2.10 src/sys/uvm/uvm_fault.c:1.166.2.11
--- src/sys/uvm/uvm_fault.c:1.166.2.10	Thu Jul  8 02:23:28 2010
+++ src/sys/uvm/uvm_fault.c	Thu Jul  8 06:55:13 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.166.2.10 2010/07/08 02:23:28 uebayasi Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.166.2.11 2010/07/08 06:55:13 uebayasi Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.10 2010/07/08 02:23:28 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.11 2010/07/08 06:55:13 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_xip.h"
@@ -1731,8 +1731,7 @@
 			    "(0x%x) with locked get",
 			    curpg, 0,0,0);
 		} else {
-			bool readonly = uvm_pageisdirect_p(curpg)
-			    || (curpg->flags & PG_RDONLY)
+			bool readonly = (curpg->flags & PG_RDONLY)
 			    || (curpg->loan_count > 0)
 			    || UVM_OBJ_NEEDS_WRITEFAULT(curpg->uobject);
 
@@ -2177,11 +2176,9 @@
 	    "  MAPPING: case2: pm=0x%x, va=0x%x, pg=0x%x, promote=%d",
 	    ufi->orig_map->pmap, ufi->orig_rvaddr, pg, flt->promote);
 	KASSERT((flt->access_type & VM_PROT_WRITE) == 0 ||
-		uvm_pageisdirect_p(pg) || (pg->flags & PG_RDONLY) == 0);
-	if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr,
-	    VM_PAGE_TO_PHYS(pg),
-	    (uvm_pageisdirect_p(pg) || pg->flags & PG_RDONLY) ?
-	    (flt->enter_prot & ~VM_PROT_WRITE) : flt->enter_prot,
+		(pg->flags & PG_RDONLY) == 0);
+	if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr, VM_PAGE_TO_PHYS(pg),
+	    pg->flags & PG_RDONLY ? flt->enter_prot & ~VM_PROT_WRITE : flt->enter_prot,
 	    flt->access_type | PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0)) != 0) {
 
 		if (uvm_pageisdirect_p(pg)) {

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.153.2.41 src/sys/uvm/uvm_page.c:1.153.2.42
--- src/sys/uvm/uvm_page.c:1.153.2.41	Wed Jul  7 16:35:26 2010
+++ src/sys/uvm/uvm_page.c	Thu Jul  8 06:55:13 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.153.2.41 2010/07/07 16:35:26 uebayasi Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.153.2.42 2010/07/08 06:55:13 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.41 2010/07/07 16:35:26 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.42 2010/07/08 06:55:13 uebayasi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -125,7 +125,6 @@
 /*
  * physical memory config is stored in vm_physmem.
  */
-/* XXXUEBS merge these two */
 
 SIMPLEQ_HEAD(vm_physseg_freelist, vm_physseg);
 
@@ -134,6 +133,7 @@
 static struct vm_physseg vm_physmem_store[VM_PHYSSEG_MAX];
 static struct vm_physseg_freelist vm_physmem_freelist =
     SIMPLEQ_HEAD_INITIALIZER(vm_physmem_freelist);
+
 #ifdef XIP
 struct vm_physseg *vm_physdev_ptrs[VM_PHYSSEG_MAX];
 int vm_nphysdev = 0;
@@ -856,6 +856,7 @@
 	 * XIP page metadata initialization
 	 * - Only "phys_addr" and "vm_page_md" (== "PV" management) are used.
 	 * - No "pageq" operation is done.
+	 * - XIP pages are read-only (for now).
 	 */
 	seg->pgs = kmem_zalloc(sizeof(struct vm_page) * (end - start),
 	    KM_SLEEP);
@@ -869,7 +870,7 @@
 		paddr_t paddr = (start + i) << PAGE_SHIFT;
 
 		pg->phys_addr = paddr;
-		pg->flags |= PG_DIRECT;
+		pg->flags |= PG_RDONLY | PG_DIRECT;
 #ifdef __HAVE_VM_PAGE_MD
 		VM_MDPAGE_INIT(&pg->mdpage, paddr);
 #endif

Reply via email to