github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/src/runtime/rt0_linux_arm.s (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "textflag.h"
     6  
     7  TEXT _rt0_arm_linux(SB),NOSPLIT,$-4
     8  	MOVW	(R13), R0	// argc
     9  	MOVW	$4(R13), R1		// argv
    10  	MOVW	$_rt0_arm_linux1(SB), R4
    11  	B		(R4)
    12  
    13  TEXT _rt0_arm_linux1(SB),NOSPLIT,$-4
    14  	// We first need to detect the kernel ABI, and warn the user
    15  	// if the system only supports OABI
    16  	// The strategy here is to call some EABI syscall to see if
    17  	// SIGILL is received.
    18  	// To catch SIGILL, we have to first setup sigaction, this is
    19  	// a chicken-and-egg problem, because we can't do syscall if
    20  	// we don't know the kernel ABI... Oh, not really, we can do
    21  	// syscall in Thumb mode.
    22  
    23  	// Save argc and argv
    24  	MOVM.DB.W [R0-R1], (R13)
    25  
    26  	// Thumb mode OABI check disabled because there are some
    27  	// EABI systems that do not support Thumb execution.
    28  	// We can run on them except for this check!
    29  
    30  	// // set up sa_handler
    31  	// MOVW	$bad_abi<>(SB), R0 // sa_handler
    32  	// MOVW	$0, R1 // sa_flags
    33  	// MOVW	$0, R2 // sa_restorer
    34  	// MOVW	$0, R3 // sa_mask
    35  	// MOVM.DB.W [R0-R3], (R13)
    36  	// MOVW	$4, R0 // SIGILL
    37  	// MOVW	R13, R1 // sa
    38  	// SUB	$16, R13
    39  	// MOVW	R13, R2 // old_sa
    40  	// MOVW	$8, R3 // c
    41  	// MOVW	$174, R7 // sys_sigaction
    42  	// BL	oabi_syscall<>(SB)
    43  
    44  	// do an EABI syscall
    45  	MOVW	$20, R7 // sys_getpid
    46  	SWI	$0 // this will trigger SIGILL on OABI systems
    47  	
    48  	// MOVW	$4, R0  // SIGILL
    49  	// MOVW	R13, R1 // sa
    50  	// MOVW	$0, R2 // old_sa
    51  	// MOVW	$8, R3 // c
    52  	// MOVW	$174, R7 // sys_sigaction
    53  	// SWI	$0 // restore signal handler
    54  	// ADD	$32, R13
    55  
    56  	SUB	$4, R13 // fake a stack frame for runtime·setup_auxv
    57  	BL	runtime·setup_auxv(SB)
    58  	ADD	$4, R13
    59  	B	runtime·rt0_go(SB)
    60  
    61  TEXT bad_abi<>(SB),NOSPLIT,$-4
    62  	// give diagnosis and exit
    63  	MOVW	$2, R0 // stderr
    64  	MOVW	$bad_abi_msg(SB), R1 // data
    65  	MOVW	$45, R2 // len
    66  	MOVW	$4, R7 // sys_write
    67  	BL	oabi_syscall<>(SB)
    68  	MOVW	$1, R0
    69  	MOVW	$1, R7 // sys_exit
    70  	BL	oabi_syscall<>(SB)
    71  	B  	0(PC)
    72  
    73  DATA bad_abi_msg+0x00(SB)/8, $"This pro"
    74  DATA bad_abi_msg+0x08(SB)/8, $"gram can"
    75  DATA bad_abi_msg+0x10(SB)/8, $" only be"
    76  DATA bad_abi_msg+0x18(SB)/8, $" run on "
    77  DATA bad_abi_msg+0x20(SB)/8, $"EABI ker"
    78  DATA bad_abi_msg+0x28(SB)/4, $"nels"
    79  DATA bad_abi_msg+0x2c(SB)/1, $0xa
    80  GLOBL bad_abi_msg(SB), RODATA, $45
    81  
    82  TEXT oabi_syscall<>(SB),NOSPLIT,$-4
    83  	ADD $1, PC, R4
    84  	WORD $0xe12fff14 //BX	(R4) // enter thumb mode
    85  	// TODO(minux): only supports little-endian CPUs
    86  	WORD $0x4770df01 // swi $1; bx lr
    87  
    88  TEXT main(SB),NOSPLIT,$-4
    89  	MOVW	$_rt0_arm_linux1(SB), R4
    90  	B		(R4)
    91