summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-04-10 02:58:17 +0000
committeralc <alc@FreeBSD.org>1999-04-10 02:58:17 +0000
commit17353c7e0581cf6ffd7c741ccc704fc43b651a71 (patch)
tree45188101aa49d877156b8ebc704b9525079477fb /sys/i386
parent614e69dd794cd39650fdc648771112aa04b75f8b (diff)
downloadFreeBSD-src-17353c7e0581cf6ffd7c741ccc704fc43b651a71.zip
FreeBSD-src-17353c7e0581cf6ffd7c741ccc704fc43b651a71.tar.gz
pmap_remove_pte:
Use "loadandclear" to update the pte. pmap_changebit and pmap_ts_referenced: Switch to pmap_TLB_invalidate from invltlb.
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/pmap.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 6544cd9..d33abd6 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.228 1999/04/06 04:52:27 alc Exp $
+ * $Id: pmap.c,v 1.229 1999/04/07 03:57:45 msmith Exp $
*/
/*
@@ -1688,8 +1688,7 @@ pmap_remove_pte(pmap, ptq, va)
unsigned oldpte;
pv_table_t *ppv;
- oldpte = *ptq;
- *ptq = 0;
+ oldpte = loadandclear(ptq);
if (oldpte & PG_W)
pmap->pm_stats.wired_count -= 1;
/*
@@ -3061,14 +3060,12 @@ pmap_changebit(pa, bit, setem)
register pv_entry_t pv;
pv_table_t *ppv;
register unsigned *pte;
- int changed;
int s;
if (!pmap_is_managed(pa))
return;
s = splvm();
- changed = 0;
ppv = pa_to_pvh(pa);
/*
@@ -3098,11 +3095,10 @@ pmap_changebit(pa, bit, setem)
if (setem) {
*(int *)pte |= bit;
- changed = 1;
+ pmap_TLB_invalidate(pv->pv_pmap, pv->pv_va);
} else {
vm_offset_t pbits = *(vm_offset_t *)pte;
if (pbits & bit) {
- changed = 1;
if (bit == PG_RW) {
if (pbits & PG_M) {
vm_page_dirty(ppv->pv_vm_page);
@@ -3111,12 +3107,11 @@ pmap_changebit(pa, bit, setem)
} else {
*(int *)pte = pbits & ~bit;
}
+ pmap_TLB_invalidate(pv->pv_pmap, pv->pv_va);
}
}
}
splx(s);
- if (changed)
- invltlb();
}
/*
@@ -3147,7 +3142,6 @@ pmap_phys_address(ppn)
* pmap_ts_referenced:
*
* Return the count of reference bits for a page, clearing all of them.
- *
*/
int
pmap_ts_referenced(vm_offset_t pa)
@@ -3183,16 +3177,15 @@ pmap_ts_referenced(vm_offset_t pa)
if (pte && *pte & PG_A) {
*pte &= ~PG_A;
+
+ pmap_TLB_invalidate(pv->pv_pmap, pv->pv_va);
+
rtval++;
if (rtval > 4) {
break;
}
}
} while ((pv = pvn) != NULL && pv != pvf);
-
- if (rtval) {
- invltlb();
- }
}
splx(s);
OpenPOWER on IntegriCloud