diff options
Diffstat (limited to 'libgloss/arm/redboot-crt0.S')
-rw-r--r-- | libgloss/arm/redboot-crt0.S | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/libgloss/arm/redboot-crt0.S b/libgloss/arm/redboot-crt0.S new file mode 100644 index 000000000..e707a6a1d --- /dev/null +++ b/libgloss/arm/redboot-crt0.S @@ -0,0 +1,79 @@ + + + .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) + + mov a1, #0 + ldr a2, .LC3 + mov a3, a2 + bl SYM_NAME(main) + 1: bl SYM_NAME(exit) + b 1b +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +.LC3: + .word 0 + +#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 |