diff --git a/src/runtime/defs_darwin_arm.go b/src/runtime/defs_darwin_arm.go index 39a65bca015..2225556d52b 100644 --- a/src/runtime/defs_darwin_arm.go +++ b/src/runtime/defs_darwin_arm.go @@ -125,6 +125,9 @@ const ( _EVFILT_WRITE = -0x2 _PTHREAD_CREATE_DETACHED = 0x2 + + _F_SETFD = 0x2 + _FD_CLOEXEC = 0x1 ) type machbody struct { diff --git a/src/runtime/defs_darwin_arm64.go b/src/runtime/defs_darwin_arm64.go index 607051ff882..7ba051c2b3d 100644 --- a/src/runtime/defs_darwin_arm64.go +++ b/src/runtime/defs_darwin_arm64.go @@ -123,6 +123,9 @@ const ( _EVFILT_WRITE = -0x2 _PTHREAD_CREATE_DETACHED = 0x2 + + _F_SETFD = 0x2 + _FD_CLOEXEC = 0x1 ) type machbody struct { diff --git a/src/runtime/sys_darwin_arm.s b/src/runtime/sys_darwin_arm.s index 5f6c9034374..9b693e3121e 100644 --- a/src/runtime/sys_darwin_arm.s +++ b/src/runtime/sys_darwin_arm.s @@ -10,19 +10,6 @@ #include "go_tls.h" #include "textflag.h" -// Copied from /usr/include/sys/syscall.h -#define SYS_gettimeofday 116 -#define SYS_kill 37 -#define SYS_getpid 20 -#define SYS_pthread_sigmask 329 -#define SYS_setitimer 83 -#define SYS___sysctl 202 -#define SYS_sigaction 46 -#define SYS_sigreturn 184 -#define SYS_kqueue 362 -#define SYS_kevent 363 -#define SYS_fcntl 92 - TEXT notok<>(SB),NOSPLIT,$0 MOVW $0, R8 MOVW R8, (R8) @@ -114,12 +101,11 @@ TEXT runtime·madvise_trampoline(SB),NOSPLIT,$0 BL.EQ notok<>(SB) RET -TEXT runtime·setitimer(SB),NOSPLIT,$0 - MOVW mode+0(FP), R0 - MOVW new+4(FP), R1 - MOVW old+8(FP), R2 - MOVW $SYS_setitimer, R12 - SWI $0x80 +TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0 + MOVW 4(R0), R1 // arg 2 new + MOVW 8(R0), R2 // arg 3 old + MOVW 0(R0), R0 // arg 1 which + BL libc_setitimer(SB) RET TEXT runtime·walltime_trampoline(SB),NOSPLIT,$0 @@ -265,22 +251,18 @@ TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0 TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0 B runtime·armPublicationBarrier(SB) -TEXT runtime·sysctl(SB),NOSPLIT,$0 - MOVW mib+0(FP), R0 - MOVW miblen+4(FP), R1 - MOVW out+8(FP), R2 - MOVW size+12(FP), R3 - MOVW dst+16(FP), R4 - MOVW ndst+20(FP), R5 - MOVW $SYS___sysctl, R12 // syscall entry - SWI $0x80 - BCC sysctl_ret - RSB $0, R0, R0 - MOVW R0, ret+24(FP) - RET -sysctl_ret: - MOVW $0, R0 - MOVW R0, ret+24(FP) +TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0 + MOVW 4(R0), R1 // arg 2 miblen + MOVW 8(R0), R2 // arg 3 out + MOVW 12(R0), R3 // arg 4 size + MOVW 16(R0), R4 // arg 5 dst + MOVW 20(R0), R5 // arg 6 ndst + MOVW 0(R0), R0 // arg 1 mib + // Only R0-R3 are used for arguments, the rest + // go on the stack. + MOVM.DB.W [R4-R5], (R13) + BL libc_sysctl(SB) + ADD $(2*4), R13 RET // uint32 mach_msg_trap(void*, uint32, uint32, uint32, uint32, uint32, uint32) @@ -352,35 +334,37 @@ TEXT runtime·mach_semaphore_signal_all(SB),NOSPLIT,$0 MOVW R0, ret+4(FP) RET -// int32 runtime·kqueue(void) -TEXT runtime·kqueue(SB),NOSPLIT,$0 - MOVW $SYS_kqueue, R12 - SWI $0x80 - RSB.CS $0, R0, R0 - MOVW R0, ret+0(FP) +TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0 + BL libc_kqueue(SB) RET // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int events, Timespec *timeout) -TEXT runtime·kevent(SB),NOSPLIT,$0 - MOVW $SYS_kevent, R12 - MOVW kq+0(FP), R0 - MOVW ch+4(FP), R1 - MOVW nch+8(FP), R2 - MOVW ev+12(FP), R3 - MOVW nev+16(FP), R4 - MOVW ts+20(FP), R5 - SWI $0x80 - RSB.CS $0, R0, R0 - MOVW R0, ret+24(FP) +TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0 + MOVW 4(R0), R1 // arg 2 keventss + MOVW 8(R0), R2 // arg 3 nch + MOVW 12(R0), R3 // arg 4 ev + MOVW 16(R0), R4 // arg 5 nev + MOVW 20(R0), R5 // arg 6 ts + MOVW 0(R0), R0 // arg 1 kq + // Only R0-R3 are used for arguments, the rest + // go on the stack. + MOVM.DB.W [R4-R5], (R13) + BL libc_kevent(SB) + ADD $(2*4), R13 + MOVW $-1, R2 + CMP R0, R2 + BNE ok + BL libc_error(SB) + MOVW (R0), R0 // errno + RSB $0, R0, R0 // caller wants it as a negative error code +ok: RET -// int32 runtime·closeonexec(int32 fd) -TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVW $SYS_fcntl, R12 - MOVW fd+0(FP), R0 - MOVW $2, R1 // F_SETFD - MOVW $1, R2 // FD_CLOEXEC - SWI $0x80 +TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0 + MOVW 4(R0), R1 // arg 2 cmd + MOVW 8(R0), R2 // arg 3 arg + MOVW 0(R0), R0 // arg 1 fd + BL libc_fcntl(SB) RET // sigaltstack is not supported on iOS, so our sigtramp has diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s index c21a5566fa0..73ffd12bffe 100644 --- a/src/runtime/sys_darwin_arm64.s +++ b/src/runtime/sys_darwin_arm64.s @@ -10,19 +10,6 @@ #include "go_tls.h" #include "textflag.h" -// Copied from /usr/include/sys/syscall.h -#define SYS_gettimeofday 116 -#define SYS_kill 37 -#define SYS_getpid 20 -#define SYS_pthread_sigmask 329 -#define SYS_setitimer 83 -#define SYS___sysctl 202 -#define SYS_sigaction 46 -#define SYS_sigreturn 184 -#define SYS_kqueue 362 -#define SYS_kevent 363 -#define SYS_fcntl 92 - TEXT notok<>(SB),NOSPLIT,$0 MOVD $0, R8 MOVD R8, (R8) @@ -106,12 +93,11 @@ TEXT runtime·madvise_trampoline(SB),NOSPLIT,$0 BL libc_madvise(SB) RET -TEXT runtime·setitimer(SB),NOSPLIT,$0 - MOVW mode+0(FP), R0 - MOVD new+8(FP), R1 - MOVD old+16(FP), R2 - MOVW $SYS_setitimer, R16 - SVC $0x80 +TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 new + MOVD 16(R0), R2 // arg 3 old + MOVW 0(R0), R0 // arg 1 which + BL libc_setitimer(SB) RET TEXT runtime·walltime_trampoline(SB),NOSPLIT,$0 @@ -262,22 +248,14 @@ TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0 BL libc_usleep(SB) RET -TEXT runtime·sysctl(SB),NOSPLIT,$0 - MOVD mib+0(FP), R0 - MOVW miblen+8(FP), R1 - MOVD out+16(FP), R2 - MOVD size+24(FP), R3 - MOVD dst+32(FP), R4 - MOVD ndst+40(FP), R5 - MOVW $SYS___sysctl, R16 - SVC $0x80 - BCC ok - NEG R0, R0 - MOVW R0, ret+48(FP) - RET -ok: - MOVW $0, R0 - MOVW R0, ret+48(FP) +TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 miblen + MOVD 16(R0), R2 // arg 3 out + MOVD 24(R0), R3 // arg 4 size + MOVD 32(R0), R4 // arg 5 dst + MOVD 40(R0), R5 // arg 6 ndst + MOVD 0(R0), R0 // arg 1 mib + BL libc_sysctl(SB) RET // uint32 mach_msg_trap(void*, uint32, uint32, uint32, uint32, uint32, uint32) @@ -349,37 +327,32 @@ TEXT runtime·mach_semaphore_signal_all(SB),NOSPLIT,$0 MOVW R0, ret+8(FP) RET -// int32 runtime·kqueue(void) -TEXT runtime·kqueue(SB),NOSPLIT,$0 - MOVW $SYS_kqueue, R16 - SVC $0x80 - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+0(FP) +TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0 + BL libc_kqueue(SB) RET -// int32 runtime·kevent(int kq, Kevent *ch, int nch, Kevent *ev, int nev, Timespec *ts) -TEXT runtime·kevent(SB),NOSPLIT,$0 - MOVW kq+0(FP), R0 - MOVD ch+8(FP), R1 - MOVW nch+16(FP), R2 - MOVD ev+24(FP), R3 - MOVW nev+32(FP), R4 - MOVD ts+40(FP), R5 - MOVW $SYS_kevent, R16 - SVC $0x80 - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+48(FP) +TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 keventt + MOVW 16(R0), R2 // arg 3 nch + MOVD 24(R0), R3 // arg 4 ev + MOVW 32(R0), R4 // arg 5 nev + MOVD 40(R0), R5 // arg 6 ts + MOVW 0(R0), R0 // arg 1 kq + BL libc_kevent(SB) + MOVD $-1, R2 + CMP R0, R2 + BNE ok + BL libc_error(SB) + MOVD (R0), R0 // errno + NEG R0, R0 // caller wants it as a negative error code +ok: RET -// int32 runtime·closeonexec(int32 fd) -TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVW fd+0(FP), R0 - MOVW $2, R1 // F_SETFD - MOVW $1, R2 // FD_CLOEXEC - MOVW $SYS_fcntl, R16 - SVC $0x80 +TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0 + MOVW 4(R0), R1 // arg 2 cmd + MOVW 8(R0), R2 // arg 3 arg + MOVW 0(R0), R0 // arg 1 fd + BL libc_fcntl(SB) RET // sigaltstack on iOS is not supported and will always