PERFORCE change 93133 for review
Kip Macy
kmacy at FreeBSD.org
Sat Mar 11 07:54:29 GMT 2006
http://perforce.freebsd.org/chv.cgi?CH=93133
Change 93133 by kmacy at kmacy_storage:sun4v_work on 2006/03/11 07:53:27
revise register usage for consistency and integration with utrap
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#25 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#25 (text+ko) ====
@@ -198,7 +198,6 @@
.endm
.macro tl0_split
- GET_PCB(PCB_REG); /* load PCPU and PCB pointers */
.endm
.macro tl0_setup type
@@ -517,10 +516,11 @@
END(tl0_sfsr_trap)
.macro tl0_pil_entry level, mask
- tl0_split
- set \mask, %g2
+ set \mask, %g1
+ clr %g2
+ clr %g3
ba %xcc, tl0_intr
- mov \level, %g1
+ mov \level, %g4
.align 32
.endm
@@ -968,7 +968,7 @@
ldx [%l7 + TF_TPC], %g1
ldx [%l7 + TF_TNPC], %g2
ldx [%l7 + TF_TSTATE], %l0
- andn %l0, TSTATE_CWP_MASK, %g4
+ andn %l0, TSTATE_CWP_MASK, %g7
wrpr %g1, %tpc
wrpr %g2, %tnpc
@@ -987,14 +987,14 @@
rdpr %canrestore, %g1
brnz %g1, 3f
- nop ! no trap, use restore directly
+ nop ! no trap, use restore directly
rdpr %cwp, %g1
wrpr %g1, %g7, %tstate ! needed by wbuf recovery code
! hand craft the restore to avoid getting to TL > 2
rdpr %wstate, %g1
btst 1, %g1
beq 4f
- nop
+ nop
.global rtt_fill_start
rtt_fill_start:
#if 0
@@ -1027,22 +1027,26 @@
SAVE_OUTS(%l7) ! for the call bug workaround
wrpr %g0, PSTATE_KERNEL, %pstate ! enable ints
! MAGIC_TRAP_OFF
- #if 0
+
+ brnz %o1, common_ktrap
+ nop
call critical_enter
nop
- #endif
- stx %l4, [%l7 + TF_TYPE] ! save trap type
- stx %l5, [%l7 + TF_TAR] ! save mem info
jmpl %l3, %o7 ! call trap handler
mov %l7, %o0
- #if 0
call critical_exit
nop
- #endif
+ b common_rtt
+common_ktrap:
+ nop
+ stx %o1, [%l7 + TF_TYPE] ! save trap type
+ stx %o2, [%l7 + TF_TAR] ! save mem info
+ jmpl %l3, %o7 ! call trap handler
+ mov %l7, %o0
+
! MAGIC_TRAP_ON
ENTRY(krtt)
MAGIC_TRAP_ON
- GET_PCPU_SCRATCH
common_rtt:
!
! restore globals and outs
@@ -1072,14 +1076,14 @@
ldx [%l7 + TF_TPC], %g1
ldx [%l7 + TF_TNPC], %g2
ldx [%l7 + TF_TSTATE], %l0
- andn %l0, TSTATE_CWP_MASK, %g4
+ andn %l0, TSTATE_CWP_MASK, %g7
wrpr %g1, %tpc
wrpr %g2, %tnpc
rdpr %canrestore, %g1
brnz %g1, 3f
nop ! can use restore directly
rdpr %cwp, %g1
- wrpr %g1, %g4, %tstate ! needed by wbuf recovery code
+ wrpr %g1, %g7, %tstate ! needed by wbuf recovery code
! avoid going above TL2
fill_64bit_rtt(ASI_N)
@@ -1090,7 +1094,7 @@
! set %tstate to the correct %cwp
!
rdpr %cwp, %g1
- wrpr %g1, %g4, %tstate
+ wrpr %g1, %g7, %tstate
MAGIC_TRAP_OFF
retry
END(krtt)
@@ -1100,13 +1104,14 @@
!
!
ENTRY(tl0_ktrap)
- set ktl0, %g4
+ GET_PCPU_SCRATCH
+ set ktl0, %g6
save %sp, -(CCFSZ + TF_SIZEOF), %sp
- mov %g2, %l3 ! set trap/interrupt for tl0
- or %g1, T_KERNEL, %l4 ! pil/trap type
- mov %g6, %l5 ! fault info if set
+ mov %g1, %l3 ! set trap/interrupt for tl0
+ or %g2, T_KERNEL, %o1 ! trap type
+ mov %g3, %o2 ! fault info if set
! if the kwbuf is full we need to save to the stack now
ld [PCPU_REG + PC_KWBUF_FULL], %o0
@@ -1122,29 +1127,35 @@
! register convention:
- ! %g1=level %g2=mask
+ ! %g2=level %g1=mask
ENTRY(tl0_intr)
- wrpr %g1, 0, %pil
- wr %g2, 0, %clear_softint
- SET(intr_handlers, %g5, %g4)
- sllx %g1, IH_SHIFT, %g5
- ldx [%g4 + %g5], %g2 ! pointer to interrupt handler
-
+ wrpr %g4, 0, %pil
+ wr %g1, 0, %clear_softint
+ SET(intr_handlers, %g7, %g6)
+ sllx %g4, IH_SHIFT, %g7
+ ldx [%g6 + %g7], %g1 ! pointer to interrupt handler
- ! assumes %g3 - %g5 are free
- ! %g1 == pil that we came in on
- ! %g2 == interrupt handler
- ! %g7 == PCPU
- ! %g3-%g5 temporaries
+ ! %g1 pc of trap handler
+ ! %g2, %g3 args of trap handler
+ ! %g4 desired pil
+ ! %g5, %g6 temps
+ ! %g7 saved
+
+ ! %l0, %l1 temps
+ ! %l3 saved %g1
+ ! %l4 flags
+ ! %l5 memory fault info
+ ! %l6 %pil for priv traps
+ ! %l7 trapframe
+
ENTRY(tl0_trap)
- GET_PCPU_SCRATCH
- rdpr %tstate, %g3
- btst TSTATE_PRIV, %g3
- and %g3, TSTATE_CWP_MASK, %g4
+ rdpr %tstate, %g5
+ btst TSTATE_PRIV, %g5
+ and %g5, TSTATE_CWP_MASK, %g6
bnz,pn %xcc, tl0_ktrap
- wrpr %g0, %g4, %cwp
+ wrpr %g0, %g6, %cwp
ENTRY(tl0_utrap)
MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
@@ -1162,11 +1173,22 @@
!
! setup pil
!
- brlz,pt %g1, 1f
+ brlz,pt %g4, 1f
+ nop
+#ifdef PMAP_DEBUG
+ rdpr %pil, %l0
+ cmp %g4, %l0
+ bge,pt %xcc, 0f
nop
- wrpr %g0, %g1, %pil
+ MAGIC_TRAP_ON
+ MAGIC_TRAP_ON
+ MAGIC_EXIT
+0:
+#endif
+
+ wrpr %g0, %g4, %pil
1:
- wrpr %g0, %g4, %tnpc
+ wrpr %g0, %g6, %tnpc
rdpr %cwp, %l0
set TSTATE_KERNEL, %l1
wrpr %l1, %l0, %tstate
@@ -1219,7 +1241,8 @@
tsb_miss_null_deref:
MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! give up
3:
-#endif
+#endif
+tsb_miss_compute_hash_addr:
sethi %hi(PAGE_SIZE), %g7
sub %g7, 1, %g7 ! %g7==PAGE_MASK
@@ -1284,63 +1307,82 @@
4: ! 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
+ rdpr %tl, %g4
+ cmp %g4, 1
+ be,pt %xcc, 15f
+ nop
+ MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT
+15:
+#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 %g6, TTARGET_CTX_SHIFT, %g4 ! recover context
- or %g4, %g7, %g6
- mov T_DATA_MISS, %g1
- sethi %hi(trap), %g2
+ sethi %hi(trap), %g1
+ mov T_DATA_MISS, %g2
+ or %g4, %g7, %g3
+ mov -1, %g4
ba %xcc, tl0_trap
- or %g2, %lo(trap), %g2
+ or %g1, %lo(trap), %g1
+
tsb_miss_found:
5: !found
! %g1 == abs index %g2 == THE pointer %g3 == flags
! %g4 == tag %g5 == data %g7 == PAGE_MASK
! %g3 <- TSB RA %g6 <- TSB size, TTE RA
+ srlx %g6, TTARGET_CTX_SHIFT, %g6
+ or %g7, %g6, %g6 ! save context and fault addr
+ ! will break when ctxbits > 13
+ sethi %hi(PAGE_SIZE), %g7
+ sub %g7, 1, %g7 ! %g7==PAGE_MASK
- sethi %hi(PAGE_SIZE), %g7
- srlx %g6, TTARGET_CTX_SHIFT, %g6
- sub %g7, 1, %g7 ! %g7==PAGE_MASK
-
- andcc %g5, %g3, %g0 ! already set
- bnz,pt %xcc, 7f
+ andcc %g5, %g3, %g0 ! already set
+ bnz,pt %xcc, 7f
nop
- andcc %g3, VTD_REF, %g0 ! TSB miss
- bnz,pt %xcc, 6f
+ andcc %g3, VTD_REF, %g0 ! TSB miss
+ bnz,pt %xcc, 6f
or %g5, %g3, %g5 ! add ref/mod bit unconditionally
- andcc %g5, VTD_SW_W, %g0 ! write enabled?
- bz,pn %xcc, prot_fault_trap ! write to read only page
+ andcc %g5, VTD_SW_W, %g0 ! write enabled?
+ bz,pn %xcc, prot_fault_trap ! write to read only page
or %g5, %g3, %g5 ! add ref/mod bit unconditionally
6:
- stx %g5, [%g2 + 8] ! set ref/mod bit
+ stx %g5, [%g2 + 8] ! set ref/mod bit
7:
- cmp %g6, %g0 ! kernel context?
- be,pn %xcc, 8f
+ andcc %g6, %g7, %g0 ! kernel context?
+ bz,pn %xcc, 8f
nop
GET_TSB_SCRATCH_USER(%g3) ! %g3 == TSB (RA)
ba,pt %xcc, 9f
- and %g3, %g7, %g6 ! size of TSB in pages
+ and %g3, %g7, %g2 ! size of TSB in pages
8:
GET_TSB_SCRATCH_KERNEL(%g3) ! %g3 == TSB (RA)
- and %g3, %g7, %g6 ! size of TSB in pages
+ and %g3, %g7, %g2 ! size of TSB in pages
9:
- andn %g3, %g7, %g3 ! TSB real address
- sllx %g6, (PAGE_SHIFT - TTE_SHIFT), %g6 ! nttes
- subx %g6, 1, %g6 ! TSB_MASK
- and %g6, %g1, %g6 ! masked index
- sllx %g6, TTE_SHIFT, %g6 ! masked byte offset
- add %g6, %g3, %g6 ! TTE RA
- mov 8, %g7
+ andn %g3, %g7, %g3 ! TSB real address
+ sllx %g2, (PAGE_SHIFT - TTE_SHIFT), %g2 ! nttes
+ subx %g2, 1, %g2 ! TSB_MASK
+ and %g2, %g1, %g2 ! masked index
+ sllx %g2, TTE_SHIFT, %g2 ! masked byte offset
+ add %g2, %g3, %g2 ! TTE RA
+ mov 8, %g7
#ifdef PMAP_DEBUG
- ldda [%g6]ASI_LDTD_REAL, %g2
- cmp %g3, %g5
- bne,pt %xcc, 10f
+ mov %g2, %g1
+ ldda [%g2]ASI_LDTD_REAL, %g2
+ cmp %g3, %g5
+ bne,pt %xcc, 10f
nop
- MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing
+ MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing
! is storing same data
-10:
+10:
+ mov %g1, %g2
#endif
- stxa %g4, [%g6]ASI_REAL ! store tag
- stxa %g5, [%g6 + %g7]ASI_REAL ! store data
+ stxa %g4, [%g2]ASI_REAL ! store tag
+ stxa %g5, [%g2 + %g7]ASI_REAL ! store data
MAGIC_TRAP_OFF
! XXX the following intstruction should be replaced with a
@@ -1348,15 +1390,15 @@
ontario_demap_errata_patch:
andcc %g5, VTD_W, %g0
bnz,pn %xcc, demap_begin
- mov MMFSA_D_CTX, %g2
+ nop
retry
-demap_begin:
- GET_MMFSA_SCRATCH(%g1) ! XXX this isn't re-entrant
- mov MMFSA_D_ADDR, %g3
+demap_begin:
+ sethi %hi(PAGE_MASK), %g1
+ sub %g1, 1, %g1
+ and %g6, %g1, %g2
+ andn %g6, %g1, %g3
mov %o0, %g5
mov %o1, %g6
- ldxa [%g1 + %g2]ASI_REAL, %g2 !%g2 == context
- ldxa [%g1 + %g3]ASI_REAL, %g3 !%g3 == fault addr
mov %o2, %g7
mov MAP_DTLB, %o2
mov %g3, %o0
More information about the p4-projects
mailing list