> Date: Tue, 5 Apr 2011 18:42:47 +0200
> From: Ariane van der Steldt <[email protected]>
>
> 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?
Fine with me. With this, can't we completely get rid of the PMAP_PREFER?
> 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? */