Commit b42ebb6f authored by Joel Sing's avatar Joel Sing

runtime: fix TLS handling for netbsd

Set the TLS base using the _lwp_setprivate() syscall, instead of via
sysarch(). NetBSD tracks the pointer passed to _lwp_setprivate() and
restores this value when restoring mcontext. If sysarch() is used
directly, restoring an mcontext trashes the FS/GS value, resulting
in a segfault when we next try to access the TLS.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6206062
parent e393a829
...@@ -12,14 +12,14 @@ ...@@ -12,14 +12,14 @@
TEXT runtime·exit(SB),7,$-4 TEXT runtime·exit(SB),7,$-4
MOVL $1, AX MOVL $1, AX
INT $0x80 INT $0x80
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·exit1(SB),7,$-4 TEXT runtime·exit1(SB),7,$-4
MOVL $302, AX // sys_threxit MOVL $302, AX // sys_threxit
INT $0x80 INT $0x80
JAE 2(PC) JAE 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·write(SB),7,$-4 TEXT runtime·write(SB),7,$-4
...@@ -79,7 +79,7 @@ TEXT runtime·munmap(SB),7,$-4 ...@@ -79,7 +79,7 @@ TEXT runtime·munmap(SB),7,$-4
MOVL $73, AX // sys_munmap MOVL $73, AX // sys_munmap
INT $0x80 INT $0x80
JAE 2(PC) JAE 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·setitimer(SB),7,$-4 TEXT runtime·setitimer(SB),7,$-4
...@@ -151,7 +151,7 @@ TEXT runtime·sigaction(SB),7,$24 ...@@ -151,7 +151,7 @@ TEXT runtime·sigaction(SB),7,$24
MOVL $340, AX // sys___sigaction_sigtramp MOVL $340, AX // sys___sigaction_sigtramp
INT $0x80 INT $0x80
JAE 2(PC) JAE 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·sigtramp(SB),7,$44 TEXT runtime·sigtramp(SB),7,$44
...@@ -193,7 +193,7 @@ TEXT runtime·sigtramp(SB),7,$44 ...@@ -193,7 +193,7 @@ TEXT runtime·sigtramp(SB),7,$44
MOVL AX, 4(SP) // arg 1 - sigcontext MOVL AX, 4(SP) // arg 1 - sigcontext
MOVL $103, AX // sys_sigreturn MOVL $103, AX // sys_sigreturn
INT $0x80 INT $0x80
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
// int32 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); // int32 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
...@@ -296,16 +296,14 @@ TEXT runtime·setldt(SB),7,$8 ...@@ -296,16 +296,14 @@ TEXT runtime·setldt(SB),7,$8
TEXT runtime·settls(SB),7,$16 TEXT runtime·settls(SB),7,$16
// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
MOVL 20(SP), CX MOVL base+0(FP), CX
ADDL $8, CX ADDL $8, CX
MOVL CX, 0(CX)
MOVL $0, 0(SP) // syscall gap MOVL $0, 0(SP) // syscall gap
MOVL $16, 4(SP) // X86_SET_GSBASE (x86/sysarch.h) MOVL CX, 4(SP) // arg 1 - ptr
MOVL CX, 8(SP) // pointer to base MOVL $317, AX // sys__lwp_setprivate
MOVL $165, AX // sys_sysarch
INT $0x80 INT $0x80
JCC 2(PC) JCC 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·osyield(SB),7,$-4 TEXT runtime·osyield(SB),7,$-4
......
...@@ -83,13 +83,13 @@ TEXT runtime·exit(SB),7,$-8 ...@@ -83,13 +83,13 @@ TEXT runtime·exit(SB),7,$-8
MOVL 8(SP), DI // arg 1 - exit status MOVL 8(SP), DI // arg 1 - exit status
MOVL $1, AX // sys_exit MOVL $1, AX // sys_exit
SYSCALL SYSCALL
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·exit1(SB),7,$-8 TEXT runtime·exit1(SB),7,$-8
MOVL $302, AX // sys_threxit MOVL $302, AX // sys_threxit
SYSCALL SYSCALL
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·write(SB),7,$-8 TEXT runtime·write(SB),7,$-8
...@@ -179,10 +179,9 @@ TEXT runtime·sigaction(SB),7,$-8 ...@@ -179,10 +179,9 @@ TEXT runtime·sigaction(SB),7,$-8
LEAQ runtime·sigreturn_tramp(SB), R10 LEAQ runtime·sigreturn_tramp(SB), R10
MOVQ $3, R8 // arg 5 - version MOVQ $3, R8 // arg 5 - version
MOVL $340, AX // sys___sigaction_sigtramp MOVL $340, AX // sys___sigaction_sigtramp
SYSCALL SYSCALL
JCC 2(PC) JCC 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·sigtramp(SB),7,$64 TEXT runtime·sigtramp(SB),7,$64
...@@ -238,7 +237,7 @@ TEXT runtime·munmap(SB),7,$0 ...@@ -238,7 +237,7 @@ TEXT runtime·munmap(SB),7,$0
MOVL $73, AX // sys_munmap MOVL $73, AX // sys_munmap
SYSCALL SYSCALL
JCC 2(PC) JCC 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·sigaltstack(SB),7,$-8 TEXT runtime·sigaltstack(SB),7,$-8
...@@ -247,20 +246,17 @@ TEXT runtime·sigaltstack(SB),7,$-8 ...@@ -247,20 +246,17 @@ TEXT runtime·sigaltstack(SB),7,$-8
MOVQ $281, AX // sys___sigaltstack14 MOVQ $281, AX // sys___sigaltstack14
SYSCALL SYSCALL
JCC 2(PC) JCC 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
// set tls base to DI // set tls base to DI
TEXT runtime·settls(SB),7,$8 TEXT runtime·settls(SB),7,$8
// adjust for ELF: wants to use -16(FS) and -8(FS) for g and m // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
ADDQ $16, DI ADDQ $16, DI // arg 1 - ptr
MOVQ DI, 0(SP) MOVQ $317, AX // sys__lwp_setprivate
MOVQ SP, SI
MOVQ $17, DI // X86_64_SET_FSBASE (x86/sysarch.h)
MOVQ $165, AX // sys_sysarch
SYSCALL SYSCALL
JCC 2(PC) JCC 2(PC)
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
TEXT runtime·sysctl(SB),7,$0 TEXT runtime·sysctl(SB),7,$0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment