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