summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1998-07-05 11:58:35 +0000
committerdfr <dfr@FreeBSD.org>1998-07-05 11:58:35 +0000
commit63e9a0f3baab524580549e60cea321c4913f911e (patch)
tree510ea809149d6038a68b1f538a0e356b7beac3eb /sys
parent918a149d3c0c1791d8f20fa685626d2e33112690 (diff)
downloadFreeBSD-src-63e9a0f3baab524580549e60cea321c4913f911e.zip
FreeBSD-src-63e9a0f3baab524580549e60cea321c4913f911e.tar.gz
Make sure hold_count for level 2 maps is maintained properly.
Simplify pmap_mapdev (its still totally wrong for the alpha).
Diffstat (limited to 'sys')
-rw-r--r--sys/alpha/alpha/pmap.c34
1 files changed, 10 insertions, 24 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c
index 54f8633..4a53100 100644
--- a/sys/alpha/alpha/pmap.c
+++ b/sys/alpha/alpha/pmap.c
@@ -43,7 +43,7 @@
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* from: i386 Id: pmap.c,v 1.193 1998/04/19 15:22:48 bde Exp
* with some ideas from NetBSD's alpha pmap
- * $Id$
+ * $Id: pmap.c,v 1.1 1998/06/10 10:52:59 dfr Exp $
*/
/*
@@ -1027,7 +1027,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m)
lev2pg = pmap_page_lookup(pmap->pm_pteobj,
NUSERLEV3MAPS + pmap_lev1_index(va));
vm_page_unhold(lev2pg);
- if (m->hold_count == 0)
+ if (lev2pg->hold_count == 0)
_pmap_unwire_pte_hold(pmap, va, lev2pg);
}
@@ -1265,6 +1265,13 @@ _pmap_allocpte(pmap, ptepindex)
pt_entry_t* l2map;
if (!pmap_pte_v(l1pte))
_pmap_allocpte(pmap, NUSERLEV3MAPS + l1index);
+ else {
+ int l2ptepindex = NUSERLEV3MAPS + l1index;
+ vm_page_t l2page =
+ pmap_page_lookup(pmap->pm_pteobj,
+ NUSERLEV3MAPS + l1index);
+ l2page->hold_count++;
+ }
l2map = (pt_entry_t*) ALPHA_PHYS_TO_K0SEG(pmap_pte_pa(l1pte));
pte = &l2map[ptepindex & ((1 << ALPHA_PTSHIFT) - 1)];
}
@@ -2857,28 +2864,7 @@ pmap_mapdev(pa, size)
vm_offset_t pa;
vm_size_t size;
{
- vm_offset_t va, tmpva;
- pt_entry_t *pte;
-
- size = roundup(size, PAGE_SIZE);
-
- va = kmem_alloc_pageable(kernel_map, size);
-#if !defined(MAX_PERF)
- if (!va)
- panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
-#endif
-
- pa = pa & ~PAGE_MASK;
- for (tmpva = va; size > 0;) {
- pte = vtopte(tmpva);
- *pte = pmap_phys_to_pte(pa) | PG_KRE | PG_KWE | PG_V;
- size -= PAGE_SIZE;
- tmpva += PAGE_SIZE;
- pa += PAGE_SIZE;
- }
- ALPHA_TBIA();
-
- return ((void *) va);
+ return (void*) ALPHA_PHYS_TO_K0SEG(pa);
}
/*
OpenPOWER on IntegriCloud