Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
710 theseven 1
@
2
@
3
@    Copyright 2010 TheSeven
4
@
5
@
6
@    This file is part of emCORE.
7
@
8
@    emCORE is free software: you can redistribute it and/or
9
@    modify it under the terms of the GNU General Public License as
10
@    published by the Free Software Foundation, either version 2 of the
11
@    License, or (at your option) any later version.
12
@
13
@    emCORE is distributed in the hope that it will be useful,
14
@    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
@    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
@    See the GNU General Public License for more details.
17
@
18
@    You should have received a copy of the GNU General Public License
19
@    along with emCORE.  If not, see <http://www.gnu.org/licenses/>.
20
@
21
@
22
 
23
 
24
.section .intvect,"ax",%progbits
25
	ldr pc, =reset_handler
26
	ldr pc, =undef_instr_handler
27
	ldr pc, =syscall_handler
28
	ldr pc, =prefetch_abort_handler
29
	ldr pc, =data_abort_handler
30
	ldr pc, =reserved_handler
31
	ldr pc, =irq_handler
32
	ldr pc, =fiq_handler
33
.ltorg
34
 
35
 
36
.section .inithead,"ax",%progbits
37
.global __start
38
__start:
39
	b	_start
40
 
41
.section .initcode,"ax",%progbits
42
.global _start
43
_start:
928 user890104 44
	mrc	p15, 0, r0,c1,c0
45
	bic	r0, r0, #0x200
46
	orr	r0, r0, #0x100
47
	mcr	p15, 0, r0,c1,c0
48
	mov	r0, #0x7fffffff
49
	mcr	p15, 0, r0,c3,c0
50
	mov	r0, #0x22000000
51
	orr	r1, r0, #0x00000100
52
	orr	r0, r0, #0x0003c000
53
	orr	r1, r1, #0x000000fe
54
	add	r2, r0, #0x200
55
	mov	r3, #0
56
	str	r1, [r0], #4
57
.mmuloop1:
58
	str	r3, [r0], #4
59
	cmp	r0, r2
60
	bne	.mmuloop1
61
	add	r0, r0, #0x080
62
	add	r2, r0, #0x580
63
.mmuloop2:
64
	str	r3, [r0], #4
65
	cmp	r0, r2
66
	bne	.mmuloop2
67
	add	r0, r0, #0x4
68
	add	r2, r0, #0x7c
69
.mmuloop3:
70
	str	r3, [r0], #4
71
	cmp	r0, r2
72
	bne	.mmuloop3
73
	add	r0, r0, #0x4
74
	add	r2, r0, #0x500
75
	add	r2, r2, #0x7c
76
.mmuloop4:
77
	str	r3, [r0], #4
78
	cmp	r0, r2
79
	bne	.mmuloop4
80
	add	r0, r0, #0x200
81
	add	r2, r0, #0x3000
82
.mmuloop5:
83
	str	r3, [r0], #4
84
	cmp	r0, r2
85
	bne	.mmuloop5
86
	mrc	p15, 0, r0,c1,c0
87
	orr	r0, r0, #5
88
	orr	r0, r0, #0x400000
89
	mcr	p15, 0, r0,c1,c0
710 theseven 90
	ldr	r0, =_sramsource
91
	ldr	r1, =_sramstart
92
	ldr	r2, =_sramend
93
.copysram:
94
	cmp	r2, r1
95
	ldrhi	r3, [r0], #4
96
	strhi	r3, [r1], #4
97
	bhi	.copysram
98
	ldr	r0, =_sdramsource
99
	ldr	r1, =_sdramstart
100
	ldr	r2, =_sdramend
101
.copysdram:
102
	cmp	r2, r1
103
	ldrhi	r3, [r0], #4
104
	strhi	r3, [r1], #4
105
	bhi	.copysdram
106
	ldr	r0, =_ibssstart
107
	ldr	r1, =_ibssend
108
	mov	r2, #0
109
.clearibss:
110
	cmp	r1, r0
111
	strhi	r2, [r0], #4
112
	bhi	.clearibss
113
	ldr	r0, =_bssstart
114
	ldr	r1, =_bssend
115
.clearbss:
116
	cmp	r1, r0
117
	strhi	r2, [r0], #4
118
	bhi	.clearbss
119
	ldr	r1, =0x38200000
120
	ldr	r0, [r1]
121
	orr	r0, r0, #1
122
	bic	r0, r0, #0x10000
123
	str	r0, [r1]
124
	mov	r0, #0
125
	mcr	p15, 0, r0,c7,c5,0
126
	add	r1, r1, #0x00c00000
127
	add	r2, r1, #0x00001000
128
	add	r3, r1, #0x00002000
129
	sub	r4, r0, #1
130
	str	r4, [r1,#0x14]
131
	str	r4, [r2,#0x14]
132
	str	r4, [r1,#0xf00]
133
	str	r4, [r2,#0xf00]
134
	str	r4, [r3,#0x08]
135
	str	r4, [r3,#0x0c]
136
	str	r0, [r1,#0x14]
137
	str	r0, [r2,#0x14]
138
	mov	r0, #0
139
	ldr	r1, =0x3c500000
140
	str	r0, [r1,#0x48]
141
	str	r0, [r1,#0x4c]
142
	msr	cpsr_c, #0xd2
143
	ldr	sp, =_irqstackend
144
	msr	cpsr_c, #0xd7
145
	ldr	sp, =_abortstackend
146
	msr	cpsr_c, #0xdb
147
	ldr	sp, =_abortstackend
148
	msr	cpsr_c, #0x1f
149
	ldr	sp, =_abortstackend
150
	bl	init
151
	bl	yield
152
	mov	r0, #0
153
	ldr	pc, =idleloop
154
.ltorg
155
 
156
 
157
.section .icode, "ax", %progbits
158
.align 2
159
idleloop:
160
	mcr	p15, 0, r0,c7,c0,4
161
	b	idleloop
162
 
163
.global reset
164
.global hang
165
.type reset, %function
166
.type hang, %function
167
reset:
168
	msr	cpsr_c, #0xd3
169
	mov	r0, #0x100000
170
	mov	r1, #0x3c800000
171
	str	r0, [r1]
172
hang:
173
	msr	cpsr_c, #0xd3
174
	mcr	p15, 0, r0,c7,c0,4
175
	b	hang
176
.size reset, .-reset
177
.size hang, .-hang
178
 
179
.type reset_handler, %function
180
reset_handler:
181
	stmfd	sp, {r10-r12}
182
	mov	r10, sp
183
	mov	r11, lr
184
	mrs	r12, cpsr
185
	msr	cpsr_c, #0xd7
186
	sub	sp, sp, #0x44
187
	stmia	sp!, {r0-r9}
188
	sub	r0, r10, #0xc
189
	ldmia	r0, {r0-r2}
190
	mov	r3, r10
191
	mov	r4, r11
192
	mov	r5, r11
193
	mov	r6, r12
194
	stmia	sp!, {r0-r6}
195
	sub	sp, sp, #0x44
196
	mov	r0, #0
197
	adr	r1, reset_text
198
	mov	r2, r11
759 theseven 199
	b	panicf
710 theseven 200
.size reset_handler, .-reset_handler
201
 
202
.global undef_instr_handler
203
.type undef_instr_handler, %function
204
undef_instr_handler:
205
	sub	sp, sp, #0x44
206
	stmia	sp!, {r0-r12}
207
	sub	r2, lr, #4
208
	mrs	r3, spsr
209
	mrs	r4, cpsr
210
	orr	r0, r3, #0xc0
211
	msr	cpsr_c, r0
212
	mov	r0, sp
213
	mov	r1, lr
214
	msr	cpsr_c, r4
215
	stmia	sp!, {r0-r3}
216
	sub	sp, sp, #0x44
217
	mov	r0, #0
218
	adr	r1, undef_instr_text
219
	ldr	r3, [r2]
220
	b	panicf
221
.size undef_instr_handler, .-undef_instr_handler
222
 
223
.type prefetch_abort_handler, %function
224
prefetch_abort_handler:
225
	sub	sp, sp, #0x44
226
	stmia	sp!, {r0-r12}
227
	sub	r2, lr, #4
228
	mrs	r3, spsr
229
	mrs	r4, cpsr
230
	orr	r0, r3, #0xc0
231
	msr	cpsr_c, r0
232
	mov	r0, sp
233
	mov	r1, lr
234
	msr	cpsr_c, r4
235
	stmia	sp!, {r0-r3}
236
	sub	sp, sp, #0x44
237
	mov	r0, #0
238
	adr	r1, prefetch_abort_text
239
	mrc	p15, 0, r3,c5,c0,1
240
	mov	r4, r3,lsr#4
241
	and	r4, r4, #0xf
242
	and	r5, r3, #0xf
243
	stmfd	sp!, {r4-r5}
244
	b	panicf
245
.size prefetch_abort_handler, .-prefetch_abort_handler
246
 
247
.type data_abort_handler, %function
248
data_abort_handler:
249
	sub	sp, sp, #0x44
250
	stmia	sp!, {r0-r12}
251
	sub	r2, lr, #8
252
	mrs	r3, spsr
253
	mrs	r4, cpsr
254
	orr	r0, r3, #0xc0
255
	msr	cpsr_c, r0
256
	mov	r0, sp
257
	mov	r1, lr
258
	msr	cpsr_c, r4
259
	stmia	sp!, {r0-r3}
260
	sub	sp, sp, #0x44
261
	mov	r0, #0
262
	adr	r1, data_abort_text
263
	mrc	p15, 0, r3,c5,c0
264
	mov	r4, r3,lsr#4
265
	and	r4, r4, #0xf
266
	and	r5, r3, #0xf
267
	mrc	p15, 0, r6,c6,c0
268
	stmfd	sp!, {r4-r6}
269
	b	panicf
270
.size data_abort_handler, .-data_abort_handler
271
 
272
.type reserved_handler, %function
273
reserved_handler:
274
	stmfd	sp, {r10-r12}
275
	mov	r10, sp
276
	mov	r11, lr
277
	mrs	r12, cpsr
278
	msr	cpsr_c, #0xd7
279
	sub	sp, sp, #0x44
280
	stmia	sp!, {r0-r9}
281
	sub	r0, r10, #0xc
282
	ldmia	r0, {r0-r2}
283
	mov	r3, r10
284
	mov	r4, r11
285
	mov	r5, r11
286
	mov	r6, r12
287
	stmia	sp!, {r0-r6}
288
	sub	sp, sp, #0x44
289
	mov	r0, #0
290
	adr	r1, reserved_text
291
	mov	r2, r11
759 theseven 292
	b	panicf
710 theseven 293
.size reserved_handler, .-reserved_handler
294
 
295
.type fiq_handler, %function
296
fiq_handler:
297
	mov	r0, #2
298
	adr	r1, fiq_text
299
	b	panic
300
.size fiq_handler, .-fiq_handler
301
 
302
prefetch_abort_text:
303
	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0"
304
 
305
reset_text:
306
	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0"
307
 
308
undef_instr_text:
309
	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0"
310
 
311
data_abort_text:
312
	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0"
313
 
314
fiq_text:
315
	.ascii	"Unhandled FIQ!\0"
316
 
317
reserved_text:
318
	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0"
319
 
320
syscall_text:
321
	.ascii	"Unhandled syscall!\0"
322
 
323
 
324
.section .icode.usec_timer, "ax", %progbits
325
.align 2
326
.global read_native_timer
327
.type read_native_timer, %function
328
read_native_timer:
329
	ldr	r0, val_3c700000
330
	ldr	r1, [r0,#0x80]
331
	ldr	r0, [r0,#0x84]
332
	bx	lr
333
.size read_native_timer, .-read_native_timer
334
 
335
.global read_usec_timer
336
.type read_usec_timer, %function
337
read_usec_timer:
338
	ldr	r0, val_3c700000
339
	ldr	r1, [r0,#0x80]
340
	ldr	r0, [r0,#0x84]
904 user890104 341
	mov	r0, r0,lsr#4
342
	orr	r0, r0, r1,lsl#28
710 theseven 343
	add	r0, r0, r0,asr#2
344
	add	r0, r0, r0,asr#6
345
	bx	lr
346
.size read_usec_timer, .-read_usec_timer
347
 
348
val_3c700000:
349
	.word	0x3c700000