Subversion Repositories freemyipod

Rev

Rev 946 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
881 theseven 1
#define ASM_FILE
2
#include "global.h"
3
 
4
 
5
#ifndef SOC_S5L8701
6
#ifndef PAGETABLE_BASEADDR
7
#define PAGETABLE_BASEADDR DEFAULT_PAGETABLE_BASEADDR
8
#endif
9
#endif
10
 
11
 
12
.syntax unified
13
 
14
 
15
.extern _text_size
16
.extern _bss
17
.extern _bss_offset
18
.extern _dmabss
19
.extern _dmabss_offset
20
.extern _undef_instr_handler
21
.extern _syscall_handler
22
.extern _prefetch_abort_handler
23
.extern _data_abort_handler
24
.extern _reserved_handler
25
.extern _irq_handler
26
.extern _fiq_handler
27
 
28
 
29
.global _vectors
30
.section .vectors,"ax",%progbits
31
_vectors:
32
    b _reset_handler
33
    b _undef_instr_handler
34
    b _syscall_handler
35
    b _prefetch_abort_handler
36
    b _data_abort_handler
37
    b _reserved_handler
38
    b _irq_handler
39
    b _fiq_handler
40
 
41
_reset_handler:
42
    @ Check if we need to relocate ourselves
43
    adr r0, _vectors
44
    ldr r1, =_vectors
45
    cmp r0, r1
46
    beq _relocated
47
    @ Move around as necessary
48
    ldr r2, =(_text_size + 31)
49
    mov r2, r2,lsr#5
50
_copy:
51
    ldmia r0!, {r4-r11}
52
    stmia r1!, {r4-r11}
53
    subs r2, r2, #1
54
    bne _copy
55
_relocated:
56
#ifdef SOC_S5L8701
57
    @ Detect execution base address and remap memory at 0x0 accordingly (for IRQ vectors)
58
    tst r1, #0x20000000
59
    ldr r1, =0x38200000
60
    ldr r0, [r1]
61
    orr r0, r0, #1
62
    bicne r0, r0, #0x10000
63
    orreq r0, r0, #0x10000
64
    str r0, [r1]
65
#endif
66
 
67
    @ Flush caches
68
    mov r0, #0
69
#if CPU_ARM_ARCH < 6
70
_cleancache:
71
#if CPU_ARM_ARCH < 5
72
    mcr p15, 0, r0,c7,c10,2
73
    add r1, r0, #0x10
74
    mcr p15, 0, r1,c7,c10,2
75
    add r1, r1, #0x10
76
    mcr p15, 0, r1,c7,c10,2
77
    add r1, r1, #0x10
78
    mcr p15, 0, r1,c7,c10,2
79
    adds r0, r0, #0x04000000
80
#else
81
    mrc p15, 0, r15,c7,c10,3
82
#endif
83
    bne _cleancache
84
#else
85
    mcr p15, 0, r0,c7,c14,0
86
#endif
87
    mcr p15, 0, r0,c7,c10,4
88
    mcr p15, 0, r0,c7,c5,0
89
#if CPU_ARM_ARCH >= 6
90
    mcr p15, 0, r0,c7,c5,4
91
#endif
92
 
93
#ifdef SOC_S5L8701 
94
    @ Enable caches
95
    mrc p15, 0, r1,c1,c0
96
    orr r1, r1, #0x00001000
97
    orr r1, r1, #0x00000005
98
    mcr p15, 0, r1,c1,c0
99
#else
100
#ifdef ENABLE_MMU
101
    @ Disable caches
102
    mrc p15, 0, r3,c1,c0
103
    bic r1, r3, #0x00001000
104
    orr r3, r3, #0x00001000
105
    bic r1, r1, #0x00000005
106
    orr r3, r3, #0x00000005
107
    mcr p15, 0, r1,c1,c0
108
 
109
    @ Flush TLB
110
    mcr p15, 0, r0,c8,c7
111
 
112
    @ Disable remapping of the first 32MB (will be done by the MMU)
113
    mcr p15, 0, r0,c13,c0
114
 
115
    @ Configure MMU
116
    ldr r0, =PAGETABLE_BASEADDR
117
    ldr r1, =0xc1e
118
    ldr r2, =_vectors
119
    add r2, r2, r1
120
    mcr p15, 0, r0,c2,c0
121
    str r2, [r0], #4
122
_mmuloop:
123
    add r1, r1, #0x00100000
124
    cmp r1, #0x38000000
125
    biccs r1, r1, #0xc
126
    tst r1, #0x40000000
127
    str r1, [r0], #4
128
    beq _mmuloop
129
    mov r0, #-1
130
    mcr p15, 0, r0,c3,c0
131
 
132
    @ Enable caches
133
    mcr p15, 0, r3,c1,c0
134
#endif
135
#endif
136
 
137
    @ Jump to final execution address (after relocation)
138
    ldr pc, =_enable_irqs
139
 
140
_enable_irqs:
141
    @ Mask and clear all IRQs
142
#ifdef SOC_S5L8701 
143
    mov r1, #0x39c00000
144
    str r0, [r1,#4]
145
    str r0, [r1,#8]
146
    str r0, [r1,#0x38]
147
    str r0, [r1,#0x20]
148
    sub r0, r0, #1
149
    str r0, [r1]
150
    str r0, [r1,#0x10]
151
    str r0, [r1,#0x1c]
152
#else
153
    ldr r1, =0x38e00000
154
    add r2, r1, #0x00001000
155
    add r3, r1, #0x00002000
156
    mov r0, #-1
157
    str r0, [r1,#0x14]
158
    str r0, [r2,#0x14]
159
    str r0, [r1,#0xf00]
160
    str r0, [r2,#0xf00]
161
    str r0, [r3,#0x08]
162
    str r0, [r3,#0x0c]
163
#endif
164
 
165
    @ Set up stacks and enable IRQs
166
    msr cpsr_c, #0xd2
167
    ldr sp, =_irq_stack_top
168
    msr cpsr_c, #0xd7
169
    ldr sp, =_abort_stack_top
170
    msr cpsr_c, #0xdb
171
    ldr sp, =_abort_stack_top
172
    msr cpsr_c, #0x13
173
    ldr sp, =_stack_top
174
 
175
    @ Zero .bss section
176
    ldr r0, =_bss
177
    mov r1, #0
178
    ldr r2, =_bss_size
179
    bl memset
180
 
181
    @ Zero .dmabss section
182
    ldr r0, =_dmabss
183
    mov r1, #0
184
    ldr r2, =_dmabss_size
185
    bl memset
186
 
187
    @ Run C init code
188
    bl init
189
    @fallthrough
190
 
191
_idleloop:
192
    mcr p15, 0, r0,c7,c0,4
193
    b _idleloop
194
.ltorg
195
 
196
.global idle
197
.type idle, %function
198
idle:
199
    mcr p15, 0, r0,c7,c0,4
200
    bx lr
201
.size idle, .-idle
202
 
203
 
204
.global reset
205
.global hang
206
.type reset, %function
207
.type hang, %function
208
reset:
209
#ifdef SOC_S5L8701
210
    msr cpsr_c, #0xd3
211
    mov r0, #0x110000
212
    add r0, r0, #0xff
213
    add r1, r0, #0xa00
214
    mov r2, #0x3c800000
215
    str r1, [r2]
216
    mov r1, #0xff0
217
    str r1, [r2,#4]
218
    str r0, [r2]
219
#else
220
    msr cpsr_c, #0xd3
221
    mov r0, #0x100000
222
    mov r1, #0x3c800000
223
    str r0, [r1]
224
#endif
225
hang:
226
    msr cpsr_c, #0xd3
227
    mcr p15, 0, r0,c7,c0,4
228
    b hang
229
.size reset, .-reset
230
.size hang, .-hang