Module Name: src Committed By: matt Date: Fri Jan 11 12:04:01 UTC 2013
Modified Files: src/sys/arch/arm/arm32: pmap.c Log Message: Fix a bug in pmap_modify_pv where we didn't set PVF_WRITE on a page after changing its mapping to writeable. Add more KASSERTS Don't go into DDB by default in pmap_fixup. To generate a diff of this commit: cvs rdiff -u -r1.246 -r1.247 src/sys/arch/arm/arm32/pmap.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/arch/arm/arm32/pmap.c diff -u src/sys/arch/arm/arm32/pmap.c:1.246 src/sys/arch/arm/arm32/pmap.c:1.247 --- src/sys/arch/arm/arm32/pmap.c:1.246 Tue Dec 11 23:51:34 2012 +++ src/sys/arch/arm/arm32/pmap.c Fri Jan 11 12:04:00 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.246 2012/12/11 23:51:34 matt Exp $ */ +/* $NetBSD: pmap.c,v 1.247 2013/01/11 12:04:00 matt Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -212,7 +212,7 @@ #include <arm/cpuconf.h> #include <arm/arm32/katelib.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.246 2012/12/11 23:51:34 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.247 2013/01/11 12:04:00 matt Exp $"); #ifdef PMAP_DEBUG @@ -1087,8 +1087,11 @@ pmap_modify_pv(struct vm_page_md *md, pa } } #ifdef PMAP_CACHE_VIPT - if (md->urw_mappings + md->krw_mappings == 0) + if (md->urw_mappings + md->krw_mappings == 0) { md->pvh_attrs &= ~PVF_WRITE; + } else { + md->pvh_attrs |= PVF_WRITE; + } /* * We have two cases here: the first is from enter_pv (new exec * page), the second is a combined pmap_remove_pv/pmap_enter_pv. @@ -2224,8 +2227,11 @@ pmap_clearbit(struct vm_page_md *md, pad md->uro_mappings++; } #ifdef PMAP_CACHE_VIPT - if (md->urw_mappings + md->krw_mappings == 0) + if (md->urw_mappings + md->krw_mappings == 0) { md->pvh_attrs &= ~PVF_WRITE; + } else { + KASSERT(md->pvh_attrs & PVF_WRITE); + } if (want_syncicache) need_syncicache = true; need_vac_me_harder = true; @@ -4043,6 +4049,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, */ if (rv == 0 && pm->pm_l1->l1_domain_use_count == 1) { extern int last_fault_code; + extern int kernel_debug; printf("fixup: pm %p, va 0x%lx, ftype %d - nothing to do!\n", pm, va, ftype); printf("fixup: l2 %p, l2b %p, ptep %p, pl1pd %p\n", @@ -4050,7 +4057,8 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, printf("fixup: pte 0x%x, l1pd 0x%x, last code 0x%x\n", pte, l1pd, last_fault_code); #ifdef DDB - Debugger(); + if (kernel_debug & 2) + Debugger(); #endif } #endif