mirror of
https://github.com/golang/go
synced 2024-11-19 16:14:49 -07:00
runtime: use Android O friendly syscalls on 64-bit machines
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>
This commit is contained in:
parent
4dad4ab57b
commit
04e6ae6bc3
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
#define SYS_read 0
|
#define SYS_read 0
|
||||||
#define SYS_write 1
|
#define SYS_write 1
|
||||||
#define SYS_open 2
|
|
||||||
#define SYS_close 3
|
#define SYS_close 3
|
||||||
#define SYS_mmap 9
|
#define SYS_mmap 9
|
||||||
#define SYS_munmap 11
|
#define SYS_munmap 11
|
||||||
@ -41,9 +40,10 @@
|
|||||||
#define SYS_sched_getaffinity 204
|
#define SYS_sched_getaffinity 204
|
||||||
#define SYS_epoll_create 213
|
#define SYS_epoll_create 213
|
||||||
#define SYS_exit_group 231
|
#define SYS_exit_group 231
|
||||||
#define SYS_epoll_wait 232
|
|
||||||
#define SYS_epoll_ctl 233
|
#define SYS_epoll_ctl 233
|
||||||
|
#define SYS_openat 257
|
||||||
#define SYS_pselect6 270
|
#define SYS_pselect6 270
|
||||||
|
#define SYS_epoll_pwait 281
|
||||||
#define SYS_epoll_create1 291
|
#define SYS_epoll_create1 291
|
||||||
|
|
||||||
TEXT runtime·exit(SB),NOSPLIT,$0-4
|
TEXT runtime·exit(SB),NOSPLIT,$0-4
|
||||||
@ -65,10 +65,12 @@ TEXT runtime·exitThread(SB),NOSPLIT,$0-8
|
|||||||
JMP 0(PC)
|
JMP 0(PC)
|
||||||
|
|
||||||
TEXT runtime·open(SB),NOSPLIT,$0-20
|
TEXT runtime·open(SB),NOSPLIT,$0-20
|
||||||
MOVQ name+0(FP), DI
|
// This uses openat instead of open, because Android O blocks open.
|
||||||
MOVL mode+8(FP), SI
|
MOVL $-100, DI // AT_FDCWD, so this acts like open
|
||||||
MOVL perm+12(FP), DX
|
MOVQ name+0(FP), SI
|
||||||
MOVL $SYS_open, AX
|
MOVL mode+8(FP), DX
|
||||||
|
MOVL perm+12(FP), R10
|
||||||
|
MOVL $SYS_openat, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
CMPQ AX, $0xfffffffffffff001
|
CMPQ AX, $0xfffffffffffff001
|
||||||
JLS 2(PC)
|
JLS 2(PC)
|
||||||
@ -655,11 +657,13 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0
|
|||||||
|
|
||||||
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
|
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
|
||||||
TEXT runtime·epollwait(SB),NOSPLIT,$0
|
TEXT runtime·epollwait(SB),NOSPLIT,$0
|
||||||
|
// This uses pwait instead of wait, because Android O blocks wait.
|
||||||
MOVL epfd+0(FP), DI
|
MOVL epfd+0(FP), DI
|
||||||
MOVQ ev+8(FP), SI
|
MOVQ ev+8(FP), SI
|
||||||
MOVL nev+16(FP), DX
|
MOVL nev+16(FP), DX
|
||||||
MOVL timeout+20(FP), R10
|
MOVL timeout+20(FP), R10
|
||||||
MOVL $SYS_epoll_wait, AX
|
MOVQ $0, R8
|
||||||
|
MOVL $SYS_epoll_pwait, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define SYS_exit 5058
|
#define SYS_exit 5058
|
||||||
#define SYS_read 5000
|
#define SYS_read 5000
|
||||||
#define SYS_write 5001
|
#define SYS_write 5001
|
||||||
#define SYS_open 5002
|
#define SYS_openat 5247
|
||||||
#define SYS_close 5003
|
#define SYS_close 5003
|
||||||
#define SYS_getpid 5038
|
#define SYS_getpid 5038
|
||||||
#define SYS_kill 5060
|
#define SYS_kill 5060
|
||||||
@ -42,7 +42,7 @@
|
|||||||
#define SYS_exit_group 5205
|
#define SYS_exit_group 5205
|
||||||
#define SYS_epoll_create 5207
|
#define SYS_epoll_create 5207
|
||||||
#define SYS_epoll_ctl 5208
|
#define SYS_epoll_ctl 5208
|
||||||
#define SYS_epoll_wait 5209
|
#define SYS_epoll_pwait 5272
|
||||||
#define SYS_clock_gettime 5222
|
#define SYS_clock_gettime 5222
|
||||||
#define SYS_epoll_create1 5285
|
#define SYS_epoll_create1 5285
|
||||||
#define SYS_brk 5012
|
#define SYS_brk 5012
|
||||||
@ -67,10 +67,12 @@ TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
|
|||||||
JMP 0(PC)
|
JMP 0(PC)
|
||||||
|
|
||||||
TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
|
TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
|
||||||
MOVV name+0(FP), R4
|
// This uses openat instead of open, because Android O blocks open.
|
||||||
MOVW mode+8(FP), R5
|
MOVW $-100, R4 // AT_FDCWD, so this acts like open
|
||||||
MOVW perm+12(FP), R6
|
MOVV name+0(FP), R5
|
||||||
MOVV $SYS_open, R2
|
MOVW mode+8(FP), R6
|
||||||
|
MOVW perm+12(FP), R7
|
||||||
|
MOVV $SYS_openat, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
BEQ R7, 2(PC)
|
BEQ R7, 2(PC)
|
||||||
MOVW $-1, R2
|
MOVW $-1, R2
|
||||||
@ -423,11 +425,13 @@ TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
|
|||||||
|
|
||||||
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
|
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
|
||||||
TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
|
TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
|
||||||
|
// This uses pwait instead of wait, because Android O blocks wait.
|
||||||
MOVW epfd+0(FP), R4
|
MOVW epfd+0(FP), R4
|
||||||
MOVV ev+8(FP), R5
|
MOVV ev+8(FP), R5
|
||||||
MOVW nev+16(FP), R6
|
MOVW nev+16(FP), R6
|
||||||
MOVW timeout+20(FP), R7
|
MOVW timeout+20(FP), R7
|
||||||
MOVV $SYS_epoll_wait, R2
|
MOVV $0, R8
|
||||||
|
MOVV $SYS_epoll_pwait, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
Loading…
Reference in New Issue
Block a user