mirror of https://github.com/golang/go.git
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:
parent
d3026dd30a
commit
a7bb8d3eb8
|
|
@ -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
|
||||||
|
|
||||||
// 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
|
||||||
|
|
||||||
// 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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue