aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Dyson <dyson@FreeBSD.org>1996-06-19 03:39:24 +0000
committerJohn Dyson <dyson@FreeBSD.org>1996-06-19 03:39:24 +0000
commit0157d6d925272363d8f6dc09a7cf2b0a66e4bb70 (patch)
tree25f9060f13c362c9d8eb6ee8f90b519c1dcc4133
parent8e3bda06824c92859314dd1d1bd4f870a6ad2bd4 (diff)
downloadsrc-0157d6d925272363d8f6dc09a7cf2b0a66e4bb70.tar.gz
src-0157d6d925272363d8f6dc09a7cf2b0a66e4bb70.zip
Notes
-rw-r--r--sys/amd64/amd64/vm_machdep.c65
-rw-r--r--sys/i386/i386/vm_machdep.c65
2 files changed, 32 insertions, 98 deletions
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index e764b2f7def5..4d870ed268c4 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -38,7 +38,7 @@
*
* from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91
* Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
- * $Id: vm_machdep.c,v 1.62 1996/05/02 14:19:55 phk Exp $
+ * $Id: vm_machdep.c,v 1.63 1996/05/18 03:36:22 dyson Exp $
*/
#include "npx.h"
@@ -685,24 +685,15 @@ void
vmapbuf(bp)
register struct buf *bp;
{
- register int npf;
- register caddr_t addr;
- int off;
- vm_offset_t kva;
+ register caddr_t addr, v, kva;
vm_offset_t pa;
if ((bp->b_flags & B_PHYS) == 0)
panic("vmapbuf");
- /*
- * this is the kva that is to be used for
- * the temporary kernel mapping
- */
- kva = (vm_offset_t) bp->b_saveaddr;
-
- for (addr = (caddr_t)trunc_page(bp->b_data);
+ for (v = bp->b_saveaddr, addr = bp->b_data;
addr < bp->b_data + bp->b_bufsize;
- addr += PAGE_SIZE) {
+ addr += PAGE_SIZE, v += PAGE_SIZE) {
/*
* do the vm_fault if needed, do the copy-on-write thing when
@@ -710,31 +701,16 @@ vmapbuf(bp)
*/
vm_fault_quick(addr,
(bp->b_flags&B_READ)?(VM_PROT_READ|VM_PROT_WRITE):VM_PROT_READ);
- pa = pmap_kextract((vm_offset_t) addr);
+ pa = trunc_page(pmap_kextract((vm_offset_t) addr));
if (pa == 0)
panic("vmapbuf: page not present");
-/*
- * hold the data page
- */
-#ifdef DIAGNOSTIC
- if( VM_PAGE_TO_PHYS(PHYS_TO_VM_PAGE(pa)) != pa)
- panic("vmapbuf: confused PHYS_TO_VM_PAGE mapping");
-#endif
vm_page_hold(PHYS_TO_VM_PAGE(pa));
+ pmap_kenter((vm_offset_t) v, pa);
}
- addr = bp->b_saveaddr = bp->b_data;
- off = (int)addr & PAGE_MASK;
- npf = btoc(round_page(bp->b_bufsize + off));
- bp->b_data = (caddr_t) (kva + off);
- while (npf--) {
- pa = pmap_kextract((vm_offset_t)addr);
- if (pa == 0)
- panic("vmapbuf: null page frame");
- pmap_kenter(kva, trunc_page(pa));
- addr += PAGE_SIZE;
- kva += PAGE_SIZE;
- }
+ kva = bp->b_saveaddr;
+ bp->b_saveaddr = bp->b_data;
+ bp->b_data = kva + (((vm_offset_t) bp->b_data) & PAGE_MASK);
}
/*
@@ -751,26 +727,17 @@ vunmapbuf(bp)
if ((bp->b_flags & B_PHYS) == 0)
panic("vunmapbuf");
- for (addr = (caddr_t)trunc_page((vm_offset_t) bp->b_data);
- addr < bp->b_data + bp->b_bufsize;
- addr += PAGE_SIZE)
- pmap_kremove((vm_offset_t) addr);
-
- bp->b_data = bp->b_saveaddr;
- bp->b_saveaddr = NULL;
-
-/*
- * unhold the pde, and data pages
- */
- for (addr = (caddr_t)trunc_page((vm_offset_t) bp->b_data);
+ for (addr = bp->b_data;
addr < bp->b_data + bp->b_bufsize;
addr += PAGE_SIZE) {
- /*
- * release the data page
- */
- pa = pmap_kextract((vm_offset_t) addr);
+
+ pa = trunc_page(pmap_kextract((vm_offset_t) addr));
+ pmap_kremove((vm_offset_t) addr);
vm_page_unhold(PHYS_TO_VM_PAGE(pa));
+
}
+
+ bp->b_data = bp->b_saveaddr;
}
/*
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index e764b2f7def5..4d870ed268c4 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -38,7 +38,7 @@
*
* from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91
* Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
- * $Id: vm_machdep.c,v 1.62 1996/05/02 14:19:55 phk Exp $
+ * $Id: vm_machdep.c,v 1.63 1996/05/18 03:36:22 dyson Exp $
*/
#include "npx.h"
@@ -685,24 +685,15 @@ void
vmapbuf(bp)
register struct buf *bp;
{
- register int npf;
- register caddr_t addr;
- int off;
- vm_offset_t kva;
+ register caddr_t addr, v, kva;
vm_offset_t pa;
if ((bp->b_flags & B_PHYS) == 0)
panic("vmapbuf");
- /*
- * this is the kva that is to be used for
- * the temporary kernel mapping
- */
- kva = (vm_offset_t) bp->b_saveaddr;
-
- for (addr = (caddr_t)trunc_page(bp->b_data);
+ for (v = bp->b_saveaddr, addr = bp->b_data;
addr < bp->b_data + bp->b_bufsize;
- addr += PAGE_SIZE) {
+ addr += PAGE_SIZE, v += PAGE_SIZE) {
/*
* do the vm_fault if needed, do the copy-on-write thing when
@@ -710,31 +701,16 @@ vmapbuf(bp)
*/
vm_fault_quick(addr,
(bp->b_flags&B_READ)?(VM_PROT_READ|VM_PROT_WRITE):VM_PROT_READ);
- pa = pmap_kextract((vm_offset_t) addr);
+ pa = trunc_page(pmap_kextract((vm_offset_t) addr));
if (pa == 0)
panic("vmapbuf: page not present");
-/*
- * hold the data page
- */
-#ifdef DIAGNOSTIC
- if( VM_PAGE_TO_PHYS(PHYS_TO_VM_PAGE(pa)) != pa)
- panic("vmapbuf: confused PHYS_TO_VM_PAGE mapping");
-#endif
vm_page_hold(PHYS_TO_VM_PAGE(pa));
+ pmap_kenter((vm_offset_t) v, pa);
}
- addr = bp->b_saveaddr = bp->b_data;
- off = (int)addr & PAGE_MASK;
- npf = btoc(round_page(bp->b_bufsize + off));
- bp->b_data = (caddr_t) (kva + off);
- while (npf--) {
- pa = pmap_kextract((vm_offset_t)addr);
- if (pa == 0)
- panic("vmapbuf: null page frame");
- pmap_kenter(kva, trunc_page(pa));
- addr += PAGE_SIZE;
- kva += PAGE_SIZE;
- }
+ kva = bp->b_saveaddr;
+ bp->b_saveaddr = bp->b_data;
+ bp->b_data = kva + (((vm_offset_t) bp->b_data) & PAGE_MASK);
}
/*
@@ -751,26 +727,17 @@ vunmapbuf(bp)
if ((bp->b_flags & B_PHYS) == 0)
panic("vunmapbuf");
- for (addr = (caddr_t)trunc_page((vm_offset_t) bp->b_data);
- addr < bp->b_data + bp->b_bufsize;
- addr += PAGE_SIZE)
- pmap_kremove((vm_offset_t) addr);
-
- bp->b_data = bp->b_saveaddr;
- bp->b_saveaddr = NULL;
-
-/*
- * unhold the pde, and data pages
- */
- for (addr = (caddr_t)trunc_page((vm_offset_t) bp->b_data);
+ for (addr = bp->b_data;
addr < bp->b_data + bp->b_bufsize;
addr += PAGE_SIZE) {
- /*
- * release the data page
- */
- pa = pmap_kextract((vm_offset_t) addr);
+
+ pa = trunc_page(pmap_kextract((vm_offset_t) addr));
+ pmap_kremove((vm_offset_t) addr);
vm_page_unhold(PHYS_TO_VM_PAGE(pa));
+
}
+
+ bp->b_data = bp->b_saveaddr;
}
/*