Subject: Re: sh4 pmap bug? (Re: port-dreamcast/34243)
To: None <port-sh3@NetBSD.org>
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
List: port-sh3
Date: 09/22/2006 20:46:41
If there is no objection, I'll commit this patch in this weekend.

It isn't perfect as I wrote in the another post, but at least
it could be a workaround for the PR, i.e. all (but not sure) binaries
work fine on patched kernels on my dreamcast.
---
Izumi Tsutsui


> I wrote:
 :
> Here is an unreliable patch:
> ---
> Index: include/cache.h
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/sh3/include/cache.h,v
> retrieving revision 1.7
> diff -u -r1.7 cache.h
> --- include/cache.h	21 Jan 2006 00:46:36 -0000	1.7
> +++ include/cache.h	23 Aug 2006 16:14:26 -0000
> @@ -156,6 +156,9 @@
>  extern int sh_cache_index_mode_icache;
>  extern int sh_cache_index_mode_dcache;
>  
> +extern int sh_cache_alias_mask;
> +#define	sh_cache_indexof(x)	(sh_cache_alias_mask & (x))
> +
>  extern struct sh_cache_ops sh_cache_ops;
>  
>  #define	sh_icache_sync_all()						\
> Index: sh3/cache.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/sh3/sh3/cache.c,v
> retrieving revision 1.11
> diff -u -r1.11 cache.c
> --- sh3/cache.c	2 Jan 2006 23:37:34 -0000	1.11
> +++ sh3/cache.c	23 Aug 2006 16:14:26 -0000
> @@ -77,6 +77,7 @@
>  int sh_cache_ram_mode;
>  int sh_cache_index_mode_icache;
>  int sh_cache_index_mode_dcache;
> +int sh_cache_alias_mask;
>  
>  void
>  sh_cache_init()
> Index: sh3/cache_sh4.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/sh3/sh3/cache_sh4.c,v
> retrieving revision 1.15
> diff -u -r1.15 cache_sh4.c
> --- sh3/cache_sh4.c	24 Dec 2005 23:24:02 -0000	1.15
> +++ sh3/cache_sh4.c	23 Aug 2006 16:14:27 -0000
> @@ -44,6 +44,7 @@
>  
>  #include <sh3/cache.h>
>  #include <sh3/cache_sh4.h>
> +#include <sh3/vmparam.h>
>  
>  #define	round_line(x)		(((x) + 31) & ~31)
>  #define	trunc_line(x)		((x) & ~31)
> @@ -134,6 +135,7 @@
>  	sh_cache_enable_dcache = (r & SH4_CCR_OCE);
>  	sh_cache_ways = ways;
>  	sh_cache_line_size = SH4_CACHE_LINESZ;
> +	sh_cache_alias_mask = (dcache_size / ways - 1) & ~PAGE_MASK;
>  	sh_cache_write_through_p0_u0_p3 = (r & SH4_CCR_WT);
>  	sh_cache_write_through_p1 = !(r & SH4_CCR_CB);
>  	sh_cache_write_through = sh_cache_write_through_p0_u0_p3 &&
> Index: sh3/pmap.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/sh3/sh3/pmap.c,v
> retrieving revision 1.55
> diff -u -r1.55 pmap.c
> --- sh3/pmap.c	7 Aug 2006 23:19:36 -0000	1.55
> +++ sh3/pmap.c	23 Aug 2006 16:14:27 -0000
> @@ -457,10 +457,15 @@
>  	s = splvm();
>  	if (SH_HAS_VIRTUAL_ALIAS) {
>  		/* Remove all other mapping on this physical page */
> + again:
>  		pvh = &pg->mdpage;
> -		while ((pv = SLIST_FIRST(&pvh->pvh_head)) != NULL) {
> -			pmap_remove(pv->pv_pmap, pv->pv_va,
> -			    pv->pv_va + PAGE_SIZE);
> +		SLIST_FOREACH(pv, &pvh->pvh_head, pv_link) {
> +			if (sh_cache_indexof(va) !=
> +			    sh_cache_indexof(pv->pv_va)) {
> +				pmap_remove(pv->pv_pmap, pv->pv_va,
> +				    pv->pv_va + PAGE_SIZE);
> +				goto again;
> +			}
>  		}
>  	}
>  
> ---
> Izumi Tsutsui
>