summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2002-03-24 05:28:46 +0000
committerthorpej <thorpej@NetBSD.org>2002-03-24 05:28:46 +0000
commit0aef2cab11d11ffa54800d09f596eba8ec5ef63b (patch)
tree5e87080c60371a1004d221c0a3c5ac0baa6a6807 /sys
parent11df08a7431dd6a22a80b4aa17716be0f39c8b6c (diff)
pmap_unwire(): Use pmap_map_ptes() correctly.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/arm/arm32/pmap.c50
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();
}
/*