diff options
Diffstat (limited to 'src/runtime/rt0_darwin_arm.s')
-rw-r--r-- | src/runtime/rt0_darwin_arm.s | 29 |
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 |