]> rtime.felk.cvut.cz Git - arc.git/blob - arch/ppc/crt0.sx
484fed07ca7ea390cb77f8eb6f93417e8428f844
[arc.git] / arch / ppc / crt0.sx
1 #define _ASSEMBLER_\r
2 #include "asm_ppc.h"\r
3 \r
4 #if defined(__GNUC__)\r
5 .section ".rcw","ax"\r
6 .balign  4\r
7 #elif defined(__CWCC__) || defined(__DCC__)\r
8         .section .rcw,4,"r"\r
9 #endif\r
10 \r
11 \r
12         .global _resetconfiguration\r
13 _resetconfiguration:\r
14 #if defined(CFG_VLE)\r
15         .byte  0x01   #no watchdog, VLE\r
16 #else\r
17         .byte  0x00   #no watchdog\r
18 #endif  \r
19         .byte  0x5A   #Boot identifier\r
20         .byte  0x00\r
21         .byte  0x00\r
22         .long _start\r
23 \r
24 \r
25         .extern _SDA_BASE_\r
26         .extern _SDA2_BASE_\r
27         .extern __SP_INIT\r
28         .extern __DATA_RAM\r
29         .extern __DATA_END\r
30         .extern __BSS_START\r
31         .extern __BSS_END\r
32         .extern __DATA_ROM\r
33         .extern exit\r
34         .extern main\r
35         \r
36 #if defined(__CWCC__) && defined(CFG_VLE)\r
37 .section .text_vle,text_vle\r
38 #elif defined(__DCC__)\r
39         // Must be indented (diab)\r
40         .section .text_vle,x\r
41 #elif defined(__GNUC__)\r
42 .section .text\r
43 #endif\r
44         .align          4\r
45 \r
46         .globl  _start\r
47         .type   _start,@function\r
48 \r
49         // Good information about the E500 is freescale doc: E500ABIUG.pdf\r
50         \r
51 #if 0\r
52 .global _redled\r
53 _redled:\r
54         // mpc5567qrtech: light up led K2 \r
55         li r0, 0x0202\r
56         lis r3, 0xC3F9013A@h\r
57         ori r3, r3, 0xC3F90130@l\r
58         stw r0, 8(r3)\r
59         b _exit\r
60 #endif\r
61 \r
62 __start:\r
63 _start:\r
64 #if (CFG_MPC560X)\r
65         // For now, close down the watchdog.\r
66         LOAD_ADDR_32(r8,0xFFF38000)\r
67         LOAD_ADDR_32(r9,0x0000c520)\r
68         stw             r9,0x10(r8)     \r
69         LOAD_ADDR_32(r9,0x0000d928)\r
70         stw             r9,0x10(r8)\r
71         LOAD_ADDR_32(r9,0x8000010A)\r
72         stw             r9,0x0(r8)\r
73 #endif  \r
74         \r
75         // Set up the reserved registers in EABI: r1,r2 and r13\r
76 \r
77         // r1, stack pointer\r
78         LOAD_ADDR_32(1,__SP_INIT)\r
79         \r
80         // r13, base of .sdata\r
81         LOAD_ADDR_32(13,_SDA_BASE_)\r
82 \r
83         // r2, base of .sdata2 and .sbss2\r
84         LOAD_ADDR_32(2,_SDA2_BASE_)\r
85 \r
86         // make space for initial backchain..\r
87         subi    r1,r1,16\r
88 \r
89 /* Store winIDEA terminal connected status */\r
90 #if defined(USE_TTY_WINIDEA)\r
91         LOAD_ADDR_32(r8,g_TConn)\r
92         lbz r9,0(r8)\r
93 #endif\r
94 \r
95         /*  Clear all SRAM */\r
96 init_RAM:\r
97         LOAD_ADDR_32(11,0x40000000)\r
98 #if !defined(SRAM_SIZE)\r
99 #error SRAM_SIZE not defined. Add it to board/<board>/build_config.mk\r
100 #endif\r
101 \r
102         LOAD_ADDR_32(r4,SRAM_SIZE/(32*4))\r
103         mtctr r12\r
104 \r
105 init_ram_loop:\r
106         stmw r0,0(r11) # write all 32 GPRs to SRAM\r
107         addi r11,r11,128 # inc the ram ptr; 32 GPRs * 4 bytes = 128\r
108         bdnz init_ram_loop # loop for 80k of SRAM\r
109 \r
110 \r
111         // Copy initialized data from ROM to RAM\r
112         LOAD_ADDR_32(3,__DATA_ROM)\r
113         LOAD_ADDR_32(4,__DATA_RAM)\r
114         LOAD_ADDR_32(5,__DATA_END)\r
115         \r
116         cmplw   r3,r4\r
117         beq             skip_data\r
118         cmplw   r4,r5\r
119         beq             skip_data\r
120         subi    r3,r3,1\r
121         subi    r4,r4,1\r
122 copy_data:\r
123         lbzu    r6,1(r3)\r
124         stbu    r6,1(r4)\r
125         cmplw   r4,r5\r
126         bne+    copy_data\r
127 skip_data:\r
128 \r
129         /* Clear uninitialized data( holds both bss and sbss ) */\r
130         LOAD_ADDR_32(3,__BSS_START)\r
131         LOAD_ADDR_32(4,__BSS_END)\r
132         cmplw   r3,r4\r
133         beq             skip_bss\r
134         li              r0,0\r
135         subi    r3,r3,1\r
136 copy_bss:\r
137         stbu    r0,1(r3)\r
138         cmplw   r3,r4\r
139         bne+    copy_bss\r
140 skip_bss:\r
141 \r
142 /* Restore winIDEA terminal connected status */\r
143 #if defined(USE_TTY_WINIDEA)\r
144         stb             r9,0(r8)\r
145 #endif\r
146 \r
147         /* Call main() with argc set to 1 and argv ignored */\r
148         li      r3,1\r
149         bl      main\r
150 \r
151         /* Call exit() with the return value from main() as argument */\r
152         b       exit\r
153 \r
154         .globl  _exit\r
155 _exit:\r
156         b       _exit\r
157 \r
158 \r
159         .end\r