runtime: fix/improve exitThread on openbsd

OpenBSD's __threxit syscall takes a pointer to a 32-bit value that will be
zeroed immediately before the thread exits. Make use of this instead of
zeroing freeWait from the exitThread assembly and using hacks like switching
to a static stack, so this works on 386.

Change-Id: I3ec5ead82b6496404834d148f713794d5d9da723
Reviewed-on: https://go-review.googlesource.com/105055
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Joel Sing 2018-04-06 05:00:25 +10:00 committed by Brad Fitzpatrick
parent d3026dd30a
commit a7bb8d3eb8
3 changed files with 2 additions and 22 deletions

View File

@ -19,17 +19,8 @@ TEXT runtime·exit(SB),NOSPLIT,$-4
MOVL $0xf1, 0xf1 // crash
RET
GLOBL exitStack<>(SB),RODATA,$8
DATA exitStack<>+0x00(SB)/4, $0
DATA exitStack<>+0x04(SB)/4, $0
// func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-4
MOVL wait+0(FP), AX
// We're done using the stack.
MOVL $0, (AX)
// sys__lwp_exit takes 1 argument, which it expects on the stack.
MOVL $exitStack<>(SB), SP
MOVL $302, AX // sys___threxit
INT $0x80
MOVL $0xf1, 0xf1 // crash

View File

@ -90,10 +90,7 @@ TEXT runtime·exit(SB),NOSPLIT,$-8
// func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-8
MOVQ wait+0(FP), AX
// We're done using the stack.
MOVL $0, (AX)
MOVQ $0, DI // arg 1 - notdead
MOVQ wait+0(FP), DI // arg 1 - notdead
MOVL $302, AX // sys___threxit
SYSCALL
MOVL $0xf1, 0xf1 // crash

View File

@ -24,15 +24,7 @@ TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0
// func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-4
MOVW wait+0(FP), R0
// We're done using the stack.
MOVW $0, R2
storeloop:
LDREX (R0), R4 // loads R4
STREX R2, (R0), R1 // stores R2
CMP $0, R1
BNE storeloop
MOVW $0, R0 // arg 1 - notdead
MOVW wait+0(FP), R0 // arg 1 - notdead
MOVW $302, R12 // sys___threxit
SWI $0
MOVW.CS $1, R8 // crash on syscall failure