diff options
author | 2008-04-20 09:18:52 +0000 | |
---|---|---|
committer | 2008-04-20 09:18:52 +0000 | |
commit | 649a4de97875602ecd1644b1ec1a614f606be825 (patch) | |
tree | d713b5ad1a774071339709c823511c2193e4a9f7 | |
parent | Parse VS_INPUT_HEADER descriptor. (diff) | |
download | wireguard-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.h | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/genassym.cf | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/locore.s | 78 |
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 |