patch-2.1.42 linux/arch/sparc64/kernel/rtrap.S

Next file: linux/arch/sparc64/kernel/setup.c
Previous file: linux/arch/sparc64/kernel/ptrace.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.41/linux/arch/sparc64/kernel/rtrap.S linux/arch/sparc64/kernel/rtrap.S
@@ -1,4 +1,4 @@
-/* $Id: rtrap.S,v 1.14 1997/05/18 08:42:14 davem Exp $
+/* $Id: rtrap.S,v 1.18 1997/05/27 06:28:05 davem Exp $
  * rtrap.S: Preparing for return from trap on Sparc V9.
  *
  * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
@@ -9,11 +9,14 @@
 #include <asm/pstate.h>
 #include <asm/ptrace.h>
 #include <asm/spitfire.h>
+#include <asm/head.h>
 
-/* We assume here this is entered with AG, MG and IG bits in pstate clear */
+	/* We assume here that this is entered with AG, MG and IG bits
+	 * in pstate clear.
+	 */
 
 	.text
-	.align	4
+	.align	32
 	.globl	rtrap
 rtrap:
 	sethi	%hi(bh_active), %l2
@@ -23,24 +26,26 @@
 	ldx	[%l2 + %g4], %l3
 	ldx	[%l1 + %g4], %l4
 	andcc	%l3, %l4, %g0
+	nop
+
 	be,pt	%xcc, 2f
 	 nop
 	call	do_bottom_half
 	 nop
-2:
-	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE], %l1
-	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC], %l2
+2:	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE], %l1
 	sethi	%hi(0xf << 20), %l4
 	andcc	%l1, TSTATE_PRIV, %l3
 	and	%l1, %l4, %l4
+
 	rdpr	%pstate, %l7
-	andn	%l1, %l4, %l1			/* XXX May not be needed -DaveM */
+	andn	%l1, %l4, %l1
 	be,pt	%icc, to_user
 	 andn	%l7, PSTATE_IE, %l7
-3:
+3:	ldx	[%g6 + AOFF_task_tss + AOFF_thread_ctx], %l6
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G1], %g1
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G2], %g2
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G3], %g3
+
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G4], %g4
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G5], %g5
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G6], %g6
@@ -49,54 +54,54 @@
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1], %i1
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I2], %i2
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I3], %i3
+
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I4], %i4
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I5], %i5
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I6], %i6
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I7], %i7
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_Y], %o3
+	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC], %l2
 	ldx	[%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %o2
-	rdpr	%tl, %o4
 	wr	%o3, %g0, %y
-	add	%o4, 1, %o4
 
 	srl	%l4, 20, %l4
 	wrpr	%l7, %g0, %pstate
 	wrpr	%l4, 0x0, %pil
-	wrpr	%o4, %g0, %tl
+	wrpr	%g0, 0x1, %tl
 	wrpr	%l1, %g0, %tstate
 	wrpr	%l2, %g0, %tpc
 	brnz,pn	%l3, 1f
 	 wrpr	%o2, %g0, %tnpc
 
-	/* We came here from to_user, ie. we have now AG.
-	 * Also have to push user context back into primary.
-	 */
-	mov	SECONDARY_CONTEXT, %g6
-	mov	PRIMARY_CONTEXT, %g7
-	ldxa	[%g6] ASI_DMMU, %g4
-	stxa	%g4, [%g7] ASI_DMMU
-	membar	#Sync			/* XXX flushi would be better -DaveM */
-
-	rdpr	%wstate, %g1
-	rdpr	%otherwin, %g2
-	srl	%g1, 3, %g1
-	wrpr	%g2, %g0, %canrestore
-	wrpr	%g1, %g0, %wstate
+	mov	PRIMARY_CONTEXT, %l7
+	sethi	%uhi(KERNBASE), %l5
+	sllx	%l5, 32, %l5
+	stxa	%l6, [%l7] ASI_DMMU
+	flush	%l5
+	rdpr	%wstate, %l1
+	rdpr	%otherwin, %l2
+	srl	%l1, 3, %l1
+
+	wrpr	%l2, %g0, %canrestore
+	wrpr	%l1, %g0, %wstate
 	wrpr	%g0, %g0, %otherwin
-1:
-	restore
+1:	restore
 	retry
 to_user:
 	sethi	%hi(need_resched), %l0
 	or	%l0, %lo(need_resched), %l0
 	ld	[%l0 + %g4], %l0
+
 	wrpr	%l7, PSTATE_IE, %pstate
-	brz,pt	%l0, 1f
+	brz,pt	%l0, check_signal
 	 ldx	[%g6 + AOFF_task_signal], %l0
 	call	schedule
 	 nop
-1:
+	ldx	[%g6 + AOFF_task_signal], %l0
+	nop
+check_signal:
 	ldx	[%g6 + AOFF_task_blocked], %o0
+
 	or	%l7, PSTATE_AG, %l7		! Will need this for setting back wstate
 	andncc	%l0, %o0, %g0
 	be,pt	%xcc, check_user_wins
@@ -105,8 +110,17 @@
 	call	do_signal
 	 add	%sp, STACK_BIAS + REGWIN_SZ, %o1
 check_user_wins:
+#if 0
+	call	user_rtrap_report
+	 add	%sp, STACK_BIAS + REGWIN_SZ, %o0
+#endif
 	ldx	[%g6 + AOFF_task_tss + AOFF_thread_w_saved], %o2
+
 	brz,pt	%o2, 3b
 	 add	%sp, STACK_BIAS + REGWIN_SZ, %o1
 	call	fault_in_user_windows
 	 add	%o7, 3b-.-4, %o7
+	nop
+	nop
+	nop
+	nop

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov