PERFORCE change 93682 for review
Kip Macy
kmacy at FreeBSD.org
Tue Mar 21 03:31:03 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=93682
Change 93682 by kmacy at kmacy_storage:sun4vtmp on 2006/03/21 03:30:11
avoid stepping on user register
implement general case trap handlers
don't use %g7 except as PCPU_REG in general trap handlers
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#36 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#36 (text+ko) ====
@@ -211,18 +211,17 @@
.endm
.macro tl0_setup type
- tl0_split
+ clr %g3
+ mov 0, %g4
+ set trap, %g1
ba %xcc, tl0_trap
- mov \type, %g1
+ mov \type, %g2
.endm
/*
* Generic trap type. Call trap() with the specified type.
*/
.macro tl0_gen type
- MAGIC_TRAP_ON
- MAGIC_TRAP_ON
- MAGIC_EXIT
tl0_setup \type
.align 32
.endm
@@ -520,6 +519,8 @@
.macro tl0_pil_entry level, mask
#if 1
+ wrpr %g0, 1, %tl
+ wrpr %g0, 1, %gl
set \mask, %g1
clr %g2
clr %g3
@@ -573,29 +574,10 @@
INTR_LEVEL(0)
.endm
- .macro tl0_immu_miss
- nop
- .align 128
- .endm
-
-
- .macro tl0_spill_bad count
- .rept \count
- sir
- .align 128
- .endr
- .endm
-
- .macro tl0_fill_bad count
- .rept \count
- sir
- .align 128
- .endr
- .endm
.macro tl0_syscall
clr %g3
- mov -1, %g4
+ mov 0, %g4
set syscall, %g1
ba %xcc, tl0_trap
mov T_SYSCALL, %g2
@@ -927,29 +909,33 @@
ENTRY(utl0)
- GET_PCPU_SCRATCH
+ nop
SAVE_GLOBALS(%l7)
SAVE_OUTS(%l7)
+ GET_PCPU_SCRATCH
wrpr %g0, PSTATE_KERNEL, %pstate ! enable ints
brnz %o1, common_utrap
nop
call critical_enter
nop
+ wrpr %g0, 0, %pil
jmpl %l3, %o7 ! call trap handler
mov %l7, %o0
call critical_exit
nop
b user_rtt
nop
-common_utrap:
+common_utrap:
+ wrpr %g0, 0, %pil
jmpl %l3, %o7 ! call trap handler
mov %l7, %o0
- GET_PCB(%g6)
+ ldx [PCPU_REG + PC_CURPCB], %g6
sub %g6, CCFSZ + SPOFF + TF_SIZEOF, %sp
add %sp, REGOFF + SPOFF, %l7
ENTRY(user_rtt)
+ GET_PCPU_SCRATCH
! pil handling needs to be re-visited
wrpr %g0, PIL_TICK, %pil
ldx [PCPU(CURTHREAD)], %l0
@@ -966,8 +952,9 @@
ba,a,pt %xcc, user_rtt
nop
-1: GET_PCB(PCB_REG)
- ldx [PCB_REG + PCB_NSAVED], %l1
+1:
+ ldx [PCPU_REG + PC_CURPCB], %g6
+ ldx [%g6 + PCB_NSAVED], %l1
brz,a,pt %l1, 2f
nop
wrpr %g0, 0, %pil
@@ -985,11 +972,9 @@
wrpr %l1, PSTATE_IE, %pstate
RESTORE_GLOBALS(%l7)
wrpr %g0, 1, %gl
- mov %sp, %g6 ! save tf pointer
RESTORE_OUTS(%l7)
wrpr %g0, 0, %pil ! drop pil to 0
-
wrpr %g0, 1, %tl ! raise tl -> 1 before setting pcontext
mov MMU_CID_S, %g1
@@ -1005,7 +990,7 @@
ldx [%l7 + TF_TPC], %g1
ldx [%l7 + TF_TNPC], %g2
ldx [%l7 + TF_TSTATE], %l0
- andn %l0, TSTATE_CWP_MASK, %g7
+ andn %l0, TSTATE_CWP_MASK, %g6
wrpr %g1, %tpc
wrpr %g2, %tnpc
@@ -1059,7 +1044,7 @@
brnz %g1, 3f
nop ! no trap, use restore directly
rdpr %cwp, %g1
- wrpr %g1, %g7, %tstate ! needed by wbuf recovery code
+ wrpr %g1, %g6, %tstate ! needed by wbuf recovery code
! hand craft the restore to avoid getting to TL > 2
rdpr %wstate, %g1
btst 1, %g1
@@ -1087,16 +1072,17 @@
rdpr %canrestore, %g1
wrpr %g0, %g1, %cleanwin
rdpr %cwp, %g1
- wrpr %g1, %g7, %tstate
-! MAGIC_TRAP_ON
+ wrpr %g1, %g6, %tstate
+! MAGIC_TRAP_ON
retry
END(user_rtt)
END(utl0)
ENTRY(ktl0)
+ nop
+ SAVE_GLOBALS(%l7)
+ SAVE_OUTS(%l7)
GET_PCPU_SCRATCH
- SAVE_GLOBALS(%l7)
- SAVE_OUTS(%l7) ! for the call bug workaround
wrpr %g0, PSTATE_KERNEL, %pstate ! enable ints
brnz %o1, common_ktrap
@@ -1109,7 +1095,7 @@
nop
b common_rtt
nop
-common_ktrap:
+common_ktrap:
jmpl %l3, %o7 ! call trap handler
mov %l7, %o0
@@ -1120,7 +1106,10 @@
!
rdpr %pstate, %l1
wrpr %l1, PSTATE_IE, %pstate
+
+
RESTORE_GLOBALS(%l7)
+
! switch to global set 1
wrpr %g0, 1, %gl
RESTORE_OUTS(%l7)
@@ -1134,23 +1123,29 @@
movg %xcc, %l6, %l0
wrpr %g0, %l0, %pil
#endif
+ GET_PCPU_SCRATCH
+ /* simulator incorrectly exits if tl != gl */
+ ldx [PCPU(CURTHREAD)], %l0
+ ldx [%l0 + TD_MD + MD_SAVED_PIL], %l0
+ wrpr %g0, %l0, %pil
!
! raise tl
! setup trap regs
! restore to window we originally trapped in
!
wrpr %g0, 1, %tl
+
ldx [%l7 + TF_TPC], %g1
ldx [%l7 + TF_TNPC], %g2
ldx [%l7 + TF_TSTATE], %l0
- andn %l0, TSTATE_CWP_MASK, %g7
+ andn %l0, TSTATE_CWP_MASK, %g6
wrpr %g1, %tpc
wrpr %g2, %tnpc
rdpr %canrestore, %g1
brnz %g1, 3f
nop ! can use restore directly
rdpr %cwp, %g1
- wrpr %g1, %g7, %tstate ! needed by wbuf recovery code
+ wrpr %g1, %g6, %tstate ! needed by wbuf recovery code
! avoid going above TL2
fill_64bit_rtt(ASI_N)
@@ -1161,7 +1156,7 @@
! set %tstate to the correct %cwp
!
rdpr %cwp, %g1
- wrpr %g1, %g7, %tstate
+ wrpr %g1, %g6, %tstate
retry
END(krtt)
END(ktl0)
@@ -1214,13 +1209,13 @@
! %l7 trapframe
ENTRY(tl0_trap)
- MAGIC_TRAP_OFF
/* if we're at tl2 we have some extra work to do */
rdpr %tl, %g5
cmp %g5, 2
be,pn %xcc, tl1_trap
nop
+ MAGIC_TRAP_OFF
rdpr %tstate, %g5
btst TSTATE_PRIV, %g5
and %g5, TSTATE_CWP_MASK, %g6
@@ -1253,7 +1248,7 @@
mov MMU_CID_P, %l1
sethi %hi(FLUSH_ADDR), %l2
SET_MMU_CONTEXT(%l1, %l0)
- flush %l2 ! flush / membar required by immu for
+ flush %l2 ! flush/membar required by immu for
! consistency guarantee
set utl0, %g6
win_saved:
@@ -1575,18 +1570,6 @@
* them to the outs.
*/
ENTRY(fork_trampoline)
-#if KTR_COMPILE & KTR_PROC
- CATR(KTR_PROC, "fork_trampoline: td=%p (%s) cwp=%#lx"
- , %g1, %g2, %g3, 7, 8, 9)
- ldx [PCPU(CURTHREAD)], %g2
- stx %g2, [%g1 + KTR_PARM1]
- ldx [%g2 + TD_PROC], %g2
- add %g2, P_COMM, %g2
- stx %g2, [%g1 + KTR_PARM2]
- rdpr %cwp, %g2
- stx %g2, [%g1 + KTR_PARM3]
-9:
-#endif
mov %l0, %o0
mov %l1, %o1
call fork_exit
More information about the p4-projects
mailing list