> Date: Tue, 5 Apr 2011 18:42:47 +0200
> From: Ariane van der Steldt <ari...@stack.nl>
> 
> 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? */

Reply via email to