Some small cleanups and code for testing
[kugel-rb.git] / firmware / target / arm / tms320dm320 / crt0.S
blob09f936e8080b8567e02907618f6c8b49bb0636f8
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2002 by Linus Nielsen Feltzing
11  *
12  * Arm bootloader and startup code based on startup.s from the iPodLinux loader
13  *
14  * Copyright (c) 2003, Daniel Palffy (dpalffy (at) rainstorm.org)
15  * Copyright (c) 2005, Bernard Leach <leachbj@bouncycastle.org>
16  *
17  * All files in this archive are subject to the GNU General Public License.
18  * See the file COPYING in the source tree root for full license agreement.
19  *
20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21  * KIND, either express or implied.
22  *
23  ****************************************************************************/
24 #include "config.h"
25 #include "cpu.h"
27     .section .init.text,"ax",%progbits
29     .global    start
30 start:
31     .equ    INTC_IRQ0,    0x00030508
32     .equ    INTC_IRQ1,    0x0003050A
33     .equ    INTC_IRQ2,    0x0003050C
34     .equ    INTC_FIQ0,    0x00030500
35     .equ    INTC_FIQ1,    0x00030502
36     .equ    INTC_FIQ2,    0x00030504
37     .equ    INTC_EINT0,   0x00030528
38     .equ    INTC_EINT1,   0x0003052A
39     .equ    INTC_EINT2,   0x0003052C
40     .equ    INTC_FISEL0,  0x00030520
41     .equ    INTC_FISEL1,  0x00030522
42     .equ    INTC_FISEL2,  0x00030524
43     .equ    INTC_MASK,    0xFFFFFFFF
45     msr    cpsr, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
47     /* Copy exception handler code to address 0 */
48     ldr    r2, =_vectorsstart
49     ldr    r3, =_vectorsend
50     ldr    r4, =_vectorscopy
52     cmp    r3, r2
53     ldrhi  r5, [r4], #4
54     strhi  r5, [r2], #4
55     bhi    1b
57     /* Disable data and instruction cache, high vectors (at 0xffff0000 instead of 0x00000000) */
58         mrc     p15, 0, r0, c1, c0, 0
59         /* clear bits 13, 9:8 (--VI --RS) */
60         bic     r0, r0, #0x00003300
61         /* clear bits 7, 2:0 (B--- -C-M) */
62         bic     r0, r0, #0x00000085
63         /* make sure bit 2 (A) Align is set */
64         orr     r0, r0, #0x00000002
65         mcr     p15, 0, r0, c1, c0, 0
67 #if 0
68         /* mask interrupts */
69         ldr    r1, =INTC_MASK
70     ldr    r2, =INTC_IRQ0
71     strh   r1, [r2]
72     ldr    r2, =INTC_IRQ1
73     strh   r1, [r2]
74     ldr    r2, =INTC_IRQ2
75     strh   r1, [r2]
76     ldr    r2, =INTC_FIQ0
77     strh   r1, [r2]
78     ldr    r2, =INTC_FIQ1
79     strh   r1, [r2]
80     ldr    r2, =INTC_FIQ2
81     strh   r1, [r2]
83     mov    r1, #0
84     ldr    r2, =INTC_EINT0
85     strh   r1, [r2]
86     ldr    r2, =INTC_EINT1
87     strh   r1, [r2]
88     ldr    r2, =INTC_EINT2
89     strh   r1, [r2]
90     ldr    r2, =INTC_FISEL0
91     strh   r1, [r2]
92     ldr    r2, =INTC_FISEL1
93     strh   r1, [r2]
94     ldr    r2, =INTC_FISEL2
95     strh   r1, [r2]
96 #endif
98 #if !defined(BOOTLOADER) && !defined(STUB)
99     /* Zero out IBSS */
100     ldr    r2, =_iedata
101     ldr    r3, =_iend
102     mov    r4, #0
104     cmp    r3, r2
105     strhi  r4, [r2], #4
106     bhi    1b
108     /* Copy the IRAM */
109     ldr    r2, =_iramcopy
110     ldr    r3, =_iramstart
111     ldr    r4, =_iramend
113     cmp    r4, r3
114     ldrhi  r5, [r2], #4
115     strhi  r5, [r3], #4
116     bhi    1b
117 #endif /* !BOOTLOADER,!STUB */
119     /* Initialise bss section to zero */
120     ldr    r2, =_edata
121     ldr    r3, =_end
122     mov    r4, #0
124     cmp    r3, r2
125     strhi  r4, [r2], #4
126     bhi    1b
128     /* Load stack munge value */
129     ldr    r4, =0xdeadbeef
131     /* Set up some stack and munge it with 0xdeadbeef */
132     ldr    r2, =stackbegin
133     ldr    r3, =stackend
135     cmp    r3, r2
136     strhi  r4, [r2], #4
137     bhi    1b
139          /* Set up stack for IRQ mode */
140     msr    cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */
141     ldr    sp, =irq_stack
142     /* Set up stack for FIQ mode */
143     msr    cpsr_c, #0xd1 /* IRQ/FIQ disabled */
144     ldr    sp, =fiq_stack
146     /* Let abort and undefined modes use IRQ stack */
147     msr    cpsr_c, #0xd7 /* IRQ/FIQ disabled */
148     ldr    sp, =irq_stack
149     msr    cpsr_c, #0xdb /* IRQ/FIQ disabled */
150     ldr    sp, =irq_stack
152     /* Switch to supervisor mode (no IRQ) */
153     msr    cpsr_c, #0xd3
154     ldr    sp, =stackend
155     
156 #ifdef BOOTLOADER
157     /* get the high part of our execute address */
158     ldr    r2, =0xffffff00
159     and    r4, pc, r2
161     /* Copy bootloader to safe area - 0x01900000 */
162     mov    r5, #0x01900000
163     ldr    r6, = _dataend
164     sub    r0, r6, r5       /* length of loader */
165     add    r0, r4, r0     /* r0 points to start of loader */
167     cmp    r5, r6
168     ldrcc  r2, [r4], #4
169     strcc  r2, [r5], #4
170     bcc    1b
172     ldr    pc, =start_loc    /* jump to the relocated start_loc:  */
174 #endif
176 start_loc:
177      bl main
178     /* main() should never return */
180 /* Exception handlers. Will be copied to address 0 after memory remapping */
181     .section .vectors,"aw"
182     ldr    pc, [pc, #24]
183     ldr    pc, [pc, #24]
184     ldr    pc, [pc, #24]
185     ldr    pc, [pc, #24]
186     ldr    pc, [pc, #24]
187     ldr    pc, [pc, #24]
188     ldr    pc, [pc, #24]
189     ldr    pc, [pc, #24]
191     /* Exception vectors */
192     .global vectors
193 vectors:
194     .word  start 
195     .word  undef_instr_handler
196     .word  software_int_handler
197     .word  prefetch_abort_handler
198     .word  data_abort_handler
199     .word  reserved_handler
200     .word  irq_handler
201     .word  fiq_handler
203     .text
205 #if !defined(STUB)
206     .global irq
207     .global fiq
208     .global UIE
209 #endif
211 /* All illegal exceptions call into UIE with exception address as first
212    parameter. This is calculated differently depending on which exception
213    we're in. Second parameter is exception number, used for a string lookup
214    in UIE.
215  */
216 undef_instr_handler:
217     mov    r0, lr
218     mov    r1, #0
219     b      UIE
221 /* We run supervisor mode most of the time, and should never see a software
222    exception being thrown. Perhaps make it illegal and call UIE?
223  */
224 software_int_handler:
225 reserved_handler:
226     movs   pc, lr
228 prefetch_abort_handler:
229     sub    r0, lr, #4
230     mov    r1, #1
231     b      UIE
233 data_abort_handler:
234     sub    r0, lr, #8 
235     mov    r1, #2
236     b      UIE
238 #if defined(STUB) || defined(BOOTLOADER)
239 UIE:
240     b UIE
241 #endif
243 /* Align stacks to cache line boundary */
244     .balign 16
246 /* 256 words of IRQ stack */
247     .space 256*4
248 irq_stack:
250 /* 256 words of FIQ stack */
251     .space 256*4
252 fiq_stack: