aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt0_darwin_arm.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/rt0_darwin_arm.s')
-rw-r--r--src/runtime/rt0_darwin_arm.s29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/runtime/rt0_darwin_arm.s b/src/runtime/rt0_darwin_arm.s
index 95a2b179c4..d60985060d 100644
--- a/src/runtime/rt0_darwin_arm.s
+++ b/src/runtime/rt0_darwin_arm.s
@@ -16,27 +16,34 @@ TEXT _rt0_arm_darwin(SB),7,$-4
//
// Note that all currently shipping darwin/arm platforms require
// cgo and do not support c-shared.
-TEXT _rt0_arm_darwin_lib(SB),NOSPLIT,$12
+TEXT _rt0_arm_darwin_lib(SB),NOSPLIT,$0
+ // R11 is REGTMP, reserved for liblink. It is used below to
+ // move R0/R1 into globals. However in the darwin ARMv7 calling
+ // convention, it is a callee-saved register. So we save it to a
+ // temporary register.
+ MOVW R11, R2
MOVW R0, _rt0_arm_darwin_lib_argc<>(SB)
MOVW R1, _rt0_arm_darwin_lib_argv<>(SB)
// Create a new thread to do the runtime initialization and return.
- MOVW _cgo_sys_thread_create(SB), R4
- CMP $0, R4
+ MOVW _cgo_sys_thread_create(SB), R3
+ CMP $0, R3
B.EQ nocgo
MOVW $_rt0_arm_darwin_lib_go(SB), R0
MOVW $0, R1
- BL (R4)
+ MOVW R2, R11
+ BL (R3)
RET
nocgo:
MOVW $0x400000, R0
- MOVW $_rt0_arm_darwin_lib_go(SB), R1
- MOVW $0, R2
- MOVW R0, (R13) // stacksize
- MOVW R1, 4(R13) // fn
- MOVW R2, 8(R13) // fnarg
- MOVW $runtime·newosproc0(SB), R4
- BL (R4)
+ MOVW R0, (R13) // stacksize
+ MOVW $_rt0_arm_darwin_lib_go(SB), R0
+ MOVW R0, 4(R13) // fn
+ MOVW $0, R0
+ MOVW R0, 8(R13) // fnarg
+ MOVW $runtime·newosproc0(SB), R3
+ MOVW R2, R11
+ BL (R3)
RET
TEXT _rt0_arm_darwin_lib_go(SB),NOSPLIT,$0