]> rtime.felk.cvut.cz Git - arc.git/blob - arch/ppc/crt0.sx
Copied CodeWarrior VLE support from applications branch
[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__)\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 #else\r
39 .section .text\r
40 #endif\r
41         .align          4\r
42 \r
43         .globl  _start\r
44         .type   _start,@function\r
45 \r
46         // Good information about the E500 is freescale doc: E500ABIUG.pdf\r
47         \r
48 #if 0\r
49 .global _redled\r
50 _redled:\r
51         // mpc5567qrtech: light up led K2 \r
52         li r0, 0x0202\r
53         lis r3, 0xC3F9013A@h\r
54         ori r3, r3, 0xC3F90130@l\r
55         stw r0, 8(r3)\r
56         b _exit\r
57 #endif\r
58 \r
59 __start:\r
60 _start:\r
61         // Set up the reserved registers in EABI: r1,r2 and r13\r
62 \r
63         // r1, stack pointer\r
64         LOAD_ADDR_32(1,__SP_INIT)\r
65         \r
66         // r13, base of .sdata\r
67         LOAD_ADDR_32(13,_SDA_BASE_)\r
68 \r
69         // r2, base of .sdata2 and .sbss2\r
70         LOAD_ADDR_32(13,_SDA2_BASE_)\r
71 \r
72         // make space for initial backchain..\r
73         subi    r1,r1,16\r
74 \r
75 /* Store winIDEA terminal connected status */\r
76 #if defined(USE_TTY_WINIDEA)\r
77         lis     r3,g_TConn@h\r
78         ori     r3,r3,g_TConn@l\r
79         lbz r4,0(r3)\r
80 #endif\r
81 \r
82         /*  Clear all SRAM */\r
83 init_RAM:\r
84         LOAD_ADDR_32(11,0x40000000)\r
85         li r12,640 # loop counter to get all of SRAM;\r
86         /* 80k/4 bytes/32 GPRs = 640 */\r
87         mtctr r12\r
88 \r
89 init_ram_loop:\r
90         stmw r0,0(r11) # write all 32 GPRs to SRAM\r
91         addi r11,r11,128 # inc the ram ptr; 32 GPRs * 4 bytes = 128\r
92         bdnz init_ram_loop # loop for 80k of SRAM\r
93 \r
94 /* Restore winIDEA terminal connected status */\r
95 #if defined(USE_TTY_WINIDEA)\r
96         stb             r4,0(r3)\r
97 #endif\r
98 \r
99         // Copy initialized data from ROM to RAM\r
100         LOAD_ADDR_32(3,__DATA_ROM)\r
101         LOAD_ADDR_32(4,__DATA_RAM)\r
102         LOAD_ADDR_32(5,__DATA_END)\r
103         \r
104         cmplw   r3,r4\r
105         beq             skip_data\r
106         cmplw   r4,r5\r
107         beq             skip_data\r
108         subi    r3,r3,1\r
109         subi    r4,r4,1\r
110 copy_data:\r
111         lbzu    r6,1(r3)\r
112         stbu    r6,1(r4)\r
113         cmplw   r4,r5\r
114         bne+    copy_data\r
115 skip_data:\r
116 \r
117         /* Clear uninitialized data( holds both bss and sbss ) */\r
118         LOAD_ADDR_32(3,__BSS_START)\r
119         LOAD_ADDR_32(4,__BSS_END)\r
120         cmplw   r3,r4\r
121         beq             skip_bss\r
122         li              r0,0\r
123         subi    r3,r3,1\r
124 copy_bss:\r
125         stbu    r0,1(r3)\r
126         cmplw   r3,r4\r
127         bne+    copy_bss\r
128 skip_bss:\r
129         /* Call main() with argc set to 1 and argv ignored */\r
130         li      r3,1\r
131         bl      main\r
132 \r
133         /* Call exit() with the return value from main() as argument */\r
134         b       exit\r
135 \r
136         .globl  _exit\r
137 _exit:\r
138         b       _exit\r
139 \r
140 \r
141         .end\r