diff options
| author | pk <pk@NetBSD.org> | 2004-05-01 08:20:11 +0000 |
|---|---|---|
| committer | pk <pk@NetBSD.org> | 2004-05-01 08:20:11 +0000 |
| commit | 17e88886ccdd0b8a668cb330d64bf7a3eab8ce47 (patch) | |
| tree | 6153be0a202057e5c5612d3b01bdca7816d887b0 | |
| parent | fde70892d3fdae6ac45352b5c2b69dd01264cc89 (diff) | |
pmap_kremove4m,pmap_protect4m,pmap_extract4m: the `demap' lock needs interrupt
protection.
| -rw-r--r-- | sys/arch/sparc/sparc/pmap.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/sys/arch/sparc/sparc/pmap.c b/sys/arch/sparc/sparc/pmap.c index 7b33f96b794..bc47ced422e 100644 --- a/sys/arch/sparc/sparc/pmap.c +++ b/sys/arch/sparc/sparc/pmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.294 2004/04/27 11:26:43 pk Exp $ */ +/* $NetBSD: pmap.c,v 1.295 2004/05/01 08:20:11 pk Exp $ */ /* * Copyright (c) 1996 @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.294 2004/04/27 11:26:43 pk Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.295 2004/05/01 08:20:11 pk Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -6590,7 +6590,13 @@ pmap_kremove4m(va, len) struct segmap *sp; vaddr_t endva, nva; int vr, vs; - int tpte, perpage, npg; + int tpte, perpage, npg, s; + + /* + * The kernel pmap doesn't need to be locked, but the demap lock + * in updatepte() requires interrupt protection. + */ + s = splvm(); endva = va + len; for (; va < endva; va = nva) { @@ -6634,6 +6640,7 @@ pmap_kremove4m(va, len) SRMMU_TEINVALID, 1, 0, CPUSET_ALL); } } + splx(s); } /* @@ -6643,13 +6650,19 @@ void pmap_kprotect4m(vaddr_t va, vsize_t size, vm_prot_t prot) { struct pmap *pm = pmap_kernel(); - int pte, newprot; + int pte, newprot, s; struct regmap *rp; struct segmap *sp; size = roundup(size,NBPG); newprot = pte_kprot4m(prot); + /* + * The kernel pmap doesn't need to be locked, but the demap lock + * in updatepte() requires interrupt protection. + */ + s = splvm(); + while (size > 0) { rp = &pm->pm_regmap[VA_VREG(va)]; sp = &rp->rg_segmap[VA_VSEG(va)]; @@ -6670,6 +6683,7 @@ pmap_kprotect4m(vaddr_t va, vsize_t size, vm_prot_t prot) va += NBPG; size -= NBPG; } + splx(s); } #endif /* SUN4M || SUN4D */ @@ -6790,8 +6804,14 @@ pmap_extract4m(pm, va, pap) vr = VA_VREG(va); vs = VA_VSEG(va); + /* + * The kernel pmap doesn't need to be locked, but the demap lock + * requires interrupt protection. + */ s = splvm(); - simple_lock(&pm->pm_lock); + if (pm != pmap_kernel()) + simple_lock(&pm->pm_lock); + rp = &pm->pm_regmap[vr]; if (rp->rg_segmap == NULL) { #ifdef DEBUG @@ -6839,7 +6859,8 @@ pmap_extract4m(pm, va, pap) v = TRUE; out: - simple_unlock(&pm->pm_lock); + if (pm != pmap_kernel()) + simple_unlock(&pm->pm_lock); splx(s); return (v); } |
