diff options
| author | thorpej <thorpej@NetBSD.org> | 2002-03-24 05:28:46 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2002-03-24 05:28:46 +0000 |
| commit | 0aef2cab11d11ffa54800d09f596eba8ec5ef63b (patch) | |
| tree | 5e87080c60371a1004d221c0a3c5ac0baa6a6807 /sys | |
| parent | 11df08a7431dd6a22a80b4aa17716be0f39c8b6c (diff) | |
pmap_unwire(): Use pmap_map_ptes() correctly.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arch/arm/arm32/pmap.c | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/sys/arch/arm/arm32/pmap.c b/sys/arch/arm/arm32/pmap.c index 8ebc37a8af1..d07abfc939e 100644 --- a/sys/arch/arm/arm32/pmap.c +++ b/sys/arch/arm/arm32/pmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.59 2002/03/24 05:15:59 thorpej Exp $ */ +/* $NetBSD: pmap.c,v 1.60 2002/03/24 05:28:46 thorpej Exp $ */ /* * Copyright (c) 2002 Wasabi Systems, Inc. @@ -143,7 +143,7 @@ #include <machine/param.h> #include <arm/arm32/katelib.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.59 2002/03/24 05:15:59 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.60 2002/03/24 05:28:46 thorpej Exp $"); #ifdef PMAP_DEBUG #define PDEBUG(_lev_,_stat_) \ if (pmap_debug_level >= (_lev_)) \ @@ -2894,31 +2894,37 @@ pmap_unwire(pmap, va) struct pmap *pmap; vaddr_t va; { - pt_entry_t *pte; - paddr_t pa; + pt_entry_t *ptes; struct vm_page *pg; + paddr_t pa; - /* - * Make sure pmap is valid. -dct - */ - if (pmap == NULL) - return; - - /* Get the pte */ - pte = pmap_pte(pmap, va); - if (!pte) - return; + PMAP_MAP_TO_HEAD_LOCK(); + ptes = pmap_map_ptes(pmap); /* locks pmap */ - /* Extract the physical address of the page */ - pa = pmap_pte_pa(pte); + if (pmap_pde_v(pmap_pde(pmap, va))) { +#ifdef DIAGNOSTIC + if (l2pte_valid(ptes[arm_btop(va)]) == 0) + panic("pmap_unwire: invalid L2 PTE"); +#endif + /* Extract the physical address of the page */ + pa = l2pte_pa(ptes[arm_btop(va)]); - if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL) - return; + if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL) + goto out; - simple_lock(&pg->mdpage.pvh_slock); - /* Update the wired bit in the pv entry for this page. */ - (void) pmap_modify_pv(pmap, va, pg, PT_W, 0); - simple_unlock(&pg->mdpage.pvh_slock); + /* Update the wired bit in the pv entry for this page. */ + simple_lock(&pg->mdpage.pvh_slock); + (void) pmap_modify_pv(pmap, va, pg, PT_W, 0); + simple_unlock(&pg->mdpage.pvh_slock); + } +#ifdef DIAGNOSTIC + else { + panic("pmap_unwire: invalid L1 PTE"); + } +#endif + out: + pmap_unmap_ptes(pmap); /* unlocks pmap */ + PMAP_MAP_TO_HEAD_UNLOCK(); } /* |
