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