Subject: Re: replace pa_to_pvh() and pa_to_attribute() macro
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
From: Jason Thorpe <thorpej@shagadelic.org>
List: port-mips
Date: 11/22/2005 20:49:38
On Nov 21, 2005, at 8:41 AM, Izumi Tsutsui wrote:

> Some discussion is going on tech-kern, but is it OK
> to commit the attached diff against mips/pmap.c?

A good first step.  Next is to move those things into the optional  
machine-dependent vm_page extensions like the Alpha port does :-)

> ---
> Izumi Tsutsui
>
>
> Index: pmap.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/mips/mips/pmap.c,v
> retrieving revision 1.160
> diff -u -r1.160 pmap.c
> --- pmap.c	5 Nov 2005 10:57:49 -0000	1.160
> +++ pmap.c	21 Nov 2005 16:29:56 -0000
> @@ -221,22 +221,6 @@
>  	((pm) == pmap_kernel() || 					\
>  	 (pm) == curlwp->l_proc->p_vmspace->vm_map.pmap)
>
> -#define	pa_to_pvh(pa)							\
> -({									\
> -	int bank_, pg_;							\
> -									\
> -	bank_ = vm_physseg_find(atop((pa)), &pg_);			\
> -	&vm_physmem[bank_].pmseg.pvent[pg_];				\
> -})
> -
> -#define	pa_to_attribute(pa)						\
> -({									\
> -	int bank_, pg_;							\
> -									\
> -	bank_ = vm_physseg_find(atop((pa)), &pg_);			\
> -	&vm_physmem[bank_].pmseg.pvent[pg_].pv_flags; 			\
> -})
> -
>  /* Forward function declarations */
>  void pmap_remove_pv(pmap_t pmap, vaddr_t va, paddr_t pa);
>  void pmap_asid_alloc(pmap_t pmap);
> @@ -249,6 +233,9 @@
>  void	*pmap_pv_page_alloc(struct pool *, int);
>  void	pmap_pv_page_free(struct pool *, void *);
>
> +static __inline struct pv_entry *pa_to_pvh(paddr_t pa);
> +static __inline int *pa_to_attribute(paddr_t pa);
> +
>  struct pool_allocator pmap_pv_page_allocator = {
>  	pmap_pv_page_alloc, pmap_pv_page_free, 0,
>  };
> @@ -260,6 +247,24 @@
>   * Misc. functions.
>   */
>
> +static __inline struct pv_entry *
> +pa_to_pvh(paddr_t pa)
> +{
> +	int bank, pg;
> +
> +	bank = vm_physseg_find(atop((pa)), &pg);
> +	return &vm_physmem[bank].pmseg.pvent[pg];
> +}
> +
> +static __inline int *
> +pa_to_attribute(paddr_t pa)
> +{
> +	int bank, pg;
> +
> +	bank = vm_physseg_find(atop((pa)), &pg);
> +	return &vm_physmem[bank].pmseg.pvent[pg].pv_flags;
> +}
> +
>  #if defined(MIPS3_PLUS)	/* XXX mmu XXX */
>  void mips_dump_segtab(struct proc *);
>  static void mips_flushcache_allpvh(paddr_t);
>
> ---

-- thorpej