Update to make use of a proper kenter implementation for vmapbuf and vunmapbuf.

This commit is contained in:
chris 2001-08-11 12:57:25 +00:00
parent 6e43d02452
commit 6cca1c3f58
1 changed files with 16 additions and 44 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: vm_machdep.c,v 1.2 2001/08/05 05:07:27 matt Exp $ */
/* $NetBSD: vm_machdep.c,v 1.3 2001/08/11 12:57:25 chris Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@ -310,8 +310,8 @@ vmapbuf(bp, len)
vsize_t len;
{
vaddr_t faddr, taddr, off;
pt_entry_t *fpte, *tpte;
int pages;
paddr_t fpa;
#ifdef PMAP_DEBUG
if (pmap_debug_level >= 0)
@ -324,36 +324,24 @@ vmapbuf(bp, len)
taddr = uvm_km_valloc_wait(phys_map, len);
faddr = trunc_page((vaddr_t)bp->b_data);
faddr = trunc_page((vaddr_t)bp->b_saveaddr = bp->b_data);
off = (vaddr_t)bp->b_data - faddr;
len = round_page(off + len);
bp->b_saveaddr = bp->b_data;
bp->b_data = (caddr_t)(taddr + off);
/*
* The region is locked, so we expect that pmap_pte() will return
* non-NULL.
*/
fpte = pmap_pte(vm_map_pmap(&bp->b_proc->p_vmspace->vm_map), faddr);
tpte = pmap_pte(vm_map_pmap(phys_map), taddr);
/*
* Make sure the cache does not have dirty data for the
* pages we are replacing
*/
if (len <= 0x1000) {
cpu_cache_purgeID_rng(faddr, len);
cpu_cache_purgeID_rng(taddr, len);
} else
cpu_cache_purgeID();
for (pages = len >> PAGE_SHIFT; pages; pages--)
*tpte++ = *fpte++;
if (len <= 0x1000)
cpu_tlb_flushID_SE(taddr);
else
cpu_tlb_flushID();
while (len) {
(void) pmap_extract(vm_map_pmap(&bp->b_proc->p_vmspace->vm_map),
faddr, &fpa);
pmap_kenter_pa(taddr, fpa, VM_PROT_READ|VM_PROT_WRITE);
faddr += PAGE_SIZE;
taddr += PAGE_SIZE;
len -= PAGE_SIZE;
}
pmap_update();
}
/*
@ -365,8 +353,6 @@ vunmapbuf(bp, len)
vsize_t len;
{
vaddr_t addr, off;
pt_entry_t *pte;
int pages;
#ifdef PMAP_DEBUG
if (pmap_debug_level >= 0)
@ -384,25 +370,11 @@ vunmapbuf(bp, len)
addr = trunc_page((vaddr_t)bp->b_data);
off = (vaddr_t)bp->b_data - addr;
len = round_page(off + len);
pmap_kremove(addr, len);
pmap_update();
uvm_km_free_wakeup(phys_map, addr, len);
bp->b_data = bp->b_saveaddr;
bp->b_saveaddr = 0;
pte = pmap_pte(vm_map_pmap(phys_map), addr);
if (len <= 0x2000)
cpu_cache_purgeID_rng(addr, len);
else
cpu_cache_purgeID();
for (pages = len >> PAGE_SHIFT; pages; pages--)
*pte++ = 0;
if (len <= 0x1000)
cpu_tlb_flushID_SE(addr);
else
cpu_tlb_flushID();
uvm_km_free_wakeup(phys_map, addr, len);
}
/* End of vm_machdep.c */