Module Name:    src
Committed By:   mrg
Date:           Sat Nov 28 21:38:56 UTC 2009

Modified Files:
        src/sys/arch/sparc64/sparc64: locore.s

Log Message:
implement enough code to get SB2000/SB2500 booting to multiuser.  does
not last long if you use it, but an idle machine has stayed up 10 hours.

- for the !SPITFIRE case, use ASI_DCACHE_INVALIDATE instead of
  ASI_DCACHE_TAG when clearing tlb entries.  from openbsd.

- convert some comment "! Not yet" into "WRITEME", so that attempting
  to build a USIII MULTIPROCESSOR kernel fails to build until the code
  is written.

- add some more WRITEME's for the above.

- implement a !SPITFIRE version of sp_tlb_flush_all().  since there are
  no spare regs, for now just always increase %tl around this call.  (we
  could maybe store a token in %o3 along with the saved %pstate info.)


To generate a diff of this commit:
cvs rdiff -u -r1.294 -r1.295 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.294 src/sys/arch/sparc64/sparc64/locore.s:1.295
--- src/sys/arch/sparc64/sparc64/locore.s:1.294	Thu Nov 26 00:19:22 2009
+++ src/sys/arch/sparc64/sparc64/locore.s	Sat Nov 28 21:38:55 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.294 2009/11/26 00:19:22 matt Exp $	*/
+/*	$NetBSD: locore.s,v 1.295 2009/11/28 21:38:55 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath
@@ -55,7 +55,9 @@
  *	@(#)locore.s	8.4 (Berkeley) 12/10/93
  */
 
+#ifndef SCHIZO_BUS_SPACE_BROKEN /* Need phys access for USIII so far */
 #define	SPITFIRE		/* We don't support Cheetah (USIII) yet */
+#endif
 #undef	PARANOID		/* Extremely expensive consistency checks */
 #undef	NO_VCACHE		/* Map w/D$ disabled */
 #undef	TRAPSTATS		/* Count traps */
@@ -2529,7 +2531,11 @@
 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
 	brnz,pt	%g7, 1b
 	 dec	8, %g7
 #endif
@@ -3811,7 +3817,7 @@
 	membar	#Sync
 	IPIEVC_INC(IPI_EVCNT_TLB_PTE,%g2,%g3)
 #else
-	! Not yet
+	WRITEME
 #endif
 	 
 	ba,a	ret_from_intr_vector
@@ -3845,7 +3851,7 @@
 	membar	#Sync
 	IPIEVC_INC(IPI_EVCNT_TLB_CTX,%g2,%g3)
 #else
-	! Not yet
+	WRITEME
 #endif
 	 
 	ba,a	ret_from_intr_vector
@@ -5491,6 +5497,9 @@
 	 nop
 #endif
 #else
+#ifdef MULTIPROCESSOR
+	WRITEME
+#endif
 	!!
 	!! Cheetahs do not support flushing the IMMU from secondary context
 	!!
@@ -5519,7 +5528,7 @@
 	 nop
 1:	
 	retl
-	 wrpr	%g0, 0, %tl				! Return to kernel mode.
+	 wrpr	%g0, %o3, %tl				! Return to kernel mode.
 #endif
 
 /*
@@ -5585,6 +5594,9 @@
 	 nop
 #endif
 #else
+#ifdef MULTIPROCESSOR
+	WRITEME
+#endif
 	rdpr	%tl, %o3
 	mov	CTX_PRIMARY, %o2
 	brnz	%o3, 1f
@@ -5607,7 +5619,7 @@
 	 nop
 1:	
 	retl
-	 wrpr	%g0, 0, %tl			! Return to kernel mode.
+	 wrpr	%g0, %o3, %tl			! Return to kernel mode.
 #endif
 
 /*
@@ -5631,8 +5643,9 @@
 	! %o1 = ctx value
 	! %o2 = TLB tag value
 	! %o3 = saved %pstate
-	! %o4 = saved secondary ctx
+	! %o4 = saved primary ctx
 	! %o5 = CTX_MASK
+	! %xx = saved %tl
 
 0:
 	ldxa	[%o0] ASI_DMMU_TLB_TAG, %o2		! fetch the TLB tag
@@ -5682,7 +5695,82 @@
 	retl
 	 wrpr	%o3, %pstate
 #else
-	WRITEME
+	! XXX bump up %tl around this call always
+	rdpr	%tl, %o4
+	inc	%o4
+	wrpr	%o4, 0, %tl
+
+	rdpr	%pstate, %o3
+	andn	%o3, PSTATE_IE, %o4			! disable interrupts
+	wrpr	%o4, 0, %pstate
+	set	(63 * 8), %o0				! last TLB entry
+	set	CTX_PRIMARY, %o4
+	ldxa	[%o4] ASI_DMMU, %o4			! save secondary context
+	set	CTX_MASK, %o5
+	membar	#Sync
+
+	! %o0 = loop counter
+	! %o1 = ctx value
+	! %o2 = TLB tag value
+	! %o3 = saved %pstate
+	! %o4 = saved primary ctx
+	! %o5 = CTX_MASK
+	! %xx = saved %tl
+
+0:
+	ldxa	[%o0] ASI_DMMU_TLB_TAG, %o2		! fetch the TLB tag
+	andcc	%o2, %o5, %o1				! context 0?
+	bz,pt	%xcc, 1f				! if so, skip
+	 mov	CTX_PRIMARY, %o2
+
+	stxa	%o1, [%o2] ASI_DMMU			! set the context
+	set	DEMAP_CTX_PRIMARY, %o2
+	membar	#Sync
+	stxa	%o2, [%o2] ASI_DMMU_DEMAP		! do the demap
+	membar	#Sync
+
+1:
+	dec	8, %o0
+	brgz,pt %o0, 0b					! loop over all entries
+	 nop
+
+/*
+ * now do the IMMU
+ */
+
+	set	(63 * 8), %o0				! last TLB entry
+
+0:
+	ldxa	[%o0] ASI_IMMU_TLB_TAG, %o2		! fetch the TLB tag
+	andcc	%o2, %o5, %o1				! context 0?
+	bz,pt	%xcc, 1f				! if so, skip
+	 mov	CTX_PRIMARY, %o2
+
+	stxa	%o1, [%o2] ASI_DMMU			! set the context
+	set	DEMAP_CTX_PRIMARY, %o2
+	membar	#Sync
+	stxa	%o2, [%o2] ASI_IMMU_DEMAP		! do the demap
+	membar	#Sync
+
+1:
+	dec	8, %o0
+	brgz,pt %o0, 0b					! loop over all entries
+	 nop
+
+	set	CTX_PRIMARY, %o2
+	stxa	%o4, [%o2] ASI_DMMU			! restore secondary ctx
+	sethi	%hi(KERNBASE), %o4
+	membar	#Sync
+	flush	%o4
+
+	! XXX bump up %tl around this call always
+	rdpr	%tl, %o4
+	dec	%o4
+	wrpr	%o4, 0, %tl
+
+	retl
+	 wrpr	%o3, %pstate
+
 #endif
 
 /*
@@ -5706,7 +5794,11 @@
 	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
 	brnz,pt	%o1, 1b
 	 dec	32, %o1
 	sethi	%hi(KERNBASE), %o2
@@ -5779,7 +5871,11 @@
 	bne,pt	%xcc, 1b
 	 membar	#LoadStore
 
+#ifdef SPITFIRE
 	stxa	%g0, [%o0] ASI_DCACHE_TAG
+#else
+	stxa	%g0, [%o0] ASI_DCACHE_INVALIDATE
+#endif
 	ba,pt	%icc, 1b
 	 membar	#StoreLoad
 2:
@@ -5883,7 +5979,11 @@
 	 nop
 
 	membar	#LoadStore
+#ifdef SPITFIRE
 	stxa	%g0, [%o4] ASI_DCACHE_TAG ! Just right
+#else
+	stxa	%g0, [%o4] ASI_DCACHE_INVALIDATE ! Just right
+#endif
 2:
 #ifndef SPITFIRE
 	cmp	%o0, %g1
@@ -5891,7 +5991,7 @@
 	 cmp	%o1, %g1
 	bgt,pt	%icc, 3f
 	 nop
-	stxa	%g0, [%o4] ASI_ICACHE_TAG
+	stxa	%g0, [%o4] ASI_DCACHE_INVALIDATE
 3:
 #endif
 	membar	#StoreLoad

Reply via email to