diff options
author | 2006-06-24 13:22:14 +0000 | |
---|---|---|
committer | 2006-06-24 13:22:14 +0000 | |
commit | fc243674ce4aa0f35b5cc712b89787343bb18e2f (patch) | |
tree | 9a6fffb532f0a595db1237bd784f3acbaa364e22 /sys | |
parent | Use pmap_kenter_cache() for device memory mapping, instead of physacc(0 (diff) | |
download | wireguard-openbsd-fc243674ce4aa0f35b5cc712b89787343bb18e2f.tar.xz wireguard-openbsd-fc243674ce4aa0f35b5cc712b89787343bb18e2f.zip |
Add pmap_enter_cache(), similar to pmap_kenter_cache() but for managed
pages, and implement pmap_enter() as a particular case of it.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/m68k/include/pmap_motorola.h | 3 | ||||
-rw-r--r-- | sys/arch/m68k/m68k/pmap_motorola.c | 42 |
2 files changed, 34 insertions, 11 deletions
diff --git a/sys/arch/m68k/include/pmap_motorola.h b/sys/arch/m68k/include/pmap_motorola.h index 00dba40bd9a..e2fa7ccb2bc 100644 --- a/sys/arch/m68k/include/pmap_motorola.h +++ b/sys/arch/m68k/include/pmap_motorola.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap_motorola.h,v 1.14 2006/06/17 16:29:10 miod Exp $ */ +/* $OpenBSD: pmap_motorola.h,v 1.15 2006/06/24 13:22:14 miod Exp $ */ /* * Copyright (c) 1987 Carnegie-Mellon University @@ -135,6 +135,7 @@ extern char *vmmap; /* map for mem, dumps, etc. */ void pmap_proc_iflush(struct proc *, vaddr_t, vsize_t); +int pmap_enter_cache(pmap_t, vaddr_t, paddr_t, vm_prot_t, int, pt_entry_t); void pmap_kenter_cache(vaddr_t, paddr_t, pt_entry_t); #ifdef M68K_MMU_HP diff --git a/sys/arch/m68k/m68k/pmap_motorola.c b/sys/arch/m68k/m68k/pmap_motorola.c index 81336332102..e56c554cb58 100644 --- a/sys/arch/m68k/m68k/pmap_motorola.c +++ b/sys/arch/m68k/m68k/pmap_motorola.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap_motorola.c,v 1.45 2006/06/20 20:40:18 miod Exp $ */ +/* $OpenBSD: pmap_motorola.c,v 1.46 2006/06/24 13:22:15 miod Exp $ */ /* * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -975,6 +975,33 @@ pmap_enter(pmap, va, pa, prot, flags) vm_prot_t prot; int flags; { + pt_entry_t pte; + + pte = 0; +#if defined(M68040) || defined(M68060) + if (mmutype <= MMU_68040 && (pte_prot(prot) & PG_PROT) == PG_RW) +#ifdef PMAP_DEBUG + if (dowriteback && (dokwriteback || pmap != pmap_kernel())) +#endif + pte |= PG_CCB; +#endif + return (pmap_enter_cache(pmap, va, pa, prot, flags, pte)); +} + +/* + * Similar to pmap_enter(), but allows the caller to control the + * cacheability of the mapping. However if it is found that this mapping + * needs to be cache inhibited, the cache bits from the caller are ignored. + */ +int +pmap_enter_cache(pmap, va, pa, prot, flags, template) + pmap_t pmap; + vaddr_t va; + paddr_t pa; + vm_prot_t prot; + int flags; + pt_entry_t template; +{ struct vm_page *pg; pt_entry_t *pte; int npte, error; @@ -986,8 +1013,8 @@ pmap_enter(pmap, va, pa, prot, flags) boolean_t wired = (flags & PMAP_WIRED) != 0; PMAP_DPRINTF(PDB_FOLLOW|PDB_ENTER, - ("pmap_enter(%p, %lx, %lx, %x, %x)\n", - pmap, va, pa, prot, wired)); + ("pmap_enter_cache(%p, %lx, %lx, %x, %x, %x)\n", + pmap, va, pa, prot, wired, template)); #ifdef DIAGNOSTIC /* @@ -1235,13 +1262,8 @@ validate: if (!cacheable) #endif npte |= PG_CI; -#if defined(M68040) || defined(M68060) - if (mmutype <= MMU_68040 && (npte & (PG_PROT|PG_CI)) == PG_RW) -#ifdef PMAP_DEBUG - if (dowriteback && (dokwriteback || pmap != pmap_kernel())) -#endif - npte |= PG_CCB; -#endif + else + npte |= template; PMAP_DPRINTF(PDB_ENTER, ("enter: new pte value %x\n", npte)); |