The linux syscall functions used in runtime are designed around the calling
convention of returning errors as negative numbers. On some other systems
(like mips and ppc) the actual syscalls signal errors in other ways. This
means that the assembly implementations of the syscall functions on these
platforms need to transform the return values in the error cases to match
the expected negative errno values. This was addressed for certain syscalls
in https://golang.org/cl/19455 and https://golang.org/cl/89235. This patch
handles the rest of the syscall functions in sys_linux_*.s that return any
value for mips/mips64/ppc64.
Fixes #23446
Change-Id: I302100261231f76d5850ab2c2ea080170d7dba72
GitHub-Last-Rev:
e358e2b08c76897b13f917cfa12b5085e20337f9
GitHub-Pull-Request: golang/go#26606
Reviewed-on: https://go-review.googlesource.com/125895
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
MOVV size+24(FP), R7
MOVV $SYS_rt_sigaction, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+32(FP)
RET
MOVW val3+32(FP), R9
MOVV $SYS_futex, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+40(FP)
RET
MOVV $SYS_clone, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
// In parent, return.
BEQ R2, 3(PC)
MOVV buf+16(FP), R6
MOVV $SYS_sched_getaffinity, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+24(FP)
RET
MOVW size+0(FP), R4
MOVV $SYS_epoll_create, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+8(FP)
RET
MOVW flags+0(FP), R4
MOVV $SYS_epoll_create1, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+8(FP)
RET
MOVV $0, R8
MOVV $SYS_epoll_pwait, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBVU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+24(FP)
RET
MOVW size+12(FP), R7
MOVW $SYS_rt_sigaction, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+16(FP)
RET
MOVW $SYS_futex, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+24(FP)
RET
MOVW $SYS_clone, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
// In parent, return.
- BEQ R2, 5(PC)
- SUBU R2, R0, R3
- CMOVN R7, R3, R2
+ BEQ R2, 3(PC)
MOVW R2, ret+20(FP)
RET
MOVW buf+8(FP), R6
MOVW $SYS_sched_getaffinity, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+12(FP)
RET
MOVW size+0(FP), R4
MOVW $SYS_epoll_create, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+4(FP)
RET
MOVW flags+0(FP), R4
MOVW $SYS_epoll_create1, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+4(FP)
RET
MOVW timeout+12(FP), R7
MOVW $SYS_epoll_wait, R2
SYSCALL
+ BEQ R7, 2(PC)
+ SUBU R2, R0, R2 // caller expects negative errno
MOVW R2, ret+16(FP)
RET
MOVD old+16(FP), R5
MOVD size+24(FP), R6
SYSCALL $SYS_rt_sigaction
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+32(FP)
RET
MOVD addr2+24(FP), R7
MOVW val3+32(FP), R8
SYSCALL $SYS_futex
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+40(FP)
RET
MOVD R7, -32(R4)
SYSCALL $SYS_clone
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
// In parent, return.
CMP R3, $0
MOVD len+8(FP), R4
MOVD buf+16(FP), R5
SYSCALL $SYS_sched_getaffinity
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+24(FP)
RET
TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
MOVW size+0(FP), R3
SYSCALL $SYS_epoll_create
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+8(FP)
RET
TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
MOVW flags+0(FP), R3
SYSCALL $SYS_epoll_create1
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+8(FP)
RET
MOVW nev+16(FP), R5
MOVW timeout+20(FP), R6
SYSCALL $SYS_epoll_wait
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+24(FP)
RET