aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt0_linux_arm64.s
diff options
context:
space:
mode:
authorElias Naur <elias.naur@gmail.com>2016-03-12 12:13:11 +0100
committerElias Naur <elias.naur@gmail.com>2016-03-15 08:43:34 +0000
commitea4b785ae03a067f4a26adac78213ff6caac5128 (patch)
tree860bd32217830b22b7b83077d3caa09aecc71d8d /src/runtime/rt0_linux_arm64.s
parentac47f66abcd98cc5f0e121691acd3e8dced09b4b (diff)
downloadgo-ea4b785ae03a067f4a26adac78213ff6caac5128.tar.gz
go-ea4b785ae03a067f4a26adac78213ff6caac5128.zip
runtime: preserve darwin/arm{,64} callee-save registers
CL 14603 attempted to preserve the callee-save registers for the darwin/arm runtime initialization routine, but I believe it wasn't sufficient and resulted in the crash reported in issue Saving and restoring the registers on the stack the same way linux/arm does seems more obvious and fixes #14778, so do that. Even though #14778 is not reproducible on darwin/arm64, I applied a similar change there, and to linux/arm64 which obeys the same calling convention. Finally, this CL is a candidate for a 1.6 minor release for the same reason CL 14603 was in a 1.5 minor release (as CL 16968). It is small and only touches the iOS platforms and gomobile on darwin/arm is currently useless without it. Fixes #14778 Fixes #12590 (again) Change-Id: I7401daf0bbd7c579a7e84761384a7b763651752a Reviewed-on: https://go-review.googlesource.com/20621 Reviewed-by: David Crawshaw <crawshaw@golang.org> Run-TryBot: Elias Naur <elias.naur@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/rt0_linux_arm64.s')
-rw-r--r--src/runtime/rt0_linux_arm64.s27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/runtime/rt0_linux_arm64.s b/src/runtime/rt0_linux_arm64.s
index 2b32e35209..31c2367bca 100644
--- a/src/runtime/rt0_linux_arm64.s
+++ b/src/runtime/rt0_linux_arm64.s
@@ -11,11 +11,17 @@ TEXT _rt0_arm64_linux(SB),NOSPLIT,$-8
// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
-TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$40
- // R27 is REGTMP, reserved for liblink. It is used below to
- // move R0/R1 into globals. However in the standard ARM64 calling
- // convention, it is a callee-saved register.
- MOVD R27, 24(RSP)
+TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$88
+ // Preserve callee-save registers.
+ MOVD R19, 24(RSP)
+ MOVD R20, 32(RSP)
+ MOVD R21, 40(RSP)
+ MOVD R22, 48(RSP)
+ MOVD R23, 56(RSP)
+ MOVD R24, 64(RSP)
+ MOVD R25, 72(RSP)
+ MOVD R26, 80(RSP)
+ MOVD R27, 88(RSP)
MOVD R0, _rt0_arm64_linux_lib_argc<>(SB)
MOVD R1, _rt0_arm64_linux_lib_argv<>(SB)
@@ -42,7 +48,16 @@ nocgo:
BL (R4)
restore:
- MOVD 24(RSP), R27
+ // Restore callee-save registers.
+ MOVD 24(RSP), R19
+ MOVD 32(RSP), R20
+ MOVD 40(RSP), R21
+ MOVD 48(RSP), R22
+ MOVD 56(RSP), R23
+ MOVD 64(RSP), R24
+ MOVD 72(RSP), R25
+ MOVD 80(RSP), R26
+ MOVD 88(RSP), R27
RET
TEXT _rt0_arm64_linux_lib_go(SB),NOSPLIT,$0