diff options
author | 2006-11-14 19:49:48 +0000 | |
---|---|---|
committer | 2006-11-14 19:49:48 +0000 | |
commit | a845c29aa7bfedc870c9a088fdb3d5298cd9b99d (patch) | |
tree | c0b74e3c10415bd06649747488e4888b6e34fe76 /sys | |
parent | Do not align jump targets to cache line boundaries at -O2 on OpenBSD. (diff) | |
download | wireguard-openbsd-a845c29aa7bfedc870c9a088fdb3d5298cd9b99d.tar.xz wireguard-openbsd-a845c29aa7bfedc870c9a088fdb3d5298cd9b99d.zip |
A less awkward pagemove() implementation.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/sh/sh/vm_machdep.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/sys/arch/sh/sh/vm_machdep.c b/sys/arch/sh/sh/vm_machdep.c index 34632af76af..375f3df4ec9 100644 --- a/sys/arch/sh/sh/vm_machdep.c +++ b/sys/arch/sh/sh/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.3 2006/11/05 18:57:45 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.4 2006/11/14 19:49:48 miod Exp $ */ /* $NetBSD: vm_machdep.c,v 1.53 2006/08/31 16:49:21 matt Exp $ */ /*- @@ -271,29 +271,26 @@ cpu_coredump(struct proc *p, struct vnode *vp, struct ucred *cred, void pagemove(caddr_t from, caddr_t to, size_t size) { - paddr_t pa; - boolean_t rv; + pt_entry_t *fpte, *tpte; #ifdef DEBUG - if (size % PAGE_SIZE) + if (size & PAGE_MASK) panic("pagemove: size=%08lx", (u_long) size); #endif + if (SH_HAS_VIRTUAL_ALIAS) + sh_dcache_wbinv_range((vaddr_t)from, size); + + fpte = __pmap_kpte_lookup((vaddr_t)from); + tpte = __pmap_kpte_lookup((vaddr_t)to); while (size > 0) { - rv = pmap_extract(pmap_kernel(), (vaddr_t) from, &pa); -#ifdef DEBUG - if (rv == FALSE) - panic("pagemove 2"); - if (pmap_extract(pmap_kernel(), (vaddr_t) to, NULL) == TRUE) - panic("pagemove 3"); -#endif - pmap_kremove((vaddr_t) from, PAGE_SIZE); - pmap_kenter_pa((vaddr_t) to, pa, VM_PROT_READ|VM_PROT_WRITE); + *tpte++ = *fpte; + sh_tlb_invalidate_addr(0, (vaddr_t)from); + sh_tlb_invalidate_addr(0, (vaddr_t)to); from += PAGE_SIZE; to += PAGE_SIZE; size -= PAGE_SIZE; } - pmap_update(pmap_kernel()); } /* |