Hi, So it turns out that my allocator is not capable of handling the pmap_prefer horror. This diff exports the actual parameters of pmap_prefer, so I can make the allocator deal with this intelligently.
I need compile tests on: - arm - hppa - hppa64 - m68k - mips64 - sh - sparc - sparc64 Since the code is not actually called, it should not affect running of kernels. Ok? -- Ariane Index: arch//arm/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/arm/include/pmap.h,v retrieving revision 1.17 diff -u -d -p -r1.17 pmap.h --- arch//arm/include/pmap.h 23 Mar 2011 16:54:34 -0000 1.17 +++ arch//arm/include/pmap.h 5 Apr 2011 16:30:58 -0000 @@ -620,6 +620,14 @@ vaddr_t pmap_prefer(vaddr_t, vaddr_t); extern uint32_t pmap_alias_dist; extern uint32_t pmap_alias_bits; + +/* pmap prefer alias alignment. */ +#define PMAP_PREFER_ALIGN() (pmap_alias_dist) +/* pmap prefer offset withing alignment. */ +#define PMAP_PREFER_OFFSET(of) \ + (PMAP_PREFER_ALIGN() == 0 ? 0 : ((of) & (PMAP_PREFER_ALIGN() - 1))) + + #endif /* _LOCORE */ #endif /* _KERNEL */ Index: arch//hppa/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/hppa/include/pmap.h,v retrieving revision 1.40 diff -u -d -p -r1.40 pmap.h --- arch//hppa/include/pmap.h 26 Dec 2010 15:40:59 -0000 1.40 +++ arch//hppa/include/pmap.h 5 Apr 2011 16:30:59 -0000 @@ -101,6 +101,11 @@ pmap_prefer(vaddr_t offs, vaddr_t hint) return pmap_prefer_hint; } +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() (HPPA_PGALIAS) +/* pmap prefer offset within alignment */ +#define PMAP_PREFER_OFFSET(of) ((of) & HPPA_PGAOFF) + #define pmap_sid2pid(s) (((s) + 1) << 1) #define pmap_kernel() (&kernel_pmap_store) #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count) Index: arch//hppa64/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/hppa64/include/pmap.h,v retrieving revision 1.4 diff -u -d -p -r1.4 pmap.h --- arch//hppa64/include/pmap.h 26 Dec 2010 15:40:59 -0000 1.4 +++ arch//hppa64/include/pmap.h 5 Apr 2011 16:30:59 -0000 @@ -68,6 +68,11 @@ pmap_prefer(vaddr_t offs, vaddr_t hint) return pmap_prefer_hint; } +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() (HPPA_PGALIAS) +/* pmap prefer offset within alignment */ +#define PMAP_PREFER_OFFSET(of) ((of) & HPPA_PGAOFF) + #define PMAP_GROWKERNEL #define PMAP_STEAL_MEMORY Index: arch//m68k/include/pmap_motorola.h =================================================================== RCS file: /cvs/src/sys/arch/m68k/include/pmap_motorola.h,v retrieving revision 1.22 diff -u -d -p -r1.22 pmap_motorola.h --- arch//m68k/include/pmap_motorola.h 23 Mar 2011 16:54:35 -0000 1.22 +++ arch//m68k/include/pmap_motorola.h 5 Apr 2011 16:30:59 -0000 @@ -139,6 +139,12 @@ void pmap_kenter_cache(vaddr_t, paddr_t, #ifdef M68K_MMU_HP vaddr_t pmap_prefer(vaddr_t, vaddr_t); #define PMAP_PREFER(foff, va) pmap_prefer((foff), (va)) + +extern int pmap_aliasmask; /* separation at which VA aliasing is ok */ +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() (pmap_aliasmask ? pmap_aliasmask + 1 : 0) +/* pmap prefer offset */ +#define PMAP_PREFER_OFFSET(of) ((of) & pmap_aliasmask) #endif #endif /* _KERNEL */ Index: arch//m68k/m68k/pmap_motorola.c =================================================================== RCS file: /cvs/src/sys/arch/m68k/m68k/pmap_motorola.c,v retrieving revision 1.59 diff -u -d -p -r1.59 pmap_motorola.c --- arch//m68k/m68k/pmap_motorola.c 6 Dec 2010 20:57:16 -0000 1.59 +++ arch//m68k/m68k/pmap_motorola.c 5 Apr 2011 16:30:59 -0000 @@ -276,9 +276,6 @@ vaddr_t virtual_end; /* VA of last avai TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist; int pv_nfree; -#if defined(M68K_MMU_HP) -extern int pmap_aliasmask; /* separation at which VA aliasing is ok */ -#endif #if defined(M68040) || defined(M68060) int protostfree; /* prototype (default) free ST map */ #endif Index: arch//mips64/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/mips64/include/pmap.h,v retrieving revision 1.25 diff -u -d -p -r1.25 pmap.h --- arch//mips64/include/pmap.h 23 Mar 2011 16:54:36 -0000 1.25 +++ arch//mips64/include/pmap.h 5 Apr 2011 16:30:59 -0000 @@ -125,6 +125,13 @@ extern struct pmap *const kernel_pmap_pt #define PMAP_PREFER(pa, va) pmap_prefer(pa, va) +extern vaddr_t CpuCacheAliasMask; /* from mips64/mips64/cpu.c */ +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() \ + (CpuCacheAliasMask ? CpuCacheAliasMask + 1 : 0) +/* pmap prefer offset in alignment */ +#define PMAP_PREFER_OFFSET(of) ((of) & CpuCacheAliasMask) + #define pmap_update(x) do { /* nothing */ } while (0) void pmap_bootstrap(void); Index: arch//sh/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/sh/include/pmap.h,v retrieving revision 1.9 diff -u -d -p -r1.9 pmap.h --- arch//sh/include/pmap.h 26 Dec 2010 15:41:00 -0000 1.9 +++ arch//sh/include/pmap.h 5 Apr 2011 16:31:00 -0000 @@ -81,6 +81,13 @@ pmap_remove_all(struct pmap *pmap) #ifdef SH4 #define PMAP_PREFER(pa, va) pmap_prefer((pa), (va)) vaddr_t pmap_prefer(vaddr_t, vaddr_t); +vaddr_t pmap_prefer_align(); +vaddr_t pmap_prefer_offset(vaddr_t); + +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() pmap_prefer_align() +/* pmap prefer offset in alignment */ +#define PMAP_PREFER_OFFSET(of) pmap_prefer_offset(of) #endif /* SH4 */ #define __HAVE_PMAP_DIRECT Index: arch//sh/sh/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/sh/sh/pmap.c,v retrieving revision 1.17 diff -u -d -p -r1.17 pmap.c --- arch//sh/sh/pmap.c 14 Dec 2010 20:24:25 -0000 1.17 +++ arch//sh/sh/pmap.c 5 Apr 2011 16:31:00 -0000 @@ -903,6 +903,28 @@ pmap_prefer(vaddr_t foff, vaddr_t va) return va; } + +/* + * pmap_prefer_align() + * + * Return virtual cache alignment. + */ +vaddr_t +pmap_prefer_align(void) +{ + return SH_HAS_VIRTUAL_ALIAS ? sh_cache_prefer_mask + 1 : 0; +} + +/* + * pmap_prefer_offset(vaddr_t of) + * + * Calculate offset in virtual cache. + */ +vaddr_t +pmap_prefer_offset(vaddr_t of) +{ + return of & (SH_HAS_VIRTUAL_ALIAS ? sh_cache_prefer_mask : 0); +} #endif /* SH4 */ /* Index: arch//sparc/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/sparc/include/pmap.h,v retrieving revision 1.51 diff -u -d -p -r1.51 pmap.h --- arch//sparc/include/pmap.h 23 Mar 2011 16:54:37 -0000 1.51 +++ arch//sparc/include/pmap.h 5 Apr 2011 16:31:00 -0000 @@ -263,6 +263,13 @@ int pmap_dumpmmu(int (*)(dev #define PMAP_PREFER(fo, ap) pmap_prefer((fo), (ap)) +extern int cache_alias_dist; +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN() cache_alias_dist +/* pmap prefer offset in alignment */ +#define PMAP_PREFER_OFFSET(of) \ + ((of) & (cache_alias_dist ? cache_alias_dist - 1 : 0)) + #define PMAP_EXCLUDE_DECLS /* tells MI pmap.h *not* to include decls */ /* FUNCTION DECLARATIONS FOR COMMON PMAP MODULE */ Index: arch//sparc/sparc/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/sparc/sparc/pmap.c,v retrieving revision 1.158 diff -u -d -p -r1.158 pmap.c --- arch//sparc/sparc/pmap.c 6 Dec 2010 20:57:18 -0000 1.158 +++ arch//sparc/sparc/pmap.c 5 Apr 2011 16:31:00 -0000 @@ -6259,6 +6259,9 @@ pmap_prefer(vaddr_t foff, vaddr_t va) return va; } +/* For PMAP_PREFER_ALIGN */ +int cache_alias_dist = CACHE_ALIAS_DIST; + void pmap_remove_holes(struct vm_map *map) { Index: arch//sparc64/include/pmap.h =================================================================== RCS file: /cvs/src/sys/arch/sparc64/include/pmap.h,v retrieving revision 1.19 diff -u -d -p -r1.19 pmap.h --- arch//sparc64/include/pmap.h 26 Dec 2010 15:41:00 -0000 1.19 +++ arch//sparc64/include/pmap.h 5 Apr 2011 16:31:00 -0000 @@ -169,6 +169,11 @@ void pmap_bootstrap(u_long, u_long, u_in /* make sure all page mappings are modulo 16K to prevent d$ aliasing */ #define PMAP_PREFER(pa, va) ((va) + (((va) ^ (pa)) & VA_ALIAS_MASK)) +/* pmap prefer alignment */ +#define PMAP_PREFER_ALIGN (VA_ALIAS_MASK + 1) +/* pmap prefer offset in alignment */ +#define PMAP_PREFER_OFFSET(of) ((of) & VA_ALIAS_MASK) + #define PMAP_GROWKERNEL /* turn on pmap_growkernel interface */ /* SPARC specific? */