fixed more binutils issues (newer gcc/libc)
[zpugcc/jano.git] / toolchain / gcc / libgloss / arm / redboot-crt0.S
blobf2963eeb489bea59915797e07f3067dd2042153d
1         
2     .file   "crt0.S"
3         
4 #define XGLUE(a,b) a##b
5 #define GLUE(a,b) XGLUE(a,b)
6         
7 #ifdef __USER_LABEL_PREFIX__
8 #define SYM_NAME( name ) GLUE (__USER_LABEL_PREFIX__, name)
9 #else
10 #error __USER_LABEL_PREFIX is not defined
11 #endif
13     .text
14      /* Setup the assembly entry point.  */
15     .code 32
16     .globl SYM_NAME(start)
17     .globl SYM_NAME(_start)
18 SYM_NAME(start):
19 SYM_NAME(_start):
20         mov     fp, #0  /* Null frame pointer.  */
21         mov     r7, #0  /* Null frame pointer for Thumb.  */
23         /* Enable interrupts for gdb debugging.  */
24         mrs    r0, cpsr
25         bic    r0, r0, #0xC0
26         msr    cpsr, r0
27         
28         mov     a2, #0                  /* Second arg: fill value.  */
29         ldr     a1, .LC1                /* First arg: start of memory block.  */
30         ldr     a3, .LC2        
31         sub     a3, a3, a1              /* Third arg: length of block.  */
33 #ifdef  GCRT0
34         /* Zero out the bss without using memset. 
35            Using memset is bad because it may be instrumented for
36            profiling, but at this point, the profiling data structures
37            have not been set up. 
38            FIXME: This loop could be a lot more efficient.  */
39         subs    a3, a3, #0
40         beq     2f
41 1:      strb    a2, [a1]
42         subs    a3, a3, #1
43         add     a1, a1, #1
44         bne     1b
45 2:      
46         /* Nothing to left to clear.  */
47 #endif
49 #ifdef __thumb__                /* Enter Thumb mode. */
50         add     a4, pc, #1      /* Get the address of the Thumb block.  */
51         bx      a4              /* Go there and start Thumb decoding.   */
53         .code 16
54         .global __change_mode
55         .thumb_func
56 __change_mode:  
57 #endif
59 #ifndef GCRT0
60         bl      SYM_NAME(memset)
61 #endif
62         bl      SYM_NAME(__get_memtop)
63         sub     r0, r0, #32
64         mov     sp, r0
66 #ifdef __USES_INITFINI__
67         /* Some arm/elf targets use the .init and .fini sections
68            to create constructors and destructors, and for these
69            targets we need to call the _init function and arrange
70            for _fini to be called at program exit.  */
71         ldr     r0, .Lfini
72         bl      SYM_NAME (atexit)
73         bl      SYM_NAME (_init)
74 #endif  
76         mov     a1, #0
77         ldr     a2, .LC3
78         mov     a3, a2
79         bl      SYM_NAME(main)
80     1:  bl      SYM_NAME(exit)
81         b       1b
82         .align  2
83 .LC1:
84         .word   __bss_start__
85 .LC2:
86         .word   __bss_end__
87 .LC3:
88         .word   0
89 #ifdef __USES_INITFINI__
90 .Lfini:
91         .word   SYM_NAME(_fini)
92 #endif
93 #if 0
94 #ifdef __thumb__
95         .code 16
96 #endif
97         .global SYM_NAME(__syscall)
98 #ifdef __thumb__
99         .thumb_func
100 #else
101         .align  4
102 #endif
103 SYM_NAME(__syscall):
104         mov     r12, lr
105 #ifdef __thumb__
106         swi     0x18
107 #else
108         swi     0x180001
109 #endif
110         mov     pc, r12
111 #endif