summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8700/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8700/crt0.S')
-rw-r--r--firmware/target/arm/s5l8700/crt0.S117
1 files changed, 117 insertions, 0 deletions
diff --git a/firmware/target/arm/s5l8700/crt0.S b/firmware/target/arm/s5l8700/crt0.S
new file mode 100644
index 0000000000..3ecabdeaef
--- /dev/null
+++ b/firmware/target/arm/s5l8700/crt0.S
@@ -0,0 +1,117 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2008 by Marcoen Hirschberg
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#include "config.h"
20#include "cpu.h"
21
22 .section .init.text,"ax",%progbits
23
24 .global start
25start:
26 /* Exception vectors */
27 b newstart
28 b undef_instr_handler
29 b software_int_handler
30 b prefetch_abort_handler
31 b data_abort_handler
32 b reserved_handler
33 b irq_handler
34 b fiq_handler
35 .word 0x43554644 /* DFUC */
36
37newstart:
38#if 0
39 msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
40
41 /* Initialise bss section to zero */
42 ldr r2, =_edata
43 ldr r3, =_end
44 mov r4, #0
451:
46 cmp r3, r2
47 strhi r4, [r2], #4
48 bhi 1b
49
50 /* Set up some stack and munge it with 0xdeadbeef */
51 ldr sp, =stackend
52 ldr r2, =stackbegin
53 ldr r3, =0xdeadbeef
541:
55 cmp sp, r2
56 strhi r3, [r2], #4
57 bhi 1b
58
59 /* Set up stack for IRQ mode */
60 msr cpsr_c, #0xd2
61 ldr sp, =irq_stack
62
63 /* Set up stack for FIQ mode */
64 msr cpsr_c, #0xd1
65 ldr sp, =fiq_stack
66
67 /* Let abort and undefined modes use IRQ stack */
68 msr cpsr_c, #0xd7
69 ldr sp, =irq_stack
70 msr cpsr_c, #0xdb
71 ldr sp, =irq_stack
72
73 /* Switch back to supervisor mode */
74 msr cpsr_c, #0xd3
75#endif
76 bl main
77
78
79 .text
80/* .global UIE*/
81
82/* All illegal exceptions call into UIE with exception address as first
83 * parameter. This is calculated differently depending on which exception
84 * we're in. Second parameter is exception number, used for a string lookup
85 * in UIE. */
86undef_instr_handler:
87 mov r0, lr
88 mov r1, #0
89 b UIE
90
91/* We run supervisor mode most of the time, and should never see a software
92 * exception being thrown. Perhaps make it illegal and call UIE? */
93software_int_handler:
94reserved_handler:
95 movs pc, lr
96
97prefetch_abort_handler:
98 sub r0, lr, #4
99 mov r1, #1
100 b UIE
101
102data_abort_handler:
103 sub r0, lr, #8
104 mov r1, #2
105 b UIE
106
107/* 256 words of IRQ stack */
108 .space 256*4
109irq_stack:
110
111/* 256 words of FIQ stack */
112 .space 256*4
113fiq_stack:
114
115end:
116 /*.word 0xA5A5A5A5
117 .word 0x5A5A5A5A*/