Change pmap_changebit() to take a mask of bits to set, and a PTE mask,
shaving several instructions out of the inner loop.
This commit is contained in:
parent
daa8ad1747
commit
b7fb6e1711
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pmap.c,v 1.63 1998/08/25 01:11:11 thorpej Exp $ */
|
/* $NetBSD: pmap.c,v 1.64 1998/08/25 06:21:16 thorpej Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||||
|
@ -163,7 +163,7 @@
|
||||||
|
|
||||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||||
|
|
||||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.63 1998/08/25 01:11:11 thorpej Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.64 1998/08/25 06:21:16 thorpej Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -429,7 +429,7 @@ pa_to_pvh(pa)
|
||||||
void alpha_protection_init __P((void));
|
void alpha_protection_init __P((void));
|
||||||
boolean_t pmap_remove_mapping __P((pmap_t, vaddr_t, pt_entry_t *,
|
boolean_t pmap_remove_mapping __P((pmap_t, vaddr_t, pt_entry_t *,
|
||||||
boolean_t));
|
boolean_t));
|
||||||
void pmap_changebit __P((paddr_t, u_long, boolean_t));
|
void pmap_changebit __P((paddr_t, pt_entry_t, pt_entry_t));
|
||||||
void pmap_pinit __P((pmap_t));
|
void pmap_pinit __P((pmap_t));
|
||||||
void pmap_release __P((pmap_t));
|
void pmap_release __P((pmap_t));
|
||||||
|
|
||||||
|
@ -1317,7 +1317,7 @@ pmap_page_protect(pa, prot)
|
||||||
pvh = pa_to_pvh(pa);
|
pvh = pa_to_pvh(pa);
|
||||||
PMAP_HEAD_TO_MAP_LOCK();
|
PMAP_HEAD_TO_MAP_LOCK();
|
||||||
simple_lock(&pvh->pvh_slock);
|
simple_lock(&pvh->pvh_slock);
|
||||||
/* XXX */ pmap_changebit(pa, PG_KWE | PG_UWE, FALSE);
|
/* XXX */ pmap_changebit(pa, 0, ~(PG_KWE | PG_UWE));
|
||||||
simple_unlock(&pvh->pvh_slock);
|
simple_unlock(&pvh->pvh_slock);
|
||||||
PMAP_HEAD_TO_MAP_UNLOCK();
|
PMAP_HEAD_TO_MAP_UNLOCK();
|
||||||
return;
|
return;
|
||||||
|
@ -2178,7 +2178,7 @@ pmap_clear_modify(pg)
|
||||||
|
|
||||||
if (pvh->pvh_attrs & PGA_MODIFIED) {
|
if (pvh->pvh_attrs & PGA_MODIFIED) {
|
||||||
rv = TRUE;
|
rv = TRUE;
|
||||||
pmap_changebit(pa, PG_FOW, TRUE);
|
pmap_changebit(pa, PG_FOW, ~0);
|
||||||
pvh->pvh_attrs &= ~PGA_MODIFIED;
|
pvh->pvh_attrs &= ~PGA_MODIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2207,7 +2207,7 @@ pmap_clear_modify(pa)
|
||||||
simple_lock(&pvh->pvh_slock);
|
simple_lock(&pvh->pvh_slock);
|
||||||
|
|
||||||
if (pvh->pvh_attrs & PGA_MODIFIED) {
|
if (pvh->pvh_attrs & PGA_MODIFIED) {
|
||||||
pmap_changebit(pa, PG_FOW, TRUE);
|
pmap_changebut(pa, PG_FOW, ~0);
|
||||||
pvh->pvh_attrs &= ~PGA_MODIFIED;
|
pvh->pvh_attrs &= ~PGA_MODIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2242,7 +2242,7 @@ pmap_clear_reference(pg)
|
||||||
|
|
||||||
if (pvh->pvh_attrs & PGA_REFERENCED) {
|
if (pvh->pvh_attrs & PGA_REFERENCED) {
|
||||||
rv = TRUE;
|
rv = TRUE;
|
||||||
pmap_changebit(pa, PG_FOR | PG_FOW | PG_FOE, TRUE);
|
pmap_changebit(pa, PG_FOR | PG_FOW | PG_FOE, ~0);
|
||||||
pvh->pvh_attrs &= ~PGA_REFERENCED;
|
pvh->pvh_attrs &= ~PGA_REFERENCED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2271,7 +2271,7 @@ pmap_clear_reference(pa)
|
||||||
simple_lock(&pvh->pvh_slock);
|
simple_lock(&pvh->pvh_slock);
|
||||||
|
|
||||||
if (pvh->pvh_attrs & PGA_REFERENCED) {
|
if (pvh->pvh_attrs & PGA_REFERENCED) {
|
||||||
pmap_changebit(pa, PG_FOR | PG_FOW | PG_FOE, TRUE);
|
pmap_changebit(pa, PG_FOR | PG_FOW | PG_FOE, ~0);
|
||||||
pvh->pvh_attrs &= ~PGA_REFERENCED;
|
pvh->pvh_attrs &= ~PGA_REFERENCED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2622,10 +2622,9 @@ pmap_remove_mapping(pmap, va, pte, dolock)
|
||||||
* the pmaps as we encounter them.
|
* the pmaps as we encounter them.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pmap_changebit(pa, bit, setem)
|
pmap_changebit(pa, set, mask)
|
||||||
paddr_t pa;
|
paddr_t pa;
|
||||||
u_long bit;
|
u_long set, mask;
|
||||||
boolean_t setem;
|
|
||||||
{
|
{
|
||||||
struct pv_head *pvh;
|
struct pv_head *pvh;
|
||||||
pv_entry_t pv;
|
pv_entry_t pv;
|
||||||
|
@ -2655,7 +2654,7 @@ pmap_changebit(pa, bit, setem)
|
||||||
/*
|
/*
|
||||||
* XXX don't write protect pager mappings
|
* XXX don't write protect pager mappings
|
||||||
*/
|
*/
|
||||||
/* XXX */ if (bit == (PG_UWE | PG_KWE)) {
|
/* XXX */ if (mask == ~(PG_KWE | PG_UWE)) {
|
||||||
#if defined(UVM)
|
#if defined(UVM)
|
||||||
if (va >= uvm.pager_sva && va < uvm.pager_eva)
|
if (va >= uvm.pager_sva && va < uvm.pager_eva)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2670,10 +2669,7 @@ pmap_changebit(pa, bit, setem)
|
||||||
simple_lock(&pv->pv_pmap->pm_slock);
|
simple_lock(&pv->pv_pmap->pm_slock);
|
||||||
|
|
||||||
pte = pmap_l3pte(pv->pv_pmap, va, NULL);
|
pte = pmap_l3pte(pv->pv_pmap, va, NULL);
|
||||||
if (setem)
|
npte = (*pte | set) & mask;
|
||||||
npte = *pte | bit;
|
|
||||||
else
|
|
||||||
npte = *pte & ~bit;
|
|
||||||
if (*pte != npte) {
|
if (*pte != npte) {
|
||||||
hadasm = (pmap_pte_asm(pte) != 0);
|
hadasm = (pmap_pte_asm(pte) != 0);
|
||||||
isactive = PMAP_ISACTIVE(pv->pv_pmap);
|
isactive = PMAP_ISACTIVE(pv->pv_pmap);
|
||||||
|
@ -2802,7 +2798,7 @@ pmap_emulate_reference(p, v, user, write)
|
||||||
pvh->pvh_attrs |= PGA_MODIFIED;
|
pvh->pvh_attrs |= PGA_MODIFIED;
|
||||||
faultoff |= PG_FOW;
|
faultoff |= PG_FOW;
|
||||||
}
|
}
|
||||||
pmap_changebit(pa, faultoff, FALSE);
|
pmap_changebit(pa, 0, ~faultoff);
|
||||||
|
|
||||||
simple_unlock(&pvh->pvh_slock);
|
simple_unlock(&pvh->pvh_slock);
|
||||||
PMAP_HEAD_TO_MAP_UNLOCK();
|
PMAP_HEAD_TO_MAP_UNLOCK();
|
||||||
|
|
Loading…
Reference in New Issue