Module Name: src
Committed By: matt
Date: Tue Apr 1 18:01:45 UTC 2014
Modified Files:
src/sys/arch/arm/arm32: pmap.c
Log Message:
For ARM_MMU_EXTENDED, if the page being mapped asked for EXEC but is not EXEC,
sync it.
To generate a diff of this commit:
cvs rdiff -u -r1.273 -r1.274 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.273 src/sys/arch/arm/arm32/pmap.c:1.274
--- src/sys/arch/arm/arm32/pmap.c:1.273 Mon Mar 31 01:49:04 2014
+++ src/sys/arch/arm/arm32/pmap.c Tue Apr 1 18:01:45 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.273 2014/03/31 01:49:04 matt Exp $ */
+/* $NetBSD: pmap.c,v 1.274 2014/04/01 18:01:45 matt Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -216,7 +216,7 @@
#include <arm/locore.h>
//#include <arm/arm32/katelib.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.273 2014/03/31 01:49:04 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.274 2014/04/01 18:01:45 matt Exp $");
//#define PMAP_DEBUG
#ifdef PMAP_DEBUG
@@ -422,9 +422,9 @@ EVCNT_ATTACH_STATIC(pmap_ev_exec_cached)
static struct evcnt pmap_ev_exec_synced =
PMAP_EVCNT_INITIALIZER("exec pages synced");
-#ifndef ARM_MMU_EXTENDED
static struct evcnt pmap_ev_exec_synced_map =
PMAP_EVCNT_INITIALIZER("exec pages synced (MP)");
+#ifndef ARM_MMU_EXTENDED
static struct evcnt pmap_ev_exec_synced_unmap =
PMAP_EVCNT_INITIALIZER("exec pages synced (UM)");
static struct evcnt pmap_ev_exec_synced_remap =
@@ -436,8 +436,8 @@ static struct evcnt pmap_ev_exec_synced_
#endif
EVCNT_ATTACH_STATIC(pmap_ev_exec_synced);
-#ifndef ARM_MMU_EXTENDED
EVCNT_ATTACH_STATIC(pmap_ev_exec_synced_map);
+#ifndef ARM_MMU_EXTENDED
EVCNT_ATTACH_STATIC(pmap_ev_exec_synced_unmap);
EVCNT_ATTACH_STATIC(pmap_ev_exec_synced_remap);
EVCNT_ATTACH_STATIC(pmap_ev_exec_synced_clearbit);
@@ -3283,6 +3283,18 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
UVMHIST_LOG(maphist, " opte %#x npte %#x", opte, npte, 0, 0);
+#if defined(ARM_MMU_EXTENDED)
+ /*
+ * If exec protection was requested but the page hasn't been synced,
+ * sync it now and allow execution from it.
+ */
+ if ((nflags & PVF_EXEC) && (npte & L2_XS_XN)) {
+ struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+ npte &= ~L2_XS_XN;
+ pmap_syncicache_page(md, pa);
+ PMAPCOUNT(exec_synced_map);
+ }
+#endif
/*
* If this is just a wiring change, the two PTEs will be
* identical, so there's no need to update the page table.
@@ -3322,7 +3334,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
#ifndef ARM_MMU_EXTENDED
UVMHIST_LOG(maphist, " is_cached %d cs 0x%08x\n",
is_cached, pm->pm_cstate.cs_all, 0, 0);
-#endif
if (pg != NULL) {
struct vm_page_md *md = VM_PAGE_TO_MD(pg);
@@ -3331,6 +3342,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
pmap_vac_me_harder(md, pa, pm, va);
pmap_release_page_lock(md);
}
+#endif
}
#if defined(PMAP_CACHE_VIPT) && defined(DIAGNOSTIC)
if (pg) {