From 4dcba023c62d7f7968abc54fa5d38d2bf11412ba Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 18 May 2017 16:56:48 -0400 Subject: [PATCH] runtime: use pselect6 for usleep on linux/amd64 and linux/arm Android O black-lists the select system call because its libc, Bionic, does not use this system call. Replace our use of select with pselect6 (which is allowed) on the platforms that support targeting Android. linux/arm64 already uses pselect6 because there is no select on arm64, so only linux/amd64 and linux/arm need changing. pselect6 has been available since Linux 2.6.16, which is before Go's minimum requirement. Fixes #20409. Change-Id: Ic526b5b259a9e01d2f145a1f4d2e76e8c49ce809 Reviewed-on: https://go-review.googlesource.com/43641 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor --- src/runtime/sys_linux_amd64.s | 9 ++++++--- src/runtime/sys_linux_arm.s | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index c2b1376fa9..bf539aa0da 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -82,15 +82,18 @@ TEXT runtime·usleep(SB),NOSPLIT,$16 MOVL $1000000, CX DIVL CX MOVQ AX, 0(SP) - MOVQ DX, 8(SP) + MOVL $1000, AX // usec to nsec + MULL DX + MOVQ AX, 8(SP) - // select(0, 0, 0, 0, &tv) + // pselect6(0, 0, 0, 0, &ts, 0) MOVL $0, DI MOVL $0, SI MOVL $0, DX MOVL $0, R10 MOVQ SP, R8 - MOVL $23, AX + MOVL $0, R9 + MOVL $270, AX SYSCALL RET diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s index 0244613e67..64beed8f68 100644 --- a/src/runtime/sys_linux_arm.s +++ b/src/runtime/sys_linux_arm.s @@ -36,7 +36,7 @@ #define SYS_gettid (SYS_BASE + 224) #define SYS_tkill (SYS_BASE + 238) #define SYS_sched_yield (SYS_BASE + 158) -#define SYS_select (SYS_BASE + 142) // newselect +#define SYS_pselect6 (SYS_BASE + 335) #define SYS_ugetrlimit (SYS_BASE + 191) #define SYS_sched_getaffinity (SYS_BASE + 242) #define SYS_clock_gettime (SYS_BASE + 263) @@ -388,13 +388,16 @@ TEXT runtime·usleep(SB),NOSPLIT,$12 MOVW usec+0(FP), R0 CALL runtime·usplitR0(SB) MOVW R0, 4(R13) + MOVW $1000, R0 // usec to nsec + MUL R0, R1 MOVW R1, 8(R13) MOVW $0, R0 MOVW $0, R1 MOVW $0, R2 MOVW $0, R3 MOVW $4(R13), R4 - MOVW $SYS_select, R7 + MOVW $0, R5 + MOVW $SYS_pselect6, R7 SWI $0 RET