Commit a7bb8d3e authored by Joel Sing's avatar Joel Sing Committed by Brad Fitzpatrick

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/105055Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: 's avatarAustin Clements <austin@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent d3026dd3
...@@ -19,17 +19,8 @@ TEXT runtime·exit(SB),NOSPLIT,$-4 ...@@ -19,17 +19,8 @@ TEXT runtime·exit(SB),NOSPLIT,$-4
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
RET RET
GLOBL exitStack<>(SB),RODATA,$8
DATA exitStack<>+0x00(SB)/4, $0
DATA exitStack<>+0x04(SB)/4, $0
// func exitThread(wait *uint32) // func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-4 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 MOVL $302, AX // sys___threxit
INT $0x80 INT $0x80
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
......
...@@ -90,10 +90,7 @@ TEXT runtime·exit(SB),NOSPLIT,$-8 ...@@ -90,10 +90,7 @@ TEXT runtime·exit(SB),NOSPLIT,$-8
// func exitThread(wait *uint32) // func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-8 TEXT runtime·exitThread(SB),NOSPLIT,$0-8
MOVQ wait+0(FP), AX MOVQ wait+0(FP), DI // arg 1 - notdead
// We're done using the stack.
MOVL $0, (AX)
MOVQ $0, DI // arg 1 - notdead
MOVL $302, AX // sys___threxit MOVL $302, AX // sys___threxit
SYSCALL SYSCALL
MOVL $0xf1, 0xf1 // crash MOVL $0xf1, 0xf1 // crash
......
...@@ -24,15 +24,7 @@ TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 ...@@ -24,15 +24,7 @@ TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0
// func exitThread(wait *uint32) // func exitThread(wait *uint32)
TEXT runtime·exitThread(SB),NOSPLIT,$0-4 TEXT runtime·exitThread(SB),NOSPLIT,$0-4
MOVW wait+0(FP), R0 MOVW wait+0(FP), R0 // arg 1 - notdead
// 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 $302, R12 // sys___threxit MOVW $302, R12 // sys___threxit
SWI $0 SWI $0
MOVW.CS $1, R8 // crash on syscall failure MOVW.CS $1, R8 // crash on syscall failure
......
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