summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1998-07-28 09:34:50 +0000
committerdfr <dfr@FreeBSD.org>1998-07-28 09:34:50 +0000
commitebdd0888b15b7f91c651f54813a4d70ab81247e2 (patch)
tree728e8bbd64ebd4281f1f1d919ad6d540fda16beb /sys/alpha
parentf59d8bb7066a46a683f6c4f511c151bc2c64c29a (diff)
downloadFreeBSD-src-ebdd0888b15b7f91c651f54813a4d70ab81247e2.zip
FreeBSD-src-ebdd0888b15b7f91c651f54813a4d70ab81247e2.tar.gz
Record the new physical address of the pcb in pmap_swapin_proc.
Third attempt at pmap_remove(). This one actually works properly :-).
Diffstat (limited to 'sys/alpha')
-rw-r--r--sys/alpha/alpha/pmap.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c
index caf7318..414bd8a 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: pmap.c,v 1.5 1998/07/24 09:43:27 dfr Exp $
+ * $Id: pmap.c,v 1.6 1998/07/26 18:13:28 dfr Exp $
*/
/*
@@ -1004,6 +1004,12 @@ pmap_swapin_proc(p)
PAGE_WAKEUP(m);
m->flags |= PG_MAPPED | PG_WRITEABLE;
}
+
+ /*
+ * The pcb may be at a different physical address now so cache the
+ * new address.
+ */
+ p->p_md.md_pcbpaddr = (void*) vtophys((vm_offset_t) &p->p_addr->u_pcb);
}
/***************************************************
@@ -1761,7 +1767,7 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va)
void
pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- vm_offset_t va, nva1, nva2;
+ vm_offset_t va, nva;
if (pmap == NULL)
return;
@@ -1779,18 +1785,19 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
return;
}
- for (va = sva; va < eva; va = nva1) {
- nva1 = alpha_l1trunc(va + ALPHA_L1SIZE);
- if (!pmap_pte_v(pmap_lev1pte(pmap, va)))
+ for (va = sva; va < eva; va = nva) {
+ if (!pmap_pte_v(pmap_lev1pte(pmap, va))) {
+ nva = alpha_l1trunc(va + ALPHA_L1SIZE);
continue;
+ }
- for (; va < eva && va < nva1; va = nva2) {
- nva2 = alpha_l2trunc(va + ALPHA_L2SIZE);
- if (!pmap_pte_v(pmap_lev2pte(pmap, va)))
- continue;
- for (; va < eva && va < nva2; va += PAGE_SIZE)
- pmap_remove_page(pmap, va);
+ if (!pmap_pte_v(pmap_lev2pte(pmap, va))) {
+ nva = alpha_l2trunc(va + ALPHA_L2SIZE);
+ continue;
}
+
+ pmap_remove_page(pmap, va);
+ nva = va + PAGE_SIZE;
}
}
OpenPOWER on IntegriCloud