aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt0_linux_arm.s
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2017-10-13 13:52:57 -0700
committerIan Lance Taylor <iant@golang.org>2017-10-25 00:40:40 +0000
commitd92aaa970791472a1657e878bf686fe802943ebe (patch)
tree92c4fd495c5847ea382a5e53ecd075884e541dc2 /src/runtime/rt0_linux_arm.s
parent253e605af4533fd9f1276291225c27e972417e97 (diff)
downloadgo-d92aaa970791472a1657e878bf686fe802943ebe.tar.xz
runtime: unify arm entry point code
Change-Id: Id51a2d63f7199b3ff71cedd415345ad20e5bd981 Reviewed-on: https://go-review.googlesource.com/70791 Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/rt0_linux_arm.s')
-rw-r--r--src/runtime/rt0_linux_arm.s90
1 files changed, 5 insertions, 85 deletions
diff --git a/src/runtime/rt0_linux_arm.s b/src/runtime/rt0_linux_arm.s
index b56ec75071..ba4ca2b10a 100644
--- a/src/runtime/rt0_linux_arm.s
+++ b/src/runtime/rt0_linux_arm.s
@@ -12,84 +12,8 @@ TEXT _rt0_arm_linux(SB),NOSPLIT,$-4
// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
-TEXT _rt0_arm_linux_lib(SB),NOSPLIT,$104
- // Preserve callee-save registers. Raspberry Pi's dlopen(), for example,
- // actually cares that R11 is preserved.
- MOVW R4, 12(R13)
- MOVW R5, 16(R13)
- MOVW R6, 20(R13)
- MOVW R7, 24(R13)
- MOVW R8, 28(R13)
- MOVW R11, 32(R13)
-
- // Skip floating point registers on GOARM < 6.
- MOVB runtime·goarm(SB), R11
- CMP $6, R11
- BLT skipfpsave
- MOVD F8, (32+8*1)(R13)
- MOVD F9, (32+8*2)(R13)
- MOVD F10, (32+8*3)(R13)
- MOVD F11, (32+8*4)(R13)
- MOVD F12, (32+8*5)(R13)
- MOVD F13, (32+8*6)(R13)
- MOVD F14, (32+8*7)(R13)
- MOVD F15, (32+8*8)(R13)
-skipfpsave:
- // Save argc/argv.
- MOVW R0, _rt0_arm_linux_lib_argc<>(SB)
- MOVW R1, _rt0_arm_linux_lib_argv<>(SB)
-
- // Synchronous initialization.
- MOVW $runtime·libpreinit(SB), R2
- CALL (R2)
-
- // Create a new thread to do the runtime initialization.
- MOVW _cgo_sys_thread_create(SB), R2
- CMP $0, R2
- BEQ nocgo
- MOVW $_rt0_arm_linux_lib_go<>(SB), R0
- MOVW $0, R1
- BL (R2)
- B rr
-nocgo:
- MOVW $0x800000, R0 // stacksize = 8192KB
- MOVW $_rt0_arm_linux_lib_go<>(SB), R1 // fn
- MOVW R0, 4(R13)
- MOVW R1, 8(R13)
- BL runtime·newosproc0(SB)
-rr:
- // Restore callee-save registers and return.
- MOVB runtime·goarm(SB), R11
- CMP $6, R11
- BLT skipfprest
- MOVD (32+8*1)(R13), F8
- MOVD (32+8*2)(R13), F9
- MOVD (32+8*3)(R13), F10
- MOVD (32+8*4)(R13), F11
- MOVD (32+8*5)(R13), F12
- MOVD (32+8*6)(R13), F13
- MOVD (32+8*7)(R13), F14
- MOVD (32+8*8)(R13), F15
-skipfprest:
- MOVW 12(R13), R4
- MOVW 16(R13), R5
- MOVW 20(R13), R6
- MOVW 24(R13), R7
- MOVW 28(R13), R8
- MOVW 32(R13), R11
- RET
-
-TEXT _rt0_arm_linux_lib_go<>(SB),NOSPLIT,$8
- MOVW _rt0_arm_linux_lib_argc<>(SB), R0
- MOVW _rt0_arm_linux_lib_argv<>(SB), R1
- MOVW R0, 0(R13)
- MOVW R1, 4(R13)
- B runtime·rt0_go(SB)
-
-DATA _rt0_arm_linux_lib_argc<>(SB)/4,$0
-GLOBL _rt0_arm_linux_lib_argc<>(SB),NOPTR,$4
-DATA _rt0_arm_linux_lib_argv<>(SB)/4,$0
-GLOBL _rt0_arm_linux_lib_argv<>(SB),NOPTR,$4
+TEXT _rt0_arm_linux_lib(SB),NOSPLIT,$0
+ B _rt0_arm_lib(SB)
TEXT _rt0_arm_linux1(SB),NOSPLIT,$-4
// We first need to detect the kernel ABI, and warn the user
@@ -98,16 +22,12 @@ TEXT _rt0_arm_linux1(SB),NOSPLIT,$-4
// SIGILL is received.
// If you get a SIGILL here, you have the wrong kernel.
- // Save argc and argv
+ // Save argc and argv (syscall will clobber at least R0).
MOVM.DB.W [R0-R1], (R13)
// do an EABI syscall
MOVW $20, R7 // sys_getpid
SWI $0 // this will trigger SIGILL on OABI systems
-
- B runtime·rt0_go(SB)
-
-TEXT main(SB),NOSPLIT,$-4
- MOVW $_rt0_arm_linux1(SB), R4
- B (R4)
+ MOVM.IA.W (R13), [R0-R1]
+ B runtime·rt0_go(SB)