diff options
author | dg <dg@FreeBSD.org> | 1994-02-13 08:29:33 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1994-02-13 08:29:33 +0000 |
commit | 6c375f74c6dff960e0f4c510941623dcca63d506 (patch) | |
tree | e0d9df81b67d603f7341baec3f3f02c07dd88aac /sys/amd64 | |
parent | 006651ac9cfc40d8522d84bea156e4f2fb8dff2b (diff) | |
download | FreeBSD-src-6c375f74c6dff960e0f4c510941623dcca63d506.zip FreeBSD-src-6c375f74c6dff960e0f4c510941623dcca63d506.tar.gz |
Fixed bug in handling of COW - the original code was bogus and it was
only accidental that it worked. Also, don't cache non-managed pages.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/pmap.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index ccc8956..d244ce7 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 - * $Id: pmap.c,v 1.17 1994/02/08 03:07:58 davidg Exp $ + * $Id: pmap.c,v 1.18 1994/02/10 03:03:44 davidg Exp $ */ /* @@ -1096,7 +1096,6 @@ pmap_protect(pmap, sva, eva, prot) continue; } - /* * Page not valid. Again, skip it. * Should we do this? Or set protection anyway? @@ -1105,15 +1104,20 @@ pmap_protect(pmap, sva, eva, prot) continue; i386prot = pte_prot(pmap, prot); - if (va < UPT_MAX_ADDRESS) - i386prot |= PG_RW /*PG_u*/; + + if (va < UPT_MIN_ADDRESS) + i386prot |= PG_u; + else if (va < UPT_MAX_ADDRESS) + i386prot |= PG_u | PG_RW; + if (i386prot != pte->pg_prot) { reqactivate = 1; pmap_pte_set_prot(pte, i386prot); } } endofloop: - tlbflush(); + if (reqactivate) + tlbflush(); } /* @@ -1217,19 +1221,13 @@ pmap_enter(pmap, va, pa, prot, wired) pv->pv_next = npv; } splx(s); + } else { + cacheable = FALSE; } pmap_use_pt(pmap, va, 1); /* - * Assumption: if it is not part of our managed memory - * then it must be device memory which may be volitile. - */ - if (pmap_initialized) { - checkpv = cacheable = FALSE; - } - - /* * Increment counters */ pmap->pm_stats.resident_count++; @@ -1242,6 +1240,10 @@ validate: */ npte = (pa & PG_FRAME) | pte_prot(pmap, prot) | PG_V; + if (!cacheable) { + npte |= PG_N; + } + /* * When forking (copy-on-write, etc): * A process will turn off write permissions for any of its writable @@ -1541,7 +1543,7 @@ pmap_changebit(pa, bit, setem) /* * XXX don't write protect pager mappings */ - if (bit == PG_RO) { + if (!setem && (bit == PG_RW)) { extern vm_offset_t pager_sva, pager_eva; if (va >= pager_sva && va < pager_eva) @@ -1625,7 +1627,7 @@ void pmap_copy_on_write(pa) vm_offset_t pa; { - pmap_changebit(pa, PG_RO, TRUE); + pmap_changebit(pa, PG_RW, FALSE); } |