]> rtime.felk.cvut.cz Git - arc.git/blob - arch/ppc/crt0.sx
Updated after mcaltest run
[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(CFG_MPC560X) && !defined(CFG_MPC5606B)\r
99         li r12,384 # loop counter to get all of SRAM;\r
100         /* 48k/4 bytes/32 GPRs = 384, only 48k ram for MPC5606s */\r
101 #else\r
102         li r12,640 # loop counter to get all of SRAM;\r
103         /* 80k/4 bytes/32 GPRs = 640 */\r
104 #endif\r
105         mtctr r12\r
106 \r
107 init_ram_loop:\r
108         stmw r0,0(r11) # write all 32 GPRs to SRAM\r
109         addi r11,r11,128 # inc the ram ptr; 32 GPRs * 4 bytes = 128\r
110         bdnz init_ram_loop # loop for 80k of SRAM\r
111 \r
112 \r
113         // Copy initialized data from ROM to RAM\r
114         LOAD_ADDR_32(3,__DATA_ROM)\r
115         LOAD_ADDR_32(4,__DATA_RAM)\r
116         LOAD_ADDR_32(5,__DATA_END)\r
117         \r
118         cmplw   r3,r4\r
119         beq             skip_data\r
120         cmplw   r4,r5\r
121         beq             skip_data\r
122         subi    r3,r3,1\r
123         subi    r4,r4,1\r
124 copy_data:\r
125         lbzu    r6,1(r3)\r
126         stbu    r6,1(r4)\r
127         cmplw   r4,r5\r
128         bne+    copy_data\r
129 skip_data:\r
130 \r
131         /* Clear uninitialized data( holds both bss and sbss ) */\r
132         LOAD_ADDR_32(3,__BSS_START)\r
133         LOAD_ADDR_32(4,__BSS_END)\r
134         cmplw   r3,r4\r
135         beq             skip_bss\r
136         li              r0,0\r
137         subi    r3,r3,1\r
138 copy_bss:\r
139         stbu    r0,1(r3)\r
140         cmplw   r3,r4\r
141         bne+    copy_bss\r
142 skip_bss:\r
143 \r
144 /* Restore winIDEA terminal connected status */\r
145 #if defined(USE_TTY_WINIDEA)\r
146         stb             r9,0(r8)\r
147 #endif\r
148 \r
149         /* Call main() with argc set to 1 and argv ignored */\r
150         li      r3,1\r
151         bl      main\r
152 \r
153         /* Call exit() with the return value from main() as argument */\r
154         b       exit\r
155 \r
156         .globl  _exit\r
157 _exit:\r
158         b       _exit\r
159 \r
160 \r
161         .end\r