aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt0_linux_arm.s
blob: 8a5722f0069030126e2957f9d8c25cf09533d6db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "textflag.h"

TEXT _rt0_arm_linux(SB),NOSPLIT|NOFRAME,$0
	MOVW	(R13), R0	// argc
	MOVW	$4(R13), R1		// argv
	MOVW	$_rt0_arm_linux1(SB), R4
	B		(R4)

// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
TEXT _rt0_arm_linux_lib(SB),NOSPLIT,$0
	B	_rt0_arm_lib(SB)

TEXT _rt0_arm_linux1(SB),NOSPLIT|NOFRAME,$0
	// We first need to detect the kernel ABI, and warn the user
	// if the system only supports OABI.
	// The strategy here is to call some EABI syscall to see if
	// SIGILL is received.
	// If you get a SIGILL here, you have the wrong kernel.

	// 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

	MOVM.IA.W (R13), [R0-R1]
	B	runtime·rt0_go(SB)