Subversion Repositories freemyipod

Rev

Rev 759 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
273 theseven 1
@
2
@
3
@    Copyright 2010 TheSeven
4
@
5
@
427 farthen 6
@    This file is part of emCORE.
273 theseven 7
@
427 farthen 8
@    emCORE is free software: you can redistribute it and/or
273 theseven 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
@
427 farthen 13
@    emCORE is distributed in the hope that it will be useful,
273 theseven 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
427 farthen 19
@    along with emCORE.  If not, see <http://www.gnu.org/licenses/>.
273 theseven 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:
701 theseven 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
700 theseven 50
	mov	r0, #0x22000000
701 theseven 51
	orr	r1, r0, #0x00000100
700 theseven 52
	orr	r0, r0, #0x0003c000
701 theseven 53
	orr	r1, r1, #0x000000fe
700 theseven 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, #0x100
62
	add	r2, r0, #0x500
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
273 theseven 86
	mrc	p15, 0, r0,c1,c0
312 theseven 87
	orr	r0, r0, #5
273 theseven 88
	mcr	p15, 0, r0,c1,c0
89
	ldr	r0, =_sramsource
90
	ldr	r1, =_sramstart
91
	ldr	r2, =_sramend
92
.copysram:
93
	cmp	r2, r1
94
	ldrhi	r3, [r0], #4
95
	strhi	r3, [r1], #4
96
	bhi	.copysram
97
	ldr	r0, =_sdramsource
98
	ldr	r1, =_sdramstart
99
	ldr	r2, =_sdramend
100
.copysdram:
101
	cmp	r2, r1
102
	ldrhi	r3, [r0], #4
103
	strhi	r3, [r1], #4
104
	bhi	.copysdram
105
	ldr	r0, =_ibssstart
106
	ldr	r1, =_ibssend
437 theseven 107
	mov	r2, #0
273 theseven 108
.clearibss:
109
	cmp	r1, r0
110
	strhi	r2, [r0], #4
111
	bhi	.clearibss
112
	ldr	r0, =_bssstart
113
	ldr	r1, =_bssend
114
.clearbss:
115
	cmp	r1, r0
116
	strhi	r2, [r0], #4
117
	bhi	.clearbss
118
	ldr	r1, =0x38200000
119
	ldr	r0, [r1]
120
	orr	r0, r0, #1
121
	bic	r0, r0, #0x10000
122
	str	r0, [r1]
123
.cleancache:
124
	mrc	p15, 0, r15,c7,c10,3
125
	bne	.cleancache
126
	mov	r0, #0
127
	mcr	p15, 0, r0,c7,c10,4
128
	mcr	p15, 0, r0,c7,c5,0
129
	ldr	r1, =0x38200000
130
	ldr	r0, [r1]
131
	orr	r0, r0, #1
132
	bic	r0, r0, #0x10000
133
	str	r0, [r1]
134
	mov	r0, #0
135
	mcr	p15, 0, r0,c7,c5,0
136
	add	r1, r1, #0x00c00000
137
	add	r2, r1, #0x00001000
138
	add	r3, r1, #0x00002000
139
	sub	r4, r0, #1
140
	str	r4, [r1,#0x14]
141
	str	r4, [r2,#0x14]
142
	str	r4, [r1,#0xf00]
143
	str	r4, [r2,#0xf00]
144
	str	r4, [r3,#0x08]
145
	str	r4, [r3,#0x0c]
146
	str	r0, [r1,#0x14]
147
	str	r0, [r2,#0x14]
148
	msr	cpsr_c, #0xd2
149
	ldr	sp, =_irqstackend
150
	msr	cpsr_c, #0xd7
151
	ldr	sp, =_abortstackend
152
	msr	cpsr_c, #0xdb
153
	ldr	sp, =_abortstackend
154
	msr	cpsr_c, #0x1f
436 theseven 155
	ldr	sp, =_abortstackend
273 theseven 156
	bl	init
593 theseven 157
	bl	yield
273 theseven 158
	mov	r0, #0
159
	ldr	pc, =idleloop
160
.ltorg
161
 
162
 
163
.section .icode, "ax", %progbits
164
.align 2
165
idleloop:
166
	mcr	p15, 0, r0,c7,c0,4
167
	b	idleloop
168
 
169
.global reset
170
.global hang
171
.type reset, %function
172
.type hang, %function
173
reset:
174
	msr	cpsr_c, #0xd3
175
	mov	r0, #0x100000
176
	mov	r1, #0x3c800000
177
	str	r0, [r1]
178
hang:
179
	msr	cpsr_c, #0xd3
283 theseven 180
	mov	r0, #0
273 theseven 181
	mcr	p15, 0, r0,c7,c0,4
182
	b	hang
183
.size reset, .-reset
184
.size hang, .-hang
185
 
186
.type reset_handler, %function
187
reset_handler:
702 theseven 188
	stmfd	sp, {r10-r12}
189
	mov	r10, sp
190
	mov	r11, lr
191
	mrs	r12, cpsr
192
	msr	cpsr_c, #0xd7
193
	sub	sp, sp, #0x44
194
	stmia	sp!, {r0-r9}
195
	sub	r0, r10, #0xc
196
	ldmia	r0, {r0-r2}
197
	mov	r3, r10
198
	mov	r4, r11
199
	mov	r5, r11
200
	mov	r6, r12
201
	stmia	sp!, {r0-r6}
202
	sub	sp, sp, #0x44
273 theseven 203
	mov	r0, #0
204
	adr	r1, reset_text
702 theseven 205
	mov	r2, r11
759 theseven 206
	b	panicf
273 theseven 207
.size reset_handler, .-reset_handler
208
 
704 theseven 209
.global undef_instr_handler
273 theseven 210
.type undef_instr_handler, %function
211
undef_instr_handler:
702 theseven 212
	sub	sp, sp, #0x44
213
	stmia	sp!, {r0-r12}
214
	sub	r2, lr, #4
215
	mrs	r3, spsr
216
	mrs	r4, cpsr
217
	orr	r0, r3, #0xc0
218
	msr	cpsr_c, r0
219
	mov	r0, sp
220
	mov	r1, lr
221
	msr	cpsr_c, r4
222
	stmia	sp!, {r0-r3}
223
	sub	sp, sp, #0x44
273 theseven 224
	mov	r0, #0
225
	adr	r1, undef_instr_text
702 theseven 226
	ldr	r3, [r2]
273 theseven 227
	b	panicf
228
.size undef_instr_handler, .-undef_instr_handler
229
 
230
.type prefetch_abort_handler, %function
231
prefetch_abort_handler:
702 theseven 232
	sub	sp, sp, #0x44
233
	stmia	sp!, {r0-r12}
234
	sub	r2, lr, #4
235
	mrs	r3, spsr
236
	mrs	r4, cpsr
237
	orr	r0, r3, #0xc0
238
	msr	cpsr_c, r0
239
	mov	r0, sp
240
	mov	r1, lr
241
	msr	cpsr_c, r4
242
	stmia	sp!, {r0-r3}
243
	sub	sp, sp, #0x44
273 theseven 244
	mov	r0, #0
245
	adr	r1, prefetch_abort_text
702 theseven 246
	mrc	p15, 0, r3,c5,c0
247
	mov	r4, r3,lsr#4
248
	and	r4, r4, #0xf
249
	and	r5, r3, #0xf
250
	stmfd	sp!, {r4-r5}
273 theseven 251
	b	panicf
252
.size prefetch_abort_handler, .-prefetch_abort_handler
253
 
254
.type data_abort_handler, %function
255
data_abort_handler:
702 theseven 256
	sub	sp, sp, #0x44
257
	stmia	sp!, {r0-r12}
258
	sub	r2, lr, #8
259
	mrs	r3, spsr
260
	mrs	r4, cpsr
261
	orr	r0, r3, #0xc0
262
	msr	cpsr_c, r0
263
	mov	r0, sp
264
	mov	r1, lr
265
	msr	cpsr_c, r4
266
	stmia	sp!, {r0-r3}
267
	sub	sp, sp, #0x44
273 theseven 268
	mov	r0, #0
269
	adr	r1, data_abort_text
702 theseven 270
	mrc	p15, 0, r3,c5,c0
271
	mov	r4, r3,lsr#4
272
	and	r4, r4, #0xf
273
	and	r5, r3, #0xf
274
	mrc	p15, 0, r6,c6,c0
275
	stmfd	sp!, {r4-r6}
273 theseven 276
	b	panicf
277
.size data_abort_handler, .-data_abort_handler
278
 
279
.type reserved_handler, %function
280
reserved_handler:
702 theseven 281
	stmfd	sp, {r10-r12}
282
	mov	r10, sp
283
	mov	r11, lr
284
	mrs	r12, cpsr
285
	msr	cpsr_c, #0xd7
286
	sub	sp, sp, #0x44
287
	stmia	sp!, {r0-r9}
288
	sub	r0, r10, #0xc
289
	ldmia	r0, {r0-r2}
290
	mov	r3, r10
291
	mov	r4, r11
292
	mov	r5, r11
293
	mov	r6, r12
294
	stmia	sp!, {r0-r6}
295
	sub	sp, sp, #0x44
273 theseven 296
	mov	r0, #0
297
	adr	r1, reserved_text
702 theseven 298
	mov	r2, r11
759 theseven 299
	b	panicf
273 theseven 300
.size reserved_handler, .-reserved_handler
301
 
302
.type fiq_handler, %function
303
fiq_handler:
304
	mov	r0, #2
305
	adr	r1, fiq_text
306
	b	panic
307
.size fiq_handler, .-fiq_handler
308
 
702 theseven 309
prefetch_abort_text:
310
	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0"
311
 
312
reset_text:
313
	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0"
314
 
273 theseven 315
undef_instr_text:
702 theseven 316
	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0"
273 theseven 317
 
318
data_abort_text:
702 theseven 319
	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0"
273 theseven 320
 
321
fiq_text:
322
	.ascii	"Unhandled FIQ!\0"
323
 
702 theseven 324
reserved_text:
325
	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0"
326
 
273 theseven 327
syscall_text:
328
	.ascii	"Unhandled syscall!\0"
329
 
330
 
331
.section .icode.usec_timer, "ax", %progbits
332
.align 2
333
.global read_native_timer
334
.type read_native_timer, %function
335
read_native_timer:
336
	ldr	r0, val_3c700000
337
	ldr	r1, [r0,#0xb4]
338
	mov	r0, #0
339
	bx	lr
340
.size read_native_timer, .-read_native_timer
341
 
342
.global read_usec_timer
343
.type read_usec_timer, %function
344
read_usec_timer:
345
	ldr	r0, val_3c700000
346
	ldr	r0, [r0,#0xb4]
347
	bx	lr
348
.size read_usec_timer, .-read_usec_timer
349
 
350
val_3c700000:
351
	.word	0x3c700000