PERFORCE change 97811 for review

Kip Macy kmacy at FreeBSD.org
Thu May 25 10:56:23 PDT 2006


http://perforce.freebsd.org/chv.cgi?CH=97811

Change 97811 by kmacy at kmacy_storage:sun4v_work on 2006/05/25 17:54:45

	if we take an interrupt before saving g7 at utl0 and then resume on another cpu, g7 will be
	trashed by loading the pcpu scratch register over it - save g7 while still at tl 1 with 
	interrupts disable to prevent this from happening

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#15 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#57 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#15 (text+ko) ====

@@ -204,10 +204,9 @@
 	stx	%g3, [TF + TF_G3]; \
 	stx	%g4, [TF + TF_G4]; \
 	stx	%g5, [TF + TF_G5]; \
-	stx	%g6, [TF + TF_G6]; \
-	stx	%g7, [TF + TF_G7]; 
+	stx	%g6, [TF + TF_G6]; 
 
-#define	RESTORE_GLOBALS(TF) \
+#define	RESTORE_GLOBALS_USER(TF) \
 	ldx	[TF + TF_G1], %g1; \
 	ldx	[TF + TF_G2], %g2; \
 	ldx	[TF + TF_G3], %g3; \
@@ -216,6 +215,16 @@
 	ldx	[TF + TF_G6], %g6; \
 	ldx	[TF + TF_G7], %g7;
 
+#define	RESTORE_GLOBALS_KERNEL(TF) \
+	mov  SCRATCH_REG_PCPU, %g7; \
+	ldx	[TF + TF_G1], %g1; \
+	ldx	[TF + TF_G2], %g2; \
+	ldx	[TF + TF_G3], %g3; \
+	ldx	[TF + TF_G4], %g4; \
+	ldx	[TF + TF_G5], %g5; \
+	ldx	[TF + TF_G6], %g6; \
+	ldxa [%g0 + %g7]ASI_SCRATCHPAD, %g7;
+
 #define	SAVE_OUTS(TF) \
 	stx	%i0, [TF + TF_O0]; \
 	stx	%i1, [TF + TF_O1]; \

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#57 (text+ko) ====

@@ -287,13 +287,20 @@
 	GET_MMFSA_SCRATCH(%g1)			
 	mov	MMFSA_D_ADDR, %g2
 	ldxa	[%g1 + %g2]ASI_REAL, %g3
-	sub	%g0, 1, %g4
-	set	trap, %g1
-	ba	%xcc, tl0_trap 
-	  mov	T_DATA_EXCEPTION, %g2
+	ba,a,pt %xcc, data_excptn_fault
 	.align	32
 	.endm
 
+ENTRY(data_excptn_fault)
+	mov	MMFSA_D_CTX, %g7 
+	ldxa	[%g1 + %g7]ASI_REAL, %g4
+	sllx	%g4, TRAP_CTX_SHIFT, %g4
+	or	%g4, T_DATA_EXCEPTION, %g2
+	set	trap, %g1
+	sub	%g0, 1, %g4
+	ba,a,pt	%xcc, tl0_trap 
+END(data_excptn_fault)
+
 	.macro	data_miss
 	GET_MMFSA_SCRATCH(%g1)			
 	mov	MMFSA_D_TYPE, %g2 
@@ -319,19 +326,19 @@
 	.macro	tl0_align
 	GET_MMFSA_SCRATCH(%g1)	
 	mov	MMFSA_D_ADDR, %g3
-!	mov	MMFSA_D_CTX,  %g7
+	mov	MMFSA_D_CTX,  %g7
 	ldxa	[%g1 + %g3]ASI_REAL, %g3
-!	ldxa	[%g1 + %g7]ASI_REAL, %g4
 	ba,a,pt	%xcc, align_fault
 	.align	32
 	.endm
 
 ENTRY(align_fault)
-!	or	%g4, %g3, %g3
+	ldxa	[%g1 + %g7]ASI_REAL, %g4
+	sllx	%g4, TRAP_CTX_SHIFT, %g4
+	or	%g4, T_MEM_ADDRESS_NOT_ALIGNED, %g2
 	sub	%g0, 1, %g4
 	set	trap, %g1
-	ba,pt	%xcc, tl0_trap
-	  mov   T_MEM_ADDRESS_NOT_ALIGNED, %g2
+	ba,a,pt	%xcc, tl0_trap
 END(align_fault)
 		
 	.macro	cpu_mondo
@@ -913,7 +920,9 @@
 	
 ENTRY(utl0)
 	SAVE_GLOBALS(%l7)
+	rd	%asi, %g1
 	SAVE_OUTS(%l7)
+	stx	%g1, [%l7 + TF_ASI]
 	GET_PCPU_SCRATCH_SLOW(%g6)
 	wrpr	%g0, PSTATE_KERNEL, %pstate	! enable ints
 
@@ -972,8 +981,10 @@
 	! restore user globals and outs
 	!
 	rdpr	%pstate, %l1
+	ldx	[%l7 + TF_ASI], %g1
 	wrpr	%l1, PSTATE_IE, %pstate
-	RESTORE_GLOBALS(%l7)
+	wr	%g1, 0, %asi
+	RESTORE_GLOBALS_USER(%l7)
 	wrpr	%g0, 1, %gl
 	RESTORE_OUTS(%l7)
 
@@ -1014,42 +1025,6 @@
 	add	%l3, WSTATE_CLEAN_OFFSET, %l3	! convert to "clean" wstate
 	wrpr	%g0, %l3, %wstate
 	wrpr	%g0, %g1, %canrestore
-#ifdef notyet
-
-	!
-	! First attempt to restore from the watchpoint saved register window
-	tst	%g1
-	bne,a	1f
-	  clrn	[%g6 + STACK_BIAS + MPCB_RSP0]
-	tst	%fp
-	be,a	1f
-	  clrn	[%g6 + STACK_BIAS + MPCB_RSP0]
-	! test for user return window in pcb
-	ldn	[%g6 + STACK_BIAS + MPCB_RSP0], %g1
-	cmp	%fp, %g1
-	bne	1f
-	  clrn	[%g6 + STACK_BIAS + MPCB_RSP0]
-	restored
-	restore
-	! restore from user return window
-	RESTORE_V9WINDOW(%g6 + STACK_BIAS + MPCB_RWIN0)
-	!
-	! Attempt to restore from the scond watchpoint saved register window
-	tst	%fp
-	be,a	2f
-	  clrn	[%g6 + STACK_BIAS + MPCB_RSP1]
-	ldn	[%g6 + STACK_BIAS + MPCB_RSP1], %g1
-	cmp	%fp, %g1
-	bne	2f
-	  clrn	[%g6 + STACK_BIAS + MPCB_RSP1]
-	restored
-	restore
-	RESTORE_V9WINDOW(%g6 + STACK_BIAS + MPCB_RWIN1)
-	save
-	b,a	2f
-1:
-
-#endif
 	
 	rdpr	%canrestore, %g1
 	brnz	%g1, 3f
@@ -1091,7 +1066,9 @@
 ENTRY(ktl0)
 	nop
 	SAVE_GLOBALS(%l7)
+	rd	%asi, %g1
 	SAVE_OUTS(%l7)
+	stx	%g1, [%l7 + TF_ASI]
 	GET_PCPU_SCRATCH_SLOW(%g6)		! we really shouldn't need this ...				
 	wrpr	%g0, PSTATE_KERNEL, %pstate	! enable ints
 
@@ -1117,11 +1094,11 @@
 	! restore globals and outs
 	!
 	rdpr	%pstate, %l1
+	ldx	[%l7 + TF_ASI], %g1
 	wrpr	%l1, PSTATE_IE, %pstate
-	
+	wr	%g1, 0, %asi	
 
-	RESTORE_GLOBALS(%l7)
-	GET_PCPU_SCRATCH			! we may have changed cpus
+	RESTORE_GLOBALS_KERNEL(%l7)
 	
 	! switch to global set 1
 	wrpr	%g0, 1, %gl
@@ -1316,7 +1293,12 @@
 	wrpr	%g0, %g4, %pil
 1:		
 	wrpr	%g0, %g6, %tnpc
-	rdpr	%cwp, %l0
+	
+	wrpr	%g0, 0, %gl
+	stx	%g7, [%l7 + TF_G7]		! save g7 before it can be overwritten by PCPU when returning from an interrupt 
+	wrpr	%g0, 1, %gl
+
+		rdpr	%cwp, %l0
 	set	TSTATE_KERNEL, %l1
 	wrpr	%l1, %l0, %tstate
 	done	


More information about the p4-projects mailing list