Subversion Repositories freemyipod

Rev

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