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
This commit is contained in:
gber 2013-07-04 10:38:14 +00:00
parent b13a12be84
commit 3b133de3e5

View File

@ -2801,8 +2801,13 @@ pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
}
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);