summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorgber <gber@FreeBSD.org>2013-07-04 10:38:14 +0000
committergber <gber@FreeBSD.org>2013-07-04 10:38:14 +0000
commit3b133de3e5e8df745185cf7cb1ec23a25be78bb9 (patch)
treea1326c61b6981249b1b32168d680a7db86535512 /sys/arm
parentb13a12be84c5c6efdf9a6d454c9cf07d7a247561 (diff)
downloadFreeBSD-src-3b133de3e5e8df745185cf7cb1ec23a25be78bb9.zip
FreeBSD-src-3b133de3e5e8df745185cf7cb1ec23a25be78bb9.tar.gz
Fix modified bit emulation for ARMv6/v7
When doing pmap_enter_locked(), enable write permission only when access type indicates attempt to write. Otherwise, leave the page read only but mark it writable in pv_flags. This will result in: 1. Marking page writable during pmap_enter() but only when ensured that it will be written right away so that we will not get redundant permissions fault on write attempt. 2. Keeping page read only when it is permitted to be written but there was no actual write attempt. Hence, we will get permissions fault on write access and mark page writable in pmap_fault_fixup() what will indicate modification status. Submitted by: Zbigniew Bodek <zbb@semihalf.com> Sponsored by: The FreeBSD Foundation, Semihalf
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/pmap-v6.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index 9e0b8bd..4ad0067 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -2801,8 +2801,13 @@ validate:
}
if (prot & VM_PROT_WRITE) {
- /* Write enable */
- npte &= ~(L2_APX);
+ /*
+ * Enable write permission if the access type
+ * indicates write intention. Emulate modified
+ * bit otherwise.
+ */
+ if ((access & VM_PROT_WRITE) != 0)
+ npte &= ~(L2_APX);
if ((m->oflags & VPO_UNMANAGED) == 0) {
vm_page_aflag_set(m, PGA_WRITEABLE);
OpenPOWER on IntegriCloud