aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2006-11-12 21:48:34 +0000
committerAlan Cox <alc@FreeBSD.org>2006-11-12 21:48:34 +0000
commit44b8bd66f9d825f9ed451e40259ec6f0ec3a07d1 (patch)
treec4a9c71fe86ec1dd8e45421082e59941e177807f /sys
parenta9e889bc33c568beef4ce06e5c2765e9e876ebeb (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/pmap.c4
-rw-r--r--sys/arm/arm/pmap.c5
-rw-r--r--sys/i386/i386/pmap.c4
-rw-r--r--sys/ia64/ia64/pmap.c2
-rw-r--r--sys/powerpc/aim/mmu_oea.c5
-rw-r--r--sys/powerpc/powerpc/mmu_oea.c5
-rw-r--r--sys/sparc64/sparc64/pmap.c5
-rw-r--r--sys/sun4v/sun4v/pmap.c4
-rw-r--r--sys/vm/vm_fault.c9
-rw-r--r--sys/vm/vm_kern.c2
10 files changed, 28 insertions, 17 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index c1f8c8ba2027..7a8b6725d1d7 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -2357,8 +2357,10 @@ validate:
* Now validate mapping with desired protection/wiring.
*/
newpte = (pt_entry_t)(pa | PG_V);
- if ((prot & VM_PROT_WRITE) != 0)
+ if ((prot & VM_PROT_WRITE) != 0) {
newpte |= PG_RW;
+ vm_page_flag_set(m, PG_WRITEABLE);
+ }
if ((prot & VM_PROT_EXECUTE) == 0)
newpte |= pg_nx;
if (wired)
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index a390a98ae40f..c5c1b209404c 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -3396,8 +3396,11 @@ do_l2b_alloc:
npte |= L2_TYPE_INV;
}
- if (prot & VM_PROT_WRITE)
+ if (prot & VM_PROT_WRITE) {
npte |= L2_S_PROT_W;
+ if (m != NULL)
+ vm_page_flag_set(m, PG_WRITEABLE);
+ }
npte |= pte_l2_s_cache_mode;
if (m && m == opg) {
/*
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index a7609788a029..179818049164 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -2434,8 +2434,10 @@ validate:
* Now validate mapping with desired protection/wiring.
*/
newpte = (pt_entry_t)(pa | PG_V);
- if ((prot & VM_PROT_WRITE) != 0)
+ if ((prot & VM_PROT_WRITE) != 0) {
newpte |= PG_RW;
+ vm_page_flag_set(m, PG_WRITEABLE);
+ }
if (wired)
newpte |= PG_W;
if (va < VM_MAXUSER_ADDRESS)
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index 37fe800e3da8..bcdaae7df7fa 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -1647,6 +1647,8 @@ validate:
pmap_pte_prot(pmap, pte, prot);
pmap_set_pte(pte, va, pa, wired, managed);
+ if ((prot & VM_PROT_WRITE) != 0)
+ vm_page_flag_set(m, PG_WRITEABLE);
vm_page_unlock_queues();
pmap_install(oldpmap);
PMAP_UNLOCK(pmap);
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index df5431db2fd6..08217b5289cc 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1129,9 +1129,10 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
}
}
- if (prot & VM_PROT_WRITE)
+ if (prot & VM_PROT_WRITE) {
pte_lo |= PTE_BW;
- else
+ vm_page_flag_set(m, PG_WRITEABLE);
+ } else
pte_lo |= PTE_BR;
if (prot & VM_PROT_EXECUTE)
diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c
index df5431db2fd6..08217b5289cc 100644
--- a/sys/powerpc/powerpc/mmu_oea.c
+++ b/sys/powerpc/powerpc/mmu_oea.c
@@ -1129,9 +1129,10 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
}
}
- if (prot & VM_PROT_WRITE)
+ if (prot & VM_PROT_WRITE) {
pte_lo |= PTE_BW;
- else
+ vm_page_flag_set(m, PG_WRITEABLE);
+ } else
pte_lo |= PTE_BR;
if (prot & VM_PROT_EXECUTE)
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index 15f3351be827..bf0cb0bdcb0f 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -1348,6 +1348,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot,
if (wired) {
tp->tte_data |= TD_W;
}
+ vm_page_flag_set(m, PG_WRITEABLE);
} else if ((data & TD_W) != 0) {
vm_page_dirty(m);
}
@@ -1387,8 +1388,10 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot,
data = TD_V | TD_8K | TD_PA(pa);
if (pm == kernel_pmap)
data |= TD_P;
- if (prot & VM_PROT_WRITE)
+ if ((prot & VM_PROT_WRITE) != 0) {
data |= TD_SW;
+ vm_page_flag_set(m, PG_WRITEABLE);
+ }
if (prot & VM_PROT_EXECUTE) {
data |= TD_EXEC;
icache_page_inval(pa);
diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c
index da915796b096..bcc292f843ad 100644
--- a/sys/sun4v/sun4v/pmap.c
+++ b/sys/sun4v/sun4v/pmap.c
@@ -1008,8 +1008,10 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
/*
* Now validate mapping with desired protection/wiring.
*/
- if ((prot & VM_PROT_WRITE) != 0)
+ if ((prot & VM_PROT_WRITE) != 0) {
tte_data |= VTD_SW_W;
+ vm_page_flag_set(m, PG_WRITEABLE);
+ }
if ((prot & VM_PROT_EXECUTE) != 0)
tte_data |= VTD_X;
if (wired)
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index d62f3c769145..e5771995ee0a 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -841,9 +841,6 @@ readrest:
}
}
if (prot & VM_PROT_WRITE) {
- vm_page_lock_queues();
- vm_page_flag_set(fs.m, PG_WRITEABLE);
- vm_page_unlock_queues();
vm_object_set_writeable_dirty(fs.object);
/*
@@ -1189,14 +1186,12 @@ vm_fault_copy_entry(dst_map, src_map, dst_entry, src_entry)
* Enter it in the pmap...
*/
pmap_enter(dst_map->pmap, vaddr, dst_m, prot, FALSE);
- VM_OBJECT_LOCK(dst_object);
- vm_page_lock_queues();
- if ((prot & VM_PROT_WRITE) != 0)
- vm_page_flag_set(dst_m, PG_WRITEABLE);
/*
* Mark it no longer busy, and put it on the active list.
*/
+ VM_OBJECT_LOCK(dst_object);
+ vm_page_lock_queues();
vm_page_activate(dst_m);
vm_page_unlock_queues();
vm_page_wakeup(dst_m);
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index c91dc483dd65..e3a8c12159d7 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -402,7 +402,7 @@ retry:
*/
pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, 1);
vm_page_lock_queues();
- vm_page_flag_set(m, PG_WRITEABLE | PG_REFERENCED);
+ vm_page_flag_set(m, PG_REFERENCED);
vm_page_unlock_queues();
vm_page_wakeup(m);
}