]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] runtime: use Android O friendly syscalls on 64-bit machines
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 8 Feb 2018 15:59:17 +0000 (16:59 +0100)
committerAndrew Bonventre <andybons@golang.org>
Thu, 29 Mar 2018 06:08:07 +0000 (06:08 +0000)
Android O disallows open on 64-bit, so let's use openat with AT_FDCWD to
achieve the same behavior.

Android O disallows epoll_wait on 64-bit, so let's use epoll_pwait with
the last argument as NULL to achieve the same behavior.

See here:
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/arm64_app_policy.cpp
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/mips64_app_policy.cpp
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/x86_64_app_policy.cpp

Fixes #23750

Change-Id: If8d5a663357471e5d2c1f516151344a9d05b188a
Reviewed-on: https://go-review.googlesource.com/92895
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/102792
Run-TryBot: Andrew Bonventre <andybons@golang.org>

src/runtime/sys_linux_amd64.s
src/runtime/sys_linux_mips64x.s

index 5a94bda7c22bbe97c2c716757d7d55b2df1cd0bb..017e7dcaefb6138b9e36dbb7b7475ff8ffe79fd0 100644 (file)
@@ -12,7 +12,6 @@
 
 #define SYS_read               0
 #define SYS_write              1
-#define SYS_open               2
 #define SYS_close              3
 #define SYS_mmap               9
 #define SYS_munmap             11
 #define SYS_sched_getaffinity  204
 #define SYS_epoll_create       213
 #define SYS_exit_group         231
-#define SYS_epoll_wait         232
 #define SYS_epoll_ctl          233
+#define SYS_openat             257
 #define SYS_pselect6           270
+#define SYS_epoll_pwait                281
 #define SYS_epoll_create1      291
 
 TEXT runtime·exit(SB),NOSPLIT,$0-4
@@ -65,10 +65,12 @@ TEXT runtime·exitThread(SB),NOSPLIT,$0-8
        JMP     0(PC)
 
 TEXT runtime·open(SB),NOSPLIT,$0-20
-       MOVQ    name+0(FP), DI
-       MOVL    mode+8(FP), SI
-       MOVL    perm+12(FP), DX
-       MOVL    $SYS_open, AX
+       // This uses openat instead of open, because Android O blocks open.
+       MOVL    $-100, DI // AT_FDCWD, so this acts like open
+       MOVQ    name+0(FP), SI
+       MOVL    mode+8(FP), DX
+       MOVL    perm+12(FP), R10
+       MOVL    $SYS_openat, AX
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     2(PC)
@@ -655,11 +657,13 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0
 
 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
 TEXT runtime·epollwait(SB),NOSPLIT,$0
+       // This uses pwait instead of wait, because Android O blocks wait.
        MOVL    epfd+0(FP), DI
        MOVQ    ev+8(FP), SI
        MOVL    nev+16(FP), DX
        MOVL    timeout+20(FP), R10
-       MOVL    $SYS_epoll_wait, AX
+       MOVQ    $0, R8
+       MOVL    $SYS_epoll_pwait, AX
        SYSCALL
        MOVL    AX, ret+24(FP)
        RET
index 7402ae21d4ca74e5bc755084429596989f644c9f..2cb365074e5e77f9c22f3bc44f57ba9a78531693 100644 (file)
@@ -16,7 +16,7 @@
 #define SYS_exit               5058
 #define SYS_read               5000
 #define SYS_write              5001
-#define SYS_open               5002
+#define SYS_openat             5247
 #define SYS_close              5003
 #define SYS_getpid             5038
 #define SYS_kill               5060
@@ -42,7 +42,7 @@
 #define SYS_exit_group         5205
 #define SYS_epoll_create       5207
 #define SYS_epoll_ctl          5208
-#define SYS_epoll_wait         5209
+#define SYS_epoll_pwait                5272
 #define SYS_clock_gettime      5222
 #define SYS_epoll_create1      5285
 #define SYS_brk                        5012
@@ -66,11 +66,13 @@ TEXT runtime·exitThread(SB),NOSPLIT,$-8-8
        SYSCALL
        JMP     0(PC)
 
-TEXT runtime·open(SB),NOSPLIT,$-8-20
-       MOVV    name+0(FP), R4
-       MOVW    mode+8(FP), R5
-       MOVW    perm+12(FP), R6
-       MOVV    $SYS_open, R2
+TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
+       // This uses openat instead of open, because Android O blocks open.
+       MOVW    $-100, R4 // AT_FDCWD, so this acts like open
+       MOVV    name+0(FP), R5
+       MOVW    mode+8(FP), R6
+       MOVW    perm+12(FP), R7
+       MOVV    $SYS_openat, R2
        SYSCALL
        BEQ     R7, 2(PC)
        MOVW    $-1, R2
@@ -422,12 +424,14 @@ TEXT runtime·epollctl(SB),NOSPLIT,$-8
        RET
 
 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
-TEXT runtime·epollwait(SB),NOSPLIT,$-8
+TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
+       // This uses pwait instead of wait, because Android O blocks wait.
        MOVW    epfd+0(FP), R4
        MOVV    ev+8(FP), R5
        MOVW    nev+16(FP), R6
        MOVW    timeout+20(FP), R7
-       MOVV    $SYS_epoll_wait, R2
+       MOVV    $0, R8
+       MOVV    $SYS_epoll_pwait, R2
        SYSCALL
        MOVW    R2, ret+24(FP)
        RET