newlib/libgloss/arm/redboot-crt0.S

99 lines
1.8 KiB
ArmAsm

.file "crt0.S"
#define XGLUE(a,b) a##b
#define GLUE(a,b) XGLUE(a,b)
#ifdef __USER_LABEL_PREFIX__
#define SYM_NAME( name ) GLUE (__USER_LABEL_PREFIX__, name)
#else
#error __USER_LABEL_PREFIX is not defined
#endif
.text
/*
* Setup the assembly entry point.
*/
.code 32
.globl SYM_NAME(start)
.globl SYM_NAME(_start)
SYM_NAME(start):
SYM_NAME(_start):
mov fp, #0 /* Null frame pointer */
mov r7, #0 /* Null frame pointer for Thumb */
/* enable interrupts for gdb debugging */
mrs r0, cpsr
bic r0, r0, #0xC0
msr cpsr, r0
mov a2, #0 /* Second arg: fill value */
ldr a1, .LC1 /* First arg: start of memory block */
ldr a3, .LC2
sub a3, a3, a1 /* Third arg: length of block */
#ifdef __thumb__ /* Enter Thumb mode.... */
add a4, pc, #1 /* Get the address of the Thumb block */
bx a4 /* Go there and start Thumb decoding */
.code 16
.global __change_mode
.thumb_func
__change_mode:
#endif
bl SYM_NAME(memset)
bl SYM_NAME(__get_memtop)
sub r0, r0, #32
mov sp, r0
#ifdef __USES_INITFINI__
/* Some arm/elf targets use the .init and .fini sections
to create constructors and destructors, and for these
targets we need to call the _init function and arrange
for _fini to be called at program exit. */
ldr r0, .Lfini
bl SYM_NAME (atexit)
bl SYM_NAME (_init)
#endif
mov a1, #0
ldr a2, .LC3
mov a3, a2
bl SYM_NAME(main)
1: bl SYM_NAME(exit)
b 1b
.align 2
.LC1:
.word __bss_start__
.LC2:
.word __bss_end__
.LC3:
.word 0
#ifdef __USES_INITFINI__
.Lfini:
.word SYM_NAME(_fini)
#endif
#if 0
#ifdef __thumb__
.code 16
#endif
.global SYM_NAME(__syscall)
#ifdef __thumb__
.thumb_func
#else
.align 4
#endif
SYM_NAME(__syscall):
mov r12, lr
#ifdef __thumb__
swi 0x18
#else
swi 0x180001
#endif
mov pc, r12
#endif