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
>