summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/trap.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-02-25 03:02:53 +0000
committerdyson <dyson@FreeBSD.org>1996-02-25 03:02:53 +0000
commitfa277022da80c9662ca1f71008237cedffb02b81 (patch)
treec6dd94e0161747040028b852b7612df328d98197 /sys/amd64/amd64/trap.c
parent1fbe25ba15e7516a059c67359958c3c7dbd06cf5 (diff)
downloadFreeBSD-src-fa277022da80c9662ca1f71008237cedffb02b81.zip
FreeBSD-src-fa277022da80c9662ca1f71008237cedffb02b81.tar.gz
Fix a problem with tracking the modified bit. Eliminate the
ugly inline-asm code, and speed up the page-table-page tracking.
Diffstat (limited to 'sys/amd64/amd64/trap.c')
-rw-r--r--sys/amd64/amd64/trap.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 8b44962..e270a58 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
- * $Id: trap.c,v 1.70 1996/01/04 21:11:03 wollman Exp $
+ * $Id: trap.c,v 1.71 1996/01/19 03:57:42 dyson Exp $
*/
/*
@@ -486,7 +486,7 @@ trap_pfault(frame, usermode)
if (va < VM_MIN_KERNEL_ADDRESS) {
vm_offset_t v;
- vm_page_t ptepg;
+ vm_page_t mpte;
if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS &&
@@ -534,12 +534,12 @@ trap_pfault(frame, usermode)
if (*((int *)vtopte(v)) == 0)
(void) vm_fault(map, trunc_page(v), VM_PROT_WRITE, FALSE);
- pmap_use_pt( vm_map_pmap(map), va);
+ mpte = pmap_use_pt( vm_map_pmap(map), va);
/* Fault in the user page: */
rv = vm_fault(map, va, ftype, FALSE);
- pmap_unuse_pt( vm_map_pmap(map), va);
+ pmap_unuse_pt( vm_map_pmap(map), va, mpte);
--p->p_lock;
} else {
@@ -622,6 +622,7 @@ trap_pfault(frame, usermode)
if (map != kernel_map) {
vm_offset_t v;
+ vm_page_t mpte;
/*
* Keep swapout from messing with us during this
@@ -652,12 +653,12 @@ trap_pfault(frame, usermode)
(void) vm_fault(map,
trunc_page(v), VM_PROT_WRITE, FALSE);
- pmap_use_pt( vm_map_pmap(map), va);
+ mpte = pmap_use_pt( vm_map_pmap(map), va);
/* Fault in the user page: */
rv = vm_fault(map, va, ftype, FALSE);
- pmap_unuse_pt( vm_map_pmap(map), va);
+ pmap_unuse_pt( vm_map_pmap(map), va, mpte);
--p->p_lock;
} else {
OpenPOWER on IntegriCloud