diff options
author | alc <alc@FreeBSD.org> | 2006-06-09 03:54:20 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2006-06-09 03:54:20 +0000 |
commit | d9025257105d594ccc8026d06d50b5f0aad1dff9 (patch) | |
tree | e96d257eb37805f7de674ed2ce947895933ce2c6 /sys/arm | |
parent | 30baa7af53775b9e1094addc4f0d64b35c3e7306 (diff) | |
download | FreeBSD-src-d9025257105d594ccc8026d06d50b5f0aad1dff9.zip FreeBSD-src-d9025257105d594ccc8026d06d50b5f0aad1dff9.tar.gz |
Add pmap locking to pmap_extract().
Tested by: cognet@
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/pmap.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index b681c75..8c4e6ea 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -3654,14 +3654,14 @@ vm_paddr_t pmap_extract(pmap_t pm, vm_offset_t va) { struct l2_dtable *l2; - pd_entry_t *pl1pd, l1pd; + pd_entry_t l1pd; pt_entry_t *ptep, pte; vm_paddr_t pa; u_int l1idx; l1idx = L1_IDX(va); - pl1pd = &pm->pm_l1->l1_kva[l1idx]; - l1pd = *pl1pd; + PMAP_LOCK(pm); + l1pd = pm->pm_l1->l1_kva[l1idx]; if (l1pte_section_p(l1pd)) { /* * These should only happen for pmap_kernel() @@ -3678,14 +3678,17 @@ pmap_extract(pmap_t pm, vm_offset_t va) if (l2 == NULL || (ptep = l2->l2_bucket[L2_BUCKET(l1idx)].l2b_kva) == NULL) { + PMAP_UNLOCK(pm); return (0); } ptep = &ptep[l2pte_index(va)]; pte = *ptep; - if (pte == 0) + if (pte == 0) { + PMAP_UNLOCK(pm); return (0); + } switch (pte & L2_TYPE_MASK) { case L2_TYPE_L: @@ -3698,6 +3701,7 @@ pmap_extract(pmap_t pm, vm_offset_t va) } } + PMAP_UNLOCK(pm); return (pa); } |