aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElias Naur <mail@eliasnaur.com>2019-04-30 09:18:23 +0200
committerElias Naur <mail@eliasnaur.com>2019-04-30 16:43:59 +0000
commit9f12e2e04bc5fb5c53546cf9c53dabe0d1c8fa55 (patch)
tree448592af34810ccd5e2791aa9f16438ddcdbea97 /src
parente0ac75d2ab9da30d41a76a4ed89b89cb79cb5c60 (diff)
downloadgo-9f12e2e04bc5fb5c53546cf9c53dabe0d1c8fa55.tar.xz
runtime: implement pthread functions for darwin/arm64
They were not needed when Go only produced binaries with cgo suppport. Now that Go is about to run self-hosted on iOS we do need these. Updates #31722 Change-Id: If233aa2b31edc7b1c2dcac68974f9fba0604f9a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/174300 Run-TryBot: Elias Naur <mail@eliasnaur.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/sys_darwin_arm64.s85
1 files changed, 72 insertions, 13 deletions
diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s
index 89a2b8a054..fa6157eba9 100644
--- a/src/runtime/sys_darwin_arm64.s
+++ b/src/runtime/sys_darwin_arm64.s
@@ -304,33 +304,92 @@ TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
RET
// Thread related functions
-// Note: On darwin/arm64, the runtime always use runtime/cgo to
-// create threads, so all thread related functions will just exit with a
-// unique status.
+// mstart_stub is the first function executed on a new thread started by pthread_create.
+// It just does some low-level setup and then calls mstart.
+// Note: called with the C calling convention.
TEXT runtime·mstart_stub(SB),NOSPLIT,$0
- MOVW $44, R0
- BL libc_exit(SB)
+ // R0 points to the m.
+ // We are already on m's g0 stack.
+
+ // Save callee-save registers.
+ SUB $144, RSP
+ MOVD R19, 0(RSP)
+ MOVD R20, 8(RSP)
+ MOVD R21, 16(RSP)
+ MOVD R22, 24(RSP)
+ MOVD R23, 32(RSP)
+ MOVD R24, 40(RSP)
+ MOVD R25, 48(RSP)
+ MOVD R26, 56(RSP)
+ MOVD R27, 64(RSP)
+ MOVD g, 72(RSP)
+ FMOVD F8, 80(RSP)
+ FMOVD F9, 88(RSP)
+ FMOVD F10, 96(RSP)
+ FMOVD F11, 104(RSP)
+ FMOVD F12, 112(RSP)
+ FMOVD F13, 120(RSP)
+ FMOVD F14, 128(RSP)
+ FMOVD F15, 136(RSP)
+
+ MOVD m_g0(R0), g
+
+ BL runtime·mstart(SB)
+
+ // Restore callee-save registers.
+ MOVD 0(RSP), R19
+ MOVD 8(RSP), R20
+ MOVD 16(RSP), R21
+ MOVD 24(RSP), R22
+ MOVD 32(RSP), R23
+ MOVD 40(RSP), R24
+ MOVD 48(RSP), R25
+ MOVD 56(RSP), R26
+ MOVD 64(RSP), R27
+ MOVD 72(RSP), g
+ FMOVD 80(RSP), F8
+ FMOVD 88(RSP), F9
+ FMOVD 96(RSP), F10
+ FMOVD 104(RSP), F11
+ FMOVD 112(RSP), F12
+ FMOVD 120(RSP), F13
+ FMOVD 128(RSP), F14
+ FMOVD 136(RSP), F15
+ ADD $144, RSP
+
+ // Go is all done with this OS thread.
+ // Tell pthread everything is ok (we never join with this thread, so
+ // the value here doesn't really matter).
+ MOVD $0, R0
+
RET
TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
- MOVW $45, R0
- BL libc_exit(SB)
+ MOVD 0(R0), R0 // arg 1 attr
+ BL libc_pthread_attr_init(SB)
RET
TEXT runtime·pthread_attr_setstacksize_trampoline(SB),NOSPLIT,$0
- MOVW $46, R0
- BL libc_exit(SB)
+ MOVD 8(R0), R1 // arg 2 size
+ MOVD 0(R0), R0 // arg 1 attr
+ BL libc_pthread_attr_setstacksize(SB)
RET
TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0
- MOVW $47, R0
- BL libc_exit(SB)
+ MOVD 8(R0), R1 // arg 2 state
+ MOVD 0(R0), R0 // arg 1 attr
+ BL libc_pthread_attr_setdetachstate(SB)
RET
TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0
- MOVW $48, R0
- BL libc_exit(SB)
+ SUB $16, RSP
+ MOVD 0(R0), R1 // arg 2 state
+ MOVD 8(R0), R2 // arg 3 start
+ MOVD 16(R0), R3 // arg 4 arg
+ MOVD RSP, R0 // arg 1 &threadid (which we throw away)
+ BL libc_pthread_create(SB)
+ ADD $16, RSP
RET
TEXT runtime·raise_trampoline(SB),NOSPLIT,$0