runtime: correct error handling in several FreeBSD syscall wrappers

The FreeBSD syscall convention uses the carry flag to indicate whether
an error has occured. The sys_umtx_op, thr_new, and pipe2 syscall
wrappers were failing to account for this convention and silently
suppressing errors as a result. This commit corrects these wrappers
by copying the pattern used by the other fallible syscall wrappers.

Note that futexsleep1 must now explicitly ignore the ETIMEDOUT error
from sys_umtx_op. Previously ETIMEDOUT was implicitly ignored because
sys_umtx_op never returned an error.

Fixes #43106.

Change-Id: I9c422b87cf4c6d308003bf42c3b419f785578b5d
Reviewed-on: https://go-review.googlesource.com/c/go/+/276892
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Trust: Than McIntosh <thanm@google.com>
This commit is contained in:
Nikhil Benesch 2020-12-09 15:14:59 -05:00 committed by Austin Clements
parent 9b6147120a
commit 4d27c4c223
9 changed files with 42 additions and 18 deletions

View File

@ -13,10 +13,11 @@ const (
) )
const ( const (
_EINTR = 0x4 _EINTR = 0x4
_EFAULT = 0xe _EFAULT = 0xe
_EAGAIN = 0x23 _EAGAIN = 0x23
_ENOSYS = 0x4e _ENOSYS = 0x4e
_ETIMEDOUT = 0x3c
_O_NONBLOCK = 0x4 _O_NONBLOCK = 0x4
_O_CLOEXEC = 0x100000 _O_CLOEXEC = 0x100000

View File

@ -13,10 +13,11 @@ const (
) )
const ( const (
_EINTR = 0x4 _EINTR = 0x4
_EFAULT = 0xe _EFAULT = 0xe
_EAGAIN = 0x23 _EAGAIN = 0x23
_ENOSYS = 0x4e _ENOSYS = 0x4e
_ETIMEDOUT = 0x3c
_O_NONBLOCK = 0x4 _O_NONBLOCK = 0x4
_O_CLOEXEC = 0x100000 _O_CLOEXEC = 0x100000

View File

@ -13,10 +13,11 @@ const (
) )
const ( const (
_EINTR = 0x4 _EINTR = 0x4
_EFAULT = 0xe _EFAULT = 0xe
_EAGAIN = 0x23 _EAGAIN = 0x23
_ENOSYS = 0x4e _ENOSYS = 0x4e
_ETIMEDOUT = 0x3c
_O_NONBLOCK = 0x4 _O_NONBLOCK = 0x4
_O_CLOEXEC = 0x100000 _O_CLOEXEC = 0x100000

View File

@ -13,10 +13,11 @@ const (
) )
const ( const (
_EINTR = 0x4 _EINTR = 0x4
_EFAULT = 0xe _EFAULT = 0xe
_EAGAIN = 0x23 _EAGAIN = 0x23
_ENOSYS = 0x4e _ENOSYS = 0x4e
_ETIMEDOUT = 0x3c
_O_NONBLOCK = 0x4 _O_NONBLOCK = 0x4
_O_CLOEXEC = 0x100000 _O_CLOEXEC = 0x100000

View File

@ -166,7 +166,7 @@ func futexsleep1(addr *uint32, val uint32, ns int64) {
utp = &ut utp = &ut
} }
ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp) ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp)
if ret >= 0 || ret == -_EINTR { if ret >= 0 || ret == -_EINTR || ret == -_ETIMEDOUT {
return return
} }
print("umtx_wait addr=", addr, " val=", val, " ret=", ret, "\n") print("umtx_wait addr=", addr, " val=", val, " ret=", ret, "\n")
@ -208,7 +208,6 @@ func newosproc(mp *m) {
var oset sigset var oset sigset
sigprocmask(_SIG_SETMASK, &sigset_all, &oset) sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
// TODO: Check for error.
ret := thr_new(&param, int32(unsafe.Sizeof(param))) ret := thr_new(&param, int32(unsafe.Sizeof(param)))
sigprocmask(_SIG_SETMASK, &oset, nil) sigprocmask(_SIG_SETMASK, &oset, nil)
if ret < 0 { if ret < 0 {

View File

@ -13,12 +13,16 @@
TEXT runtime·sys_umtx_op(SB),NOSPLIT,$-4 TEXT runtime·sys_umtx_op(SB),NOSPLIT,$-4
MOVL $454, AX MOVL $454, AX
INT $0x80 INT $0x80
JAE 2(PC)
NEGL AX
MOVL AX, ret+20(FP) MOVL AX, ret+20(FP)
RET RET
TEXT runtime·thr_new(SB),NOSPLIT,$-4 TEXT runtime·thr_new(SB),NOSPLIT,$-4
MOVL $455, AX MOVL $455, AX
INT $0x80 INT $0x80
JAE 2(PC)
NEGL AX
MOVL AX, ret+8(FP) MOVL AX, ret+8(FP)
RET RET
@ -120,6 +124,8 @@ TEXT runtime·pipe2(SB),NOSPLIT,$12-16
MOVL flags+0(FP), BX MOVL flags+0(FP), BX
MOVL BX, 8(SP) MOVL BX, 8(SP)
INT $0x80 INT $0x80
JAE 2(PC)
NEGL AX
MOVL AX, errno+12(FP) MOVL AX, errno+12(FP)
RET RET

View File

@ -18,6 +18,8 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0
MOVQ ut+24(FP), R8 MOVQ ut+24(FP), R8
MOVL $454, AX MOVL $454, AX
SYSCALL SYSCALL
JCC 2(PC)
NEGQ AX
MOVL AX, ret+32(FP) MOVL AX, ret+32(FP)
RET RET
@ -26,6 +28,8 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0
MOVL size+8(FP), SI MOVL size+8(FP), SI
MOVL $455, AX MOVL $455, AX
SYSCALL SYSCALL
JCC 2(PC)
NEGQ AX
MOVL AX, ret+16(FP) MOVL AX, ret+16(FP)
RET RET
@ -118,6 +122,8 @@ TEXT runtime·pipe2(SB),NOSPLIT,$0-20
MOVL flags+0(FP), SI MOVL flags+0(FP), SI
MOVL $542, AX MOVL $542, AX
SYSCALL SYSCALL
JCC 2(PC)
NEGQ AX
MOVL AX, errno+16(FP) MOVL AX, errno+16(FP)
RET RET

View File

@ -51,6 +51,7 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0
ADD $20, R13 // arg 5 is passed on stack ADD $20, R13 // arg 5 is passed on stack
MOVW $SYS__umtx_op, R7 MOVW $SYS__umtx_op, R7
SWI $0 SWI $0
RSB.CS $0, R0
SUB $20, R13 SUB $20, R13
// BCS error // BCS error
MOVW R0, ret+20(FP) MOVW R0, ret+20(FP)
@ -61,6 +62,7 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0
MOVW size+4(FP), R1 MOVW size+4(FP), R1
MOVW $SYS_thr_new, R7 MOVW $SYS_thr_new, R7
SWI $0 SWI $0
RSB.CS $0, R0
MOVW R0, ret+8(FP) MOVW R0, ret+8(FP)
RET RET
@ -144,6 +146,7 @@ TEXT runtime·pipe2(SB),NOSPLIT,$0-16
MOVW flags+0(FP), R1 MOVW flags+0(FP), R1
MOVW $SYS_pipe2, R7 MOVW $SYS_pipe2, R7
SWI $0 SWI $0
RSB.CS $0, R0
MOVW R0, errno+12(FP) MOVW R0, errno+12(FP)
RET RET

View File

@ -60,6 +60,9 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0
MOVD ut+24(FP), R4 MOVD ut+24(FP), R4
MOVD $SYS__umtx_op, R8 MOVD $SYS__umtx_op, R8
SVC SVC
BCC ok
NEG R0, R0
ok:
MOVW R0, ret+32(FP) MOVW R0, ret+32(FP)
RET RET
@ -69,6 +72,9 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0
MOVW size+8(FP), R1 MOVW size+8(FP), R1
MOVD $SYS_thr_new, R8 MOVD $SYS_thr_new, R8
SVC SVC
BCC ok
NEG R0, R0
ok:
MOVW R0, ret+16(FP) MOVW R0, ret+16(FP)
RET RET