For OSes that use elf on intel, 2*Ptrsize bytes are reserved for TLS.
But only one pointer (g) has been stored in the TLS for a while now.
So we can set it to just Ptrsize, which happily matches what happens
when externally linking.
Fixes #9913
Change-Id: Ic816369d3a55a8cdcc23be349b1a1791d53f5f81
Reviewed-on: https://go-review.googlesource.com/6584
Run-TryBot: Minux Ma <minux@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Hopenbsd,
Hdragonfly,
Hsolaris:
- ctxt.Tlsoffset = -2 * ctxt.Arch.Ptrsize
+ ctxt.Tlsoffset = -1 * ctxt.Arch.Ptrsize
case Hnacl:
switch ctxt.Arch.Thechar {
Hopenbsd,
Hdragonfly,
Hsolaris:
- ctxt.Tlsoffset = -2 * ctxt.Arch.Ptrsize
+ ctxt.Tlsoffset = -1 * ctxt.Arch.Ptrsize
case Hnacl:
switch ctxt.Arch.Thechar {
RET
TEXT runtime·settls(SB),NOSPLIT,$24
- // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
+ // adjust for ELF: wants to use -4(GS) for g
MOVL tlsbase+0(FP), CX
- ADDL $8, CX
+ ADDL $4, CX
// Set up a struct tls_info - a size of -1 maps the whole address
// space and is required for direct-tls access of variable data
// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$16
- ADDQ $16, DI // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
+ ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g
MOVQ DI, 0(SP)
MOVQ $16, 8(SP)
MOVQ $0, DI // arg 1 - which
TEXT runtime·setldt(SB),NOSPLIT,$32
MOVL address+4(FP), BX // aka base
// see comment in sys_linux_386.s; freebsd is similar
- ADDL $0x8, BX
+ ADDL $0x4, BX
// set up data_desc
LEAL 16(SP), AX // struct data_desc
// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$8
- ADDQ $16, DI // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
+ ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g and m
MOVQ DI, 0(SP)
MOVQ SP, SI
MOVQ $129, DI // AMD64_SET_FSBASE
* When linking against the system libraries,
* we use its pthread_create and let it set up %gs
* for us. When we do that, the private storage
- * we get is not at 0(GS), 4(GS), but -8(GS), -4(GS).
+ * we get is not at 0(GS), but -4(GS).
* To insulate the rest of the tool chain from this
- * ugliness, 8l rewrites 0(TLS) into -8(GS) for us.
+ * ugliness, 8l rewrites 0(TLS) into -4(GS) for us.
* To accommodate that rewrite, we translate
* the address here and bump the limit to 0xffffffff (no limit)
- * so that -8(GS) maps to 0(address).
- * Also, the final 0(GS) (current 8(CX)) has to point
+ * so that -4(GS) maps to 0(address).
+ * Also, the final 0(GS) (current 4(CX)) has to point
* to itself, to mimic ELF.
*/
- ADDL $0x8, CX // address
+ ADDL $0x4, CX // address
MOVL CX, 0(CX)
// set up user_desc
// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$32
- ADDQ $16, DI // ELF wants to use -16(FS), -8(FS)
+ ADDQ $8, DI // ELF wants to use -8(FS)
MOVQ DI, SI
MOVQ $0x1002, DI // ARCH_SET_FS
RET
TEXT runtime·settls(SB),NOSPLIT,$16
- // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
+ // adjust for ELF: wants to use -4(GS) for g
MOVL base+0(FP), CX
- ADDL $8, CX
+ ADDL $4, CX
MOVL $0, 0(SP) // syscall gap
MOVL CX, 4(SP) // arg 1 - ptr
MOVL $317, AX // sys__lwp_setprivate
// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$8
- // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
- ADDQ $16, DI // arg 1 - ptr
+ // adjust for ELF: wants to use -8(FS) for g
+ ADDQ $8, DI // arg 1 - ptr
MOVQ $317, AX // sys__lwp_setprivate
SYSCALL
JCC 2(PC)
RET
TEXT runtime·settls(SB),NOSPLIT,$8
- // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
+ // adjust for ELF: wants to use -4(GS) for g
MOVL tlsbase+0(FP), CX
- ADDL $8, CX
+ ADDL $4, CX
MOVL $0, 0(SP) // syscall gap
MOVL CX, 4(SP) // arg 1 - tcb
MOVL $329, AX // sys___set_tcb
// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$0
// adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
- ADDQ $16, DI
+ ADDQ $8, DI
MOVQ $329, AX // sys___settcb
SYSCALL
JCC 2(PC)