Subversion Repositories freemyipod

Rev

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

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