Module Name: src Committed By: mrg Date: Tue Feb 2 03:07:06 UTC 2010
Modified Files: src/sys/arch/sparc64/sparc64: locore.s Log Message: for now, reduce a few #ifdef SPITFIRE cases by introducing a new ASI_DCACHE_TAG_OR_INV that is either ASI_DCACHE_{TAG,_INVALIDATE}. increase the common code in cache_flush_phys(). To generate a diff of this commit: cvs rdiff -u -r1.308 -r1.309 src/sys/arch/sparc64/sparc64/locore.s Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/sparc64/locore.s diff -u src/sys/arch/sparc64/sparc64/locore.s:1.308 src/sys/arch/sparc64/sparc64/locore.s:1.309 --- src/sys/arch/sparc64/sparc64/locore.s:1.308 Mon Feb 1 07:01:40 2010 +++ src/sys/arch/sparc64/sparc64/locore.s Tue Feb 2 03:07:06 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.308 2010/02/01 07:01:40 mrg Exp $ */ +/* $NetBSD: locore.s,v 1.309 2010/02/02 03:07:06 mrg Exp $ */ /* * Copyright (c) 1996-2002 Eduardo Horvath @@ -195,6 +195,12 @@ /* Give this real authority: reset the machine */ #define NOTREACHED sir +#ifdef SPITFIRE +#define ASI_DCACHE_TAG_OR_INV ASI_DCACHE_TAG +#else +#define ASI_DCACHE_TAG_OR_INV ASI_DCACHE_INVALIDATE +#endif + /* * This macro will clear out a cache line before an explicit * access to that location. It's mostly used to make certain @@ -206,11 +212,11 @@ #ifdef DCACHE_BUG #define DLFLUSH(a,t) \ andn a, 0x1f, t; \ - stxa %g0, [ t ] ASI_DCACHE_TAG; \ + stxa %g0, [ t ] ASI_DCACHE_TAG_OR_INV; \ membar #Sync /* The following can be used if the pointer is 16-byte aligned */ #define DLFLUSH2(t) \ - stxa %g0, [ t ] ASI_DCACHE_TAG; \ + stxa %g0, [ t ] ASI_DCACHE_TAG_OR_INV; \ membar #Sync #else #define DLFLUSH(a,t) @@ -2364,11 +2370,7 @@ 1: #if 1 /* Now we need to blast away the D$ to make sure we're in sync */ -#ifdef SPITFIRE - stxa %g0, [%g7] ASI_DCACHE_TAG -#else - stxa %g0, [%g7] ASI_DCACHE_INVALIDATE -#endif + stxa %g0, [%g7] ASI_DCACHE_TAG_OR_INV brnz,pt %g7, 1b dec 8, %g7 #endif @@ -5386,11 +5388,7 @@ andn %o3, PSTATE_IE, %o4 ! Turn off PSTATE_IE bit wrpr %o4, 0, %pstate 1: -#ifdef SPITFIRE - stxa %g0, [%o1] ASI_DCACHE_TAG -#else - stxa %g0, [%o1] ASI_DCACHE_INVALIDATE -#endif + stxa %g0, [%o1] ASI_DCACHE_TAG_OR_INV brnz,pt %o1, 1b dec 32, %o1 sethi %hi(KERNBASE), %o2 @@ -5463,11 +5461,7 @@ bne,pt %xcc, 1b membar #LoadStore -#ifdef SPITFIRE - stxa %g0, [%o0] ASI_DCACHE_TAG -#else - stxa %g0, [%o0] ASI_DCACHE_INVALIDATE -#endif + stxa %g0, [%o0] ASI_DCACHE_TAG_OR_INV ba,pt %icc, 1b membar #StoreLoad 2: @@ -5515,38 +5509,30 @@ clr %o4 1: ldxa [%o4] ASI_DCACHE_TAG, %o3 -#ifdef SPITFIRE - ldda [%o4] ASI_ICACHE_TAG, %g0 ! Tag goes in %g1 -- not on cheetah -#endif sllx %o3, 40-29, %o3 ! Shift D$ tag into place and %o3, %o2, %o3 ! Mask out trash -#ifdef SPITFIRE + cmp %o0, %o3 blt,pt %xcc, 2f ! Too low - sllx %g1, 40-35, %g1 ! Shift I$ tag into place - cmp %o1, %o3 + cmp %o1, %o3 bgt,pt %xcc, 2f ! Too high nop membar #LoadStore - stxa %g0, [%o4] ASI_DCACHE_TAG ! Just right + stxa %g0, [%o4] ASI_DCACHE_TAG_OR_INV ! Just right 2: - and %g1, %o2, %g1 ! Mask out trash +#ifdef SPITFIRE + ldda [%o4] ASI_ICACHE_TAG, %g0 ! Tag goes in %g1 + sllx %g1, 40-35, %g1 ! Shift I$ tag into place + and %g1, %o2, %g1 ! Mask out trash cmp %o0, %g1 blt,pt %xcc, 3f cmp %o1, %g1 bgt,pt %xcc, 3f nop stxa %g0, [%o4] ASI_ICACHE_TAG -#else - cmp %o0, %o3 - blt,pt %xcc, 3f - cmp %o1, %o3 - bgt,pt %xcc, 3f - nop - stxa %g0, [%o4] ASI_DCACHE_INVALIDATE ! Just right -#endif 3: +#endif membar #StoreLoad dec 32, %o5 brgz,pt %o5, 1b