diff options
author | John Dyson <dyson@FreeBSD.org> | 1996-06-19 03:39:24 +0000 |
---|---|---|
committer | John Dyson <dyson@FreeBSD.org> | 1996-06-19 03:39:24 +0000 |
commit | 0157d6d925272363d8f6dc09a7cf2b0a66e4bb70 (patch) | |
tree | 25f9060f13c362c9d8eb6ee8f90b519c1dcc4133 | |
parent | 8e3bda06824c92859314dd1d1bd4f870a6ad2bd4 (diff) | |
download | src-0157d6d925272363d8f6dc09a7cf2b0a66e4bb70.tar.gz src-0157d6d925272363d8f6dc09a7cf2b0a66e4bb70.zip |
Notes
-rw-r--r-- | sys/amd64/amd64/vm_machdep.c | 65 | ||||
-rw-r--r-- | sys/i386/i386/vm_machdep.c | 65 |
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; } /* |