summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2008-04-20 09:18:52 +0000
committerkettenis <kettenis@openbsd.org>2008-04-20 09:18:52 +0000
commit649a4de97875602ecd1644b1ec1a614f606be825 (patch)
treed713b5ad1a774071339709c823511c2193e4a9f7
parentParse VS_INPUT_HEADER descriptor. (diff)
downloadwireguard-openbsd-649a4de97875602ecd1644b1ec1a614f606be825.tar.xz
wireguard-openbsd-649a4de97875602ecd1644b1ec1a614f606be825.zip
Implement locking of sun4u TSB entries for MULTIPROCESSOR kernels.
Make sun4v code use the new TSB_TAG_LOCKED define.
-rw-r--r--sys/arch/sparc64/include/pte.h6
-rw-r--r--sys/arch/sparc64/sparc64/genassym.cf4
-rw-r--r--sys/arch/sparc64/sparc64/locore.s78
3 files changed, 62 insertions, 26 deletions
diff --git a/sys/arch/sparc64/include/pte.h b/sys/arch/sparc64/include/pte.h
index d12e61bff59..9d453fafd54 100644
--- a/sys/arch/sparc64/include/pte.h
+++ b/sys/arch/sparc64/include/pte.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pte.h,v 1.10 2008/03/30 12:30:02 kettenis Exp $ */
+/* $OpenBSD: pte.h,v 1.11 2008/04/20 09:18:52 kettenis Exp $ */
/* $NetBSD: pte.h,v 1.7 2001/07/31 06:55:46 eeh Exp $ */
/*
@@ -140,8 +140,10 @@ void smp_tlb_flush_ctx(int);
#define CTX_MASK ((1<<13)-1)
#define TSB_TAG_CTX_SHIFT 48
#define TSB_TAG_VA_SHIFT 22
-#define TSB_TAG_G 0x8000000000000000LL
+#define TSB_TAG_LOCKED 0x0000040000000000LL
+
+#define TSB_TAG_G 0x8000000000000000LL
#define TSB_TAG_CTX(t) ((((int64_t)(t))>>TSB_TAG_CTX_SHIFT)&CTX_MASK)
#define TSB_TAG_VA(t) ((((int64_t)(t))<<TSB_TAG_VA_SHIFT))
#define TSB_TAG(g,ctx,va) ((((u_int64_t)((g)!=0))<<63)|(((u_int64_t)(ctx)&CTX_MASK)<<TSB_TAG_CTX_SHIFT)|(((u_int64_t)va)>>TSB_TAG_VA_SHIFT))
diff --git a/sys/arch/sparc64/sparc64/genassym.cf b/sys/arch/sparc64/sparc64/genassym.cf
index 57d47b282b8..5307b42cbc2 100644
--- a/sys/arch/sparc64/sparc64/genassym.cf
+++ b/sys/arch/sparc64/sparc64/genassym.cf
@@ -1,4 +1,4 @@
-# $OpenBSD: genassym.cf,v 1.30 2008/03/30 12:30:01 kettenis Exp $
+# $OpenBSD: genassym.cf,v 1.31 2008/04/20 09:18:52 kettenis Exp $
# $NetBSD: genassym.cf,v 1.23 2001/08/08 00:09:30 eeh Exp $
#
@@ -272,6 +272,8 @@ member dbr_local
member dbr_in
endif
+export TSB_TAG_LOCKED
+
export SUN4U_TLB_ACCESS
export SUN4U_TLB_MODIFY
export SUN4U_TLB_REAL_W
diff --git a/sys/arch/sparc64/sparc64/locore.s b/sys/arch/sparc64/sparc64/locore.s
index 9f07388250e..77f6715ff8f 100644
--- a/sys/arch/sparc64/sparc64/locore.s
+++ b/sys/arch/sparc64/sparc64/locore.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.s,v 1.135 2008/04/16 12:56:04 kettenis Exp $ */
+/* $OpenBSD: locore.s,v 1.136 2008/04/20 09:18:52 kettenis Exp $ */
/* $NetBSD: locore.s,v 1.137 2001/08/13 06:10:10 jdolecek Exp $ */
/*
@@ -1669,9 +1669,22 @@ dmmu_write_fault:
bne,pn %xcc, 1b
or %g4, SUN4U_TLB_MODIFY|SUN4U_TLB_ACCESS|SUN4U_TLB_W, %g4
! Update the modified bit
- stx %g1, [%g2] ! Update TSB entry tag
+
+1:
+#ifdef MULTIPROCESSOR
+ ld [%g2], %g6
+ btst (TSB_TAG_LOCKED >> 32), %g6
+ bnz,pn %icc, 1b
+ or %g6, (TSB_TAG_LOCKED >> 32), %g5
+ casa [%g2] ASI_NUCLEUS, %g6, %g5
+ cmp %g6, %g5
+ bne,pn %icc, 1b
+ nop
+ membar #StoreStore
+#endif
+ stx %g4, [%g2 + 8] ! Update TSB entry data
mov SFSR, %g7
- stx %g4, [%g2+8] ! Update TSB entry data
+ stx %g1, [%g2] ! Update TSB entry tag
nop
#ifdef DEBUG
set DATA_START, %g6 ! debug
@@ -1776,10 +1789,22 @@ data_miss:
cmp %g4, %g7
bne,pn %xcc, 1b
or %g4, SUN4U_TLB_ACCESS, %g4 ! Update the modified bit
-1:
+
+1:
+#ifdef MULTIPROCESSOR
+ ld [%g2], %g6
+ btst (TSB_TAG_LOCKED >> 32), %g6
+ bnz,pn %icc, 1b
+ or %g6, (TSB_TAG_LOCKED >> 32), %g5
+ casa [%g2] ASI_NUCLEUS, %g6, %g5
+ cmp %g6, %g5
+ bne,pn %icc, 1b
+ nop
+ membar #StoreStore
+#endif
+ stx %g4, [%g2 + 8] ! Update TSB entry data
stx %g1, [%g2] ! Update TSB entry tag
-
- stx %g4, [%g2+8] ! Update TSB entry data
+
#ifdef DEBUG
set DATA_START, %g6 ! debug
stx %g3, [%g6+8] ! debug
@@ -2496,9 +2521,21 @@ instr_miss:
cmp %g4, %g7
bne,pn %xcc, 1b
or %g4, SUN4U_TLB_ACCESS, %g4 ! Update accessed bit
-1:
+
+1:
+#ifdef MULTIPROCESSOR
+ ld [%g2], %g6
+ btst (TSB_TAG_LOCKED >> 32), %g6
+ bnz,pn %icc, 1b
+ or %g6, (TSB_TAG_LOCKED >> 32), %g5
+ casa [%g2] ASI_NUCLEUS, %g6, %g5
+ cmp %g6, %g5
+ bne,pn %icc, 1b
+ nop
+ membar #StoreStore
+#endif
+ stx %g4, [%g2 + 8] ! Update TSB entry data
stx %g1, [%g2] ! Update TSB entry tag
- stx %g4, [%g2+8] ! Update TSB entry data
#ifdef DEBUG
set DATA_START, %g6 ! debug
stx %g3, [%g6+8] ! debug
@@ -2699,12 +2736,11 @@ sun4v_tl1_dtsb_miss:
sllx %g3, 4, %g3
add %g2, %g3, %g2
-#define TSBTAG_LOCKED 0x400
3:
ld [%g2], %g3
- btst TSBTAG_LOCKED, %g3
+ btst (TSB_TAG_LOCKED >> 32), %g3
bnz,pn %icc, 3b
- or %g3, TSBTAG_LOCKED, %g5
+ or %g3, (TSB_TAG_LOCKED >> 32), %g5
casa [%g2] ASI_NUCLEUS, %g3, %g5
cmp %g3, %g5
bne,pn %icc, 3b
@@ -2792,12 +2828,11 @@ sun4v_tl1_dtsb_prot:
sllx %g3, 4, %g3
add %g2, %g3, %g2
-#define TSBTAG_LOCKED 0x400
3:
ld [%g2], %g3
- btst TSBTAG_LOCKED, %g3
+ btst (TSB_TAG_LOCKED >> 32), %g3
bnz,pn %icc, 3b
- or %g3, TSBTAG_LOCKED, %g5
+ or %g3, (TSB_TAG_LOCKED >> 32), %g5
casa [%g2] ASI_NUCLEUS, %g3, %g5
cmp %g3, %g5
bne,pn %icc, 3b
@@ -2983,12 +3018,11 @@ sun4v_tl0_dtsb_miss:
sllx %g3, 4, %g3
add %g2, %g3, %g2
-#define TSBTAG_LOCKED 0x400
3:
ld [%g2], %g3
- btst TSBTAG_LOCKED, %g3
+ btst (TSB_TAG_LOCKED >> 32), %g3
bnz,pn %icc, 3b
- or %g3, TSBTAG_LOCKED, %g5
+ or %g3, (TSB_TAG_LOCKED >> 32), %g5
casa [%g2] ASI_NUCLEUS, %g3, %g5
cmp %g3, %g5
bne,pn %icc, 3b
@@ -3076,12 +3110,11 @@ sun4v_tl0_dtsb_prot:
sllx %g3, 4, %g3
add %g2, %g3, %g2
-#define TSBTAG_LOCKED 0x400
3:
ld [%g2], %g3
- btst TSBTAG_LOCKED, %g3
+ btst (TSB_TAG_LOCKED >> 32), %g3
bnz,pn %icc, 3b
- or %g3, TSBTAG_LOCKED, %g5
+ or %g3, (TSB_TAG_LOCKED >> 32), %g5
casa [%g2] ASI_NUCLEUS, %g3, %g5
cmp %g3, %g5
bne,pn %icc, 3b
@@ -3183,12 +3216,11 @@ sun4v_tl0_itsb_miss:
sllx %g3, 4, %g3
add %g2, %g3, %g2
-#define TSBTAG_LOCKED 0x400
3:
ld [%g2], %g3
- btst TSBTAG_LOCKED, %g3
+ btst (TSB_TAG_LOCKED >> 32), %g3
bnz,pn %icc, 3b
- or %g3, TSBTAG_LOCKED, %g5
+ or %g3, (TSB_TAG_LOCKED >> 32), %g5
casa [%g2] ASI_NUCLEUS, %g3, %g5
cmp %g3, %g5
bne,pn %icc, 3b