PERFORCE change 93438 for review
Kip Macy
kmacy at FreeBSD.org
Fri Mar 17 07:32:45 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=93438
Change 93438 by kmacy at kmacy_storage:sun4v_work on 2006/03/17 07:32:12
switch TSB miss handler over to using real addresses for TL > 1
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#33 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 (text+ko) ====
@@ -135,14 +135,32 @@
mov SCRATCH_REG_PCPU, PCPU_REG; \
ldxa [%g0 + PCPU_REG]ASI_SCRATCHPAD, PCPU_REG;
-#define GET_HASH_SCRATCH_USER(reg) \
+#define GET_HASH_SCRATCH_USER(reg) \
mov SCRATCH_REG_HASH_USER, reg; \
ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;
-#define GET_HASH_SCRATCH_KERNEL(reg) \
+#define GET_HASH_SCRATCH_KERNEL(reg) \
mov SCRATCH_REG_HASH_KERNEL, reg; \
ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;
+#define GET_HASH_PHYS_SCRATCH_USER(tmp, reg) \
+ sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp; \
+ mov SCRATCH_REG_HASH_USER, reg; \
+ sllx tmp, 32, tmp; \
+ ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; \
+ andn reg, tmp, reg;
+
+#define GET_HASH_PHYS_SCRATCH_KERNEL(tmp, reg) \
+ sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp; \
+ mov SCRATCH_REG_HASH_KERNEL, reg; \
+ sllx tmp, 32, tmp; \
+ ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; \
+ andn reg, tmp, reg;
+
+
+
+
+
#define GET_TSB_SCRATCH_USER(reg) \
mov SCRATCH_REG_TSB_USER, reg; \
ldxa [%g0 + reg]ASI_SCRATCHPAD, reg;
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#33 (text+ko) ====
@@ -1088,7 +1088,7 @@
wrpr %g0, %g1, %cleanwin
rdpr %cwp, %g1
wrpr %g1, %g7, %tstate
- MAGIC_TRAP_ON
+! MAGIC_TRAP_ON
retry
END(user_rtt)
END(utl0)
@@ -1317,50 +1317,63 @@
ENTRY(tsb_miss_handler)
ldxa [%g1 + %g7]ASI_REAL, %g6 ! load in the context
+ rdpr %tl, %g7 ! need to use real addresses
+ cmp %g7, 1 ! for tl > 1
+ bne,pn %xcc, 2f
+ nop
cmp %g6, %g0 ! kernel?
be,pn %xcc, 1f
- srlx %g5, TTARGET_VA_SHIFT, %g1
+ nop
GET_HASH_SCRATCH_USER(%g2)
-! MAGIC_TRAP_ON
- ba,pt %xcc, 2f
- sllx %g6, TTARGET_CTX_SHIFT, %g6
+ wr %g0, ASI_LDTD_N, %asi
+ ba,pt %xcc, 4f
+ nop
1:
GET_HASH_SCRATCH_KERNEL(%g2)
+ wr %g0, ASI_LDTD_N, %asi
+ ba,pt %xcc, 4f
+ nop
+2:
+! MAGIC_TRAP_ON
+ cmp %g6, %g0 ! kernel?
+ be,pn %xcc, 3f
+ nop
+ GET_HASH_PHYS_SCRATCH_USER(%g7, %g2)
+ wr %g0, ASI_LDTD_REAL, %asi
+ ba,pt %xcc, 4f
+ nop
+3:
+ GET_HASH_PHYS_SCRATCH_KERNEL(%g7, %g2)
+ wr %g0, ASI_LDTD_REAL, %asi
+4:
+
+ srlx %g5, TTARGET_VA_SHIFT, %g1
sllx %g6, TTARGET_CTX_SHIFT, %g6
-2:
- or %g6, %g1, %g6 ! %g6 == search tag
+ or %g6, %g1, %g6 ! %g6 == search tag
+
! %g4 == fault type %g5 == fault addr %g6 == tag
! XXX only handle normal miss for now (look at fault type in the future)
#ifdef PMAP_DEBUG
cmp %g5, %g0 ! NULL ptr deref
- bne,pt %xcc, 3f
+ bne,pt %xcc, 12f
nop
tsb_miss_null_deref:
MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! give up
-3:
+12:
cmp %g3, T_INSTRUCTION_MISS
bne,pn %xcc, 17f
nop
! MAGIC_TRAP_ON ! enable debugging for instruction misses
17:
- sethi %uhi(VM_MIN_DIRECT_ADDRESS), %g7
- sllx %g7, 32, %g7
- cmp %g5, %g7
- blu %xcc, 7f
- nop
- MAGIC_TRAP_ON
- MAGIC_EXIT
-7:
-
-
#endif
+
tsb_miss_compute_hash_addr:
sethi %hi(PAGE_SIZE), %g7
sub %g7, 1, %g7 ! %g7==PAGE_MASK
- and %g2, %g7, %g4 ! size stored in lower 13 bits
- andn %g2, %g7, %g2 ! actual VA of hash
+ and %g2, %g7, %g4 ! size stored in lower 13 bits
+ andn %g2, %g7, %g2 ! actual VA of hash
! XXX only handle 8k page miss
! calculate hash index
@@ -1372,53 +1385,53 @@
! fetch hash entries - exit when we find what were looking for
! %g2==entry base
- add %g2, %g4, %g2 ! base + offset == entry base
+ add %g2, %g4, %g2 ! base + offset == entry base
- mov %g5, %g7 ! save fault addr
+ mov %g5, %g7 ! save fault addr
! entry 0
! %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_LDTD_N, %g4
+ ldda [%g2]%asi, %g4
cmp %g4, %g0 ! entry tag == 0 ?
- be,pn %xcc, 4f
+ be,pn %xcc, 5f
nop
cmp %g4, %g6 ! entry tag == VA tag?
- be,pn %xcc, 5f
+ be,pn %xcc, 6f
nop
! entry 1
-tsb_miss_lookup_1:
- add %g2, 16, %g2 ! next THF
- ldda [%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_1:
+ add %g2, 16, %g2
+ ldda [%g2]%asi, %g4
cmp %g4, %g0 ! entry tag == 0 ?
- be,pn %xcc, 4f
+ be,pn %xcc, 5f
nop
cmp %g4, %g6 ! entry tag == search tag?
- be,pn %xcc, 5f
+ be,pn %xcc, 6f
nop
! entry 2
-tsb_miss_lookup_2:
- add % g2, 16, %g2 ! next THF
- ldda [%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_2:
+ add %g2, 16, %g2
+ ldda [%g2]%asi, %g4
cmp %g4, %g0 ! entry tag == 0 ?
- be,pn %xcc, 4f
+ be,pn %xcc, 5f
nop
cmp %g4, %g6 ! entry tag == search tag?
- be,pn %xcc, 5f
+ be,pn %xcc, 6f
nop
! entry 3
-tsb_miss_lookup_3:
- add %g2, 16, %g2 ! next THF
- ldda [%g2 + %g0]ASI_LDTD_N, %g4
+tsb_miss_lookup_3:
+ add %g2, 16, %g2
+ ldda [%g2]%asi, %g4
cmp %g4, %g0 ! entry tag == 0 ?
- be,pn %xcc, 4f
+ be,pn %xcc, 5f
nop
cmp %g4, %g6 ! entry tag == search tag?
- be,pn %xcc, 5f
+ be,pn %xcc, 6f
nop
tsb_miss_not_found:
-4: ! not found
+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
@@ -1443,7 +1456,7 @@
or %g1, %lo(trap), %g1
tsb_miss_found:
-5: !found
+6: !found
! %g1 == abs index %g2 == THE pointer %g3 == flags
! %g4 == tag %g5 == data %g7 == PAGE_MASK
! %g3 <- TSB RA %g6 <- TSB size, TTE RA %g7 == PAGE_MASK
@@ -1455,10 +1468,10 @@
sub %g7, 1, %g7 ! %g7==PAGE_MASK
cmp %g3, T_DATA_MISS ! TSB data miss
- be,pt %xcc, 6f
+ be,pt %xcc, 7f
or %g5, VTD_REF, %g5 ! set referenced unconditionally
cmp %g3, T_INSTRUCTION_MISS ! TSB instruction miss
- be,pt %xcc, 6f
+ be,pt %xcc, 7f
nop
cmp %g3, T_DATA_PROTECTION ! protection fault
bne,pn %xcc, unsupported_fault_trap ! we don't handle any other fault types currently
@@ -1467,9 +1480,14 @@
bz,pn %xcc, prot_fault_trap ! write to read only page
nop
or %g5, VTD_W, %g5 ! add modifed bit
-6:
- stx %g5, [%g2 + 8] ! update TTE
+7:
+ rdpr %tl, %g3
+ dec %g3
+ movrnz %g3, ASI_REAL, %g3
+ movrz %g3, ASI_N, %g3
+ wr %g0, %g3, %asi
+ stxa %g5, [%g2 + 8]%asi ! update TTE
andcc %g6, %g7, %g0 ! kernel context?
bz,pn %xcc, 8f
nop
@@ -1492,6 +1510,8 @@
ldda [%g2]ASI_LDTD_REAL, %g2
cmp %g3, %g5
bne,pt %xcc, 10f
+ cmp %g2, %g4
+ bne,pt %xcc, 10f
nop
MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing
! is storing same data
More information about the p4-projects
mailing list