PERFORCE change 96644 for review
Kip Macy
kmacy at FreeBSD.org
Thu May 4 05:56:31 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=96644
Change 96644 by kmacy at kmacy_storage:sun4v_rwbuf on 2006/05/04 05:56:06
factor out hash bucket locking into macros
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#46 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#46 (text+ko) ====
@@ -1331,6 +1331,33 @@
END(tl0_intr)
+/*
+ * workaround for CPP brokenness
+ */
+#define LOADLOAD #LoadLoad
+#define LOADSTORE #LoadStore
+#define STORESTORE #StoreStore
+
+#define THE_LOCK_ENTER(addr, lock_bit, oldval, newval, label1) \
+ mov 1, lock_bit ; \
+ add addr, 8, addr ; \
+ sllx lock_bit, 56, lock_bit ; \
+label1: ; \
+ ldxa [addr]%asi, oldval; \
+ andcc %l7, lock_bit, %g0 ; \
+ bnz,pn %xcc, label1 ## b ; \
+ or oldval, lock_bit, newval; \
+ casxa [addr]%asi, oldval, newval; \
+ cmp oldval, newval ; \
+ bne,pn %icc, label1 ## b ; \
+ membar LOADLOAD ; \
+ sub addr, 8, addr ;
+
+#define THE_LOCK_EXIT(addr, lock_bit, tmp)\
+ membar LOADSTORE | STORESTORE ; \
+ ldxa [addr + 8]%asi, tmp ; \
+ andn tmp, lock_bit, tmp ; \
+ stxa tmp, [addr + 8]%asi ;
#define HASH_LOOKUP(addr, tag, searchtag, endlabel, matchlabel) \
ldda [addr]%asi, tag ; \
@@ -1341,12 +1368,9 @@
be,pn %xcc, endlabel ; \
nop
-
#define RESTORE_TRAPWIN(pcpu, cansave, label1, label2) \
brz cansave, label1 ## f; \
nop ; \
- mov -1, %l0 ; \
- mov -1, %l7 ; \
restore ; \
ba,a,pt %xcc, label2 ## f ; \
label1: ; \
@@ -1468,21 +1492,9 @@
! %g2==entry base
add %g2, %l5, %g2 ! base + offset == entry base
- mov 1, %l0
- add %g2, 8, %g2 ! point g2 at data
- sllx %l0, 56, %l0 ! %l0 == VTD_LOCK
-6:
- ldxa [%g2]%asi, %l7 ! don't lock bus if bucket is locked
- andcc %l7, %l0, %g0
- bnz,pn %xcc, 6b
- or %l7, %l0, %l6
- casxa [%g2]%asi, %l7, %l6
- cmp %l6, %l7
- bne,pn %icc, 6b
- nop
- sub %g2, 8, %g2 ! point g2 back at tag
-
+ THE_LOCK_ENTER(%g2, %l0, %l7, %l6, 6)
+
! %g1 == cansave
! %g2 == THE
! %g3 == TWDW ASI
@@ -1521,11 +1533,8 @@
! we need to jump to tl0_trap to drop us back down to tl0
! and take us to trap(...) to service the fault
wr %g0, %l3, %asi
+ THE_LOCK_EXIT(%l5, %l0, %g2)
- ldxa [%l5 + 8]%asi, %g2
- andn %g2, %l0, %g2
- stxa %g2, [%l5 + 8]%asi ! unlock head of bucket
-
andn %g5, %l1, %g5 ! fault page PA
RESTORE_TRAPWIN(PCPU_REG, %g1, 14, 15)
@@ -1555,7 +1564,6 @@
or %l7, VTD_W, %l7 ! add modifed bit
9:
-
andn %l7, %l0, %l7 ! remove lock bit
and %g4, %l1, %g3 ! size of TSB in pages
@@ -1588,18 +1596,14 @@
12:
#endif
stxa %g0, [%g3 + %l4]ASI_REAL ! invalidate data
+ membar #StoreStore
stxa %l6, [%g3]ASI_REAL ! store tag
+ membar #StoreStore
stxa %l7, [%g3 + %l4]ASI_REAL ! store data
- stxa %l7, [%g2 + 8]%asi ! update TTE
-
- cmp %g2, %l5
- beq,a,pt %xcc, 17f
- nop
- ldxa [%l5 + 8]%asi, %l7
- andn %l7, %l0, %l7 ! remove lock bit
- stxa %l7, [%l5 + 8]%asi ! unlock bucket
-17:
- membar #Sync
+ stxa %l7, [%g2 + 8]%asi ! update TTE with ref bit
+ membar #StoreLoad
+
+ THE_LOCK_EXIT(%l5, %l0, %l7)
RESTORE_TRAPWIN(PCPU_REG, %g1, 13, 16)
upgrade_demap:
rdpr %tt, %g3
@@ -1635,9 +1639,7 @@
! %l5 == head of bucket
ENTRY(prot_fault_trap)
- ldxa [%l5 + 8]%asi, %g2
- andn %g2, %l0, %g2 ! remove lock bit
- stxa %g2, [%l5 + 8]%asi ! unlock head of bucket
+ THE_LOCK_EXIT(%l5, %l0, %g2)
RESTORE_TRAPWIN(PCPU_REG, %g1, 14, 15)
sethi %hi(trap), %g1
mov T_DATA_PROTECTION, %g2
More information about the p4-projects
mailing list