diff options
author | kib <kib@FreeBSD.org> | 2017-04-24 07:52:44 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-04-24 07:52:44 +0000 |
commit | f36a0be961e835af2feb682ac43d13f1d081b964 (patch) | |
tree | a9b935cc4b15e7818926aaaabb7104089acd7c6d /sys/arm64 | |
parent | b4740b046f8d26d0c17c438a6ccf6a48d4610c9c (diff) | |
download | FreeBSD-src-f36a0be961e835af2feb682ac43d13f1d081b964.zip FreeBSD-src-f36a0be961e835af2feb682ac43d13f1d081b964.tar.gz |
MFC r316679:
Do not lose dirty bits for removing PROT_WRITE on arm64.
Diffstat (limited to 'sys/arm64')
-rw-r--r-- | sys/arm64/arm64/pmap.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 500aeb3..6839758 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -2481,6 +2481,11 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) sva += L3_SIZE) { l3 = pmap_load(l3p); if (pmap_l3_valid(l3)) { + if ((l3 & ATTR_SW_MANAGED) && + pmap_page_dirty(l3)) { + vm_page_dirty(PHYS_TO_VM_PAGE(l3 & + ~ATTR_MASK)); + } pmap_set(l3p, ATTR_AP(ATTR_AP_RO)); PTE_SYNC(l3p); /* XXX: Use pmap_invalidate_range */ |