Update to make use of a proper kenter implementation for vmapbuf and vunmapbuf.
This commit is contained in:
parent
6e43d02452
commit
6cca1c3f58
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue