PERFORCE change 96139 for review

Kip Macy kmacy at FreeBSD.org
Wed Apr 26 05:43:44 UTC 2006


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

Change 96139 by kmacy at kmacy_storage:sun4v_rwbuf on 2006/04/26 05:42:52

	cleanup
	enable fp on trap
	context switch fp registers
	set pil according to saved_pil
	critical_enter -> spinlock_enter, to avoid nested interrupts for now
	don't set kernel flag on interrupts
	check trap type register for demap
	explicitly reload pcpu register when returning from kernel trap to avoid
	  value for another cpu

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#42 edit

Differences ...

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

@@ -64,10 +64,7 @@
 
 
 #define PCB_REG %g6
-	
-
 
-
 /*
  * Atomically set the reference bit in a tte.
  */
@@ -241,12 +238,7 @@
 
 
 	.macro	tl1_split
-#if 0
-	rdpr	%wstate, %g1
-	wrpr	%g1, WSTATE_NESTED, %wstate
-	save	%sp, -(CCFSZ + TF_SIZEOF), %sp
-#endif
-	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
+	call	kdb_backtrace
 	.endm
 
 	.macro	tl1_setup	type
@@ -510,13 +502,11 @@
 	.endm
 
 	.macro	spill_mixed
-	MAGIC_TRAP_ON
 	MAGIC_EXIT
 	.align	128
 	.endm
 
 	.macro	fill_mixed
-	MAGIC_TRAP_ON
 	MAGIC_EXIT
 	.align	128
 	.endm
@@ -528,11 +518,11 @@
 		
 	.macro	tl0_pil_entry level, mask
 #if 1
-	wrpr	%g0, 1, %tl
 	wrpr	%g0, 1, %gl
 	set	\mask, %g1
 	clr	%g2
 	clr	%g3
+	wr	%g1, 0, %clear_softint
 	ba	%xcc, tl0_intr
 	  mov	\level, %g4
 #else
@@ -597,6 +587,12 @@
 	 nop
 	.align	32
 	.endm
+
+	.macro tl0_fp_enable
+	wr	%g0, FPRS_FEF, %fprs
+	retry
+	.align	32
+	.endm
 	
 ENTRY(tl0_fp_restore)
 	GET_PCB(PCB_REG)
@@ -642,7 +638,7 @@
  	tl0_gen		T_PRIVILEGED_OPCODE		! 0x11
  	tl0_reserved	14				! 0x12-0x1f
 tl0_fp_disabled:
- 	tl0_gen		T_FP_DISABLED			! 0x20
+	tl0_fp_enable					! 0x20
 tl0_fp_ieee:
  	tl0_gen		T_FP_EXCEPTION_IEEE_754		! 0x21
 tl0_fp_other:
@@ -924,18 +920,16 @@
 	wrpr	%g0, PSTATE_KERNEL, %pstate	! enable ints
 
 	brnz	%o1, common_utrap
-	  nop	
-	call	critical_enter
+	  nop		
+	call	spinlock_enter
 	  nop
-	wrpr	%g0, 0, %pil	
 	jmpl	%l3, %o7			! call trap handler
 	  mov	%l7, %o0
-	call	critical_exit
+	call	spinlock_exit
 	  nop
 	b	user_rtt
 	  nop
 common_utrap:
-	wrpr	%g0, 0, %pil	
 	jmpl	%l3, %o7			! call trap handler
 	  mov	%l7, %o0
 
@@ -947,15 +941,16 @@
 	GET_PCPU_SCRATCH
 	! pil handling needs to be re-visited
 	wrpr	%g0, PIL_TICK, %pil
-	ldx	[PCPU(CURTHREAD)], %l0
-	lduw	[%l0 + TD_FLAGS], %l1
+	ldx	[PCPU(CURTHREAD)], %l4
+	lduw	[%l4 + TD_FLAGS], %l1
+	ldx	[%l4 + TD_MD + MD_SAVED_PIL], %l0
 	set	TDF_ASTPENDING | TDF_NEEDRESCHED, %l2
 	and	%l1, %l2, %l1
 	brz,a,pt %l1, 1f
 	 nop
 
 	! handle AST and retry return
-	wrpr	%g0, 0, %pil
+	wrpr	%g0, %l0, %pil
 	call	ast
 	  mov   %l7, %o0
 	ba,a,pt	%xcc, user_rtt
@@ -966,7 +961,7 @@
 	ldx	[%g6 + PCB_NSAVED], %l1
 	brz,a,pt %l1, 2f
 	  nop
-	wrpr	%g0, 0, %pil
+	wrpr	%g0, %l0, %pil
 	mov	T_SPILL, %o1
 	call	trap
 	  mov	%l7, %o0
@@ -996,14 +991,22 @@
 	!
 	! setup trap regs
 	!
+
 	ldx	[%l7 + TF_TPC], %g1
 	ldx	[%l7 + TF_TNPC], %g2
 	ldx	[%l7 + TF_TSTATE], %l0
-	andn	%l0, TSTATE_CWP_MASK, %g6
+	ldx	[%l7 + TF_FPRS], %l1
 
 	wrpr	%g1, %tpc
 	wrpr	%g2, %tnpc
-	!
+	andn	%l0, TSTATE_CWP_MASK, %g6
+
+	wr	%g0, FPRS_FEF, %fprs
+	ldx	[%l7 + TF_FSR], %fsr
+	wr	%l1, 0, %fprs	
+
+
+		!
 	! switch "other" windows back to "normal" windows and
 	! restore to window we originally trapped in
 	!
@@ -1095,11 +1098,11 @@
 
 	brnz	%o1, common_ktrap
 	  nop	
-	call	critical_enter
+	call	spinlock_enter
 	  nop
 	jmpl	%l3, %o7			! call trap handler
 	  mov	%l7, %o0
-	call	critical_exit
+	call	spinlock_exit
 	  nop
 	b	common_rtt
 	  nop
@@ -1117,7 +1120,8 @@
 	
 
 	RESTORE_GLOBALS(%l7)
-
+	GET_PCPU_SCRATCH			! we may have changed cpus
+	
 	! switch to global set 1
 	wrpr	%g0, 1, %gl
 	RESTORE_OUTS(%l7)
@@ -1142,12 +1146,20 @@
 	!
 	wrpr	%g0, 1, %tl
 	
+	ldx	[%l7 + TF_TSTATE], %l0
 	ldx	[%l7 + TF_TPC], %g1
 	ldx	[%l7 + TF_TNPC], %g2
-	ldx	[%l7 + TF_TSTATE], %l0
+	ldx	[%l7 + TF_FPRS], %l1
+			
 	andn	%l0, TSTATE_CWP_MASK, %g6
 	wrpr	%g1, %tpc
 	wrpr	%g2, %tnpc
+
+
+	wr	%g0, FPRS_FEF, %fprs
+	ldx	[%l7 + TF_FSR], %fsr
+	wr	%l1, 0, %fprs	
+	
 	rdpr	%canrestore, %g1
 	brnz	%g1, 3f
 	  nop				! can use restore directly
@@ -1167,17 +1179,19 @@
 	retry
 END(krtt)	
 END(ktl0)
-	
-	! temporaries:	%g3-%g5
-	! 
-	!
+
+
+
 ENTRY(tl0_ktrap)
 	GET_PCPU_SCRATCH
         set     ktl0, %g6
+	
 	save	%sp, -(CCFSZ + TF_SIZEOF), %sp
-	
+		
+	brz	%g2, 2f
+	  nop
 	or	%g2, T_KERNEL, %g2	
-		
+2:			
 	! if the kwbuf is full we need to save to the stack now
 	ld	[PCPU_REG + PC_KWBUF_FULL], %o0   
 	brz,pt	%o0, 1f
@@ -1195,12 +1209,11 @@
 	! %g2=level %g1=mask
 	
 ENTRY(tl0_intr)
-	wr	%g1, 0, %clear_softint
 	SET(intr_handlers, %g7, %g6)
 	sllx	%g4, IH_SHIFT, %g7
 	ldx	[%g6 + %g7], %g1	! pointer to interrupt handler
-	rdpr	%pil, %g5	! interrupted pil
-	wrpr	%g4, 0, %pil
+	rdpr	%pil, %g5
+!	wrpr	%g4, 0, %pil
 	mov	%g5, %g4
 				
 	! %g1		pc of trap handler
@@ -1223,7 +1236,6 @@
 	be,pn	%xcc, tl1_trap
 	  nop
 	
-!	MAGIC_TRAP_OFF	
 	rdpr	%tstate, %g5
 	btst	TSTATE_PRIV, %g5
 	and	%g5, TSTATE_CWP_MASK, %g6
@@ -1273,8 +1285,18 @@
 	rdpr	%tnpc, %l1
 	rdpr	%tstate, %l2
 	stx	%l0, [%l7 + TF_TPC]
+	rd	%fprs, %l0
 	stx	%l1, [%l7 + TF_TNPC]
 	stx	%l2, [%l7 + TF_TSTATE]
+	stx	%l0, [%l7 + TF_FPRS]
+
+	/*
+	 * According to the sparc64 port fp must me enabled
+	 * before reading %fsr
+	 */
+	wr	%g0, FPRS_FEF, %fprs
+	stx	%fsr, [%l7 + TF_FSR]
+	wr	%g0, 0, %fprs
 	!
 	!  setup pil
 	!
@@ -1285,8 +1307,7 @@
 	cmp	%g4, %l0
 	bge,pt	%xcc, 0f
 	  nop
-	MAGIC_TRAP_ON
-	MAGIC_TRAP_ON
+	call	panic
 	MAGIC_EXIT		
 0:	
 #endif
@@ -1294,7 +1315,6 @@
 	wrpr	%g0, %g4, %pil
 1:		
 	wrpr	%g0, %g6, %tnpc
-	MAGIC_TRAP_OFF
 	rdpr	%cwp, %l0
 	set	TSTATE_KERNEL, %l1
 	wrpr	%l1, %l0, %tstate
@@ -1383,6 +1403,7 @@
 	! %g1 == abs index %g2 == THE pointer %g3 == flags
 	! %g4 <- tag %g5 <- data
 	! %g6 == search tag %g7 == fault addr
+
 tsb_miss_lookup_0:  
 	ldda	[%g2]%asi, %g4
 	cmp	%g4, %g0			! entry tag == 0 ?
@@ -1425,15 +1446,7 @@
 5:	! not found
 	! we need to jump to tl0_trap to drop us back down to tl0
 	! and take us to trap(...) to service the fault
-#ifdef PMAP_DEBUG
-#if 0
-	srlx    %g6, TTARGET_CTX_SHIFT, %g4	! recover context
-	brnz	%g4, 16f
-	  nop
-	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
-#endif
-16:	
-#endif
+
 	srlx	%g7, 13, %g7			! slow painful way of masking off 
 	sllx	%g7, 13, %g7			! bottom bits without using a reg
 						! XXX FIXME
@@ -1504,19 +1517,22 @@
 	cmp	%g2, %g4
 	bne,pt	%xcc, 10f
 	  nop
+	call	kdb_backtrace
 	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT	! die if all we're doing 
 						! is storing same data
 10:
 	mov	%g1, %g2	
 #endif
+	stxa	%g0, [%g2 + %g7]ASI_REAL		! invalidate data	
 	stxa	%g4, [%g2]ASI_REAL			! store tag
 	stxa	%g5, [%g2 + %g7]ASI_REAL		! store data
 
 	! XXX the following intstruction should be replaced with a
 	! retry on HVs that do auto-demap
 ontario_demap_errata_patch:
-	andcc	%g5, VTD_W, %g0			! if write-enabled we know it was a prot fault
-	bnz,pn	%xcc, demap_begin
+	rdpr	%tt, %g5
+	cmp	%g5, T_DATA_PROTECTION
+	beq,pn	%xcc, demap_begin
 	  nop
 	retry
 demap_begin:
@@ -1555,7 +1571,8 @@
 /*
  * Programming error
  */
-ENTRY(unsupported_fault_trap)	
+ENTRY(unsupported_fault_trap)
+	call kdb_backtrace	
 	MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
 END(unsupported_fault_trap)
 
@@ -1585,7 +1602,6 @@
 #define	TRAP_ENTRY_SHIFT	5
 #define	TRAP_ENTRY_MASK		0x1ff
 ENTRY(tl1_trap)
-	! MAGIC_TRAP_ON
 	! assume no tl1 handler
 	rdpr	%tpc, %g7
 


More information about the p4-projects mailing list