Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 theseven 1
@
2
@
3
@    Copyright 2010 TheSeven
4
@
5
@
427 farthen 6
@    This file is part of emCORE.
10 theseven 7
@
427 farthen 8
@    emCORE is free software: you can redistribute it and/or
10 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,
10 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/>.
10 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
 
10 theseven 41
.section .initcode,"ax",%progbits
42
.global _start
43
_start:
732 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
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
751 theseven 88
	orr	r0, r0, #0x400000
732 theseven 89
	mcr	p15, 0, r0,c1,c0
10 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
437 theseven 108
	mov	r2, #0
10 theseven 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
	mov	r0, #0
732 theseven 120
	mcr	p15, 0, r0,c7,c10,0 @ clean data cache
121
	mcr	p15, 0, r0,c7,c10,4 @ drain write buffer
122
	mcr	p15, 0, r0,c7,c5,0  @ invalidate instruction cache
123
	mcr	p15, 0, r0,c7,c5,4  @ flush prefetch buffer
124
	ldr	r1, =0x38e00000
85 theseven 125
	add	r2, r1, #0x00001000
126
	add	r3, r1, #0x00002000
732 theseven 127
	mov	r4, #-1
85 theseven 128
	str	r4, [r1,#0x14]
129
	str	r4, [r2,#0x14]
130
	str	r4, [r1,#0xf00]
131
	str	r4, [r2,#0xf00]
132
	str	r4, [r3,#0x08]
133
	str	r4, [r3,#0x0c]
10 theseven 134
	msr	cpsr_c, #0xd2
135
	ldr	sp, =_irqstackend
136
	msr	cpsr_c, #0xd7
137
	ldr	sp, =_abortstackend
138
	msr	cpsr_c, #0xdb
139
	ldr	sp, =_abortstackend
85 theseven 140
	msr	cpsr_c, #0x1f
436 theseven 141
	ldr	sp, =_abortstackend
10 theseven 142
	bl	init
593 theseven 143
	bl	yield
14 theseven 144
	mov	r0, #0
99 theseven 145
	ldr	pc, =idleloop
10 theseven 146
.ltorg
147
 
148
 
149
.section .icode, "ax", %progbits
150
.align 2
99 theseven 151
idleloop:
152
	mcr	p15, 0, r0,c7,c0,4
153
	b	idleloop
154
 
10 theseven 155
.global reset
156
.global hang
157
.type reset, %function
158
.type hang, %function
159
reset:
160
	msr	cpsr_c, #0xd3
161
	mov	r0, #0x100000
162
	mov	r1, #0x3c800000
163
	str	r0, [r1]
164
hang:
85 theseven 165
	msr	cpsr_c, #0xd3
732 theseven 166
	mov	r0, #0
85 theseven 167
	mcr	p15, 0, r0,c7,c0,4
10 theseven 168
	b	hang
169
.size reset, .-reset
170
.size hang, .-hang
171
 
172
.type reset_handler, %function
173
reset_handler:
702 theseven 174
	stmfd	sp, {r10-r12}
175
	mov	r10, sp
176
	mov	r11, lr
177
	mrs	r12, cpsr
178
	msr	cpsr_c, #0xd7
179
	sub	sp, sp, #0x44
180
	stmia	sp!, {r0-r9}
181
	sub	r0, r10, #0xc
182
	ldmia	r0, {r0-r2}
183
	mov	r3, r10
184
	mov	r4, r11
185
	mov	r5, r11
186
	mov	r6, r12
187
	stmia	sp!, {r0-r6}
188
	sub	sp, sp, #0x44
85 theseven 189
	mov	r0, #0
190
	adr	r1, reset_text
702 theseven 191
	mov	r2, r11
10 theseven 192
	b	panic
193
.size reset_handler, .-reset_handler
194
 
704 theseven 195
.global undef_instr_handler
10 theseven 196
.type undef_instr_handler, %function
197
undef_instr_handler:
702 theseven 198
	sub	sp, sp, #0x44
199
	stmia	sp!, {r0-r12}
200
	sub	r2, lr, #4
201
	mrs	r3, spsr
202
	mrs	r4, cpsr
203
	orr	r0, r3, #0xc0
204
	msr	cpsr_c, r0
205
	mov	r0, sp
206
	mov	r1, lr
207
	msr	cpsr_c, r4
208
	stmia	sp!, {r0-r3}
209
	sub	sp, sp, #0x44
85 theseven 210
	mov	r0, #0
211
	adr	r1, undef_instr_text
702 theseven 212
	ldr	r3, [r2]
10 theseven 213
	b	panicf
214
.size undef_instr_handler, .-undef_instr_handler
215
 
216
.type prefetch_abort_handler, %function
217
prefetch_abort_handler:
702 theseven 218
	sub	sp, sp, #0x44
219
	stmia	sp!, {r0-r12}
220
	sub	r2, lr, #4
221
	mrs	r3, spsr
222
	mrs	r4, cpsr
223
	orr	r0, r3, #0xc0
224
	msr	cpsr_c, r0
225
	mov	r0, sp
226
	mov	r1, lr
227
	msr	cpsr_c, r4
228
	stmia	sp!, {r0-r3}
229
	sub	sp, sp, #0x44
85 theseven 230
	mov	r0, #0
231
	adr	r1, prefetch_abort_text
732 theseven 232
	mrc	p15, 0, r3,c5,c0
702 theseven 233
	mov	r4, r3,lsr#4
234
	and	r4, r4, #0xf
235
	and	r5, r3, #0xf
236
	stmfd	sp!, {r4-r5}
10 theseven 237
	b	panicf
238
.size prefetch_abort_handler, .-prefetch_abort_handler
239
 
240
.type data_abort_handler, %function
241
data_abort_handler:
702 theseven 242
	sub	sp, sp, #0x44
243
	stmia	sp!, {r0-r12}
244
	sub	r2, lr, #8
245
	mrs	r3, spsr
246
	mrs	r4, cpsr
247
	orr	r0, r3, #0xc0
248
	msr	cpsr_c, r0
249
	mov	r0, sp
250
	mov	r1, lr
251
	msr	cpsr_c, r4
252
	stmia	sp!, {r0-r3}
253
	sub	sp, sp, #0x44
85 theseven 254
	mov	r0, #0
255
	adr	r1, data_abort_text
702 theseven 256
	mrc	p15, 0, r3,c5,c0
257
	mov	r4, r3,lsr#4
258
	and	r4, r4, #0xf
259
	and	r5, r3, #0xf
260
	mrc	p15, 0, r6,c6,c0
261
	stmfd	sp!, {r4-r6}
10 theseven 262
	b	panicf
263
.size data_abort_handler, .-data_abort_handler
264
 
265
.type reserved_handler, %function
266
reserved_handler:
702 theseven 267
	stmfd	sp, {r10-r12}
268
	mov	r10, sp
269
	mov	r11, lr
270
	mrs	r12, cpsr
271
	msr	cpsr_c, #0xd7
272
	sub	sp, sp, #0x44
273
	stmia	sp!, {r0-r9}
274
	sub	r0, r10, #0xc
275
	ldmia	r0, {r0-r2}
276
	mov	r3, r10
277
	mov	r4, r11
278
	mov	r5, r11
279
	mov	r6, r12
280
	stmia	sp!, {r0-r6}
281
	sub	sp, sp, #0x44
85 theseven 282
	mov	r0, #0
283
	adr	r1, reserved_text
702 theseven 284
	mov	r2, r11
10 theseven 285
	b	panic
286
.size reserved_handler, .-reserved_handler
287
 
288
.type fiq_handler, %function
289
fiq_handler:
85 theseven 290
	mov	r0, #2
291
	adr	r1, fiq_text
10 theseven 292
	b	panic
293
.size fiq_handler, .-fiq_handler
294
 
702 theseven 295
prefetch_abort_text:
296
	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0"
297
 
298
reset_text:
299
	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0"
300
 
10 theseven 301
undef_instr_text:
702 theseven 302
	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0"
10 theseven 303
 
304
data_abort_text:
702 theseven 305
	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0"
10 theseven 306
 
307
fiq_text:
308
	.ascii	"Unhandled FIQ!\0"
309
 
702 theseven 310
reserved_text:
311
	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0"
312
 
10 theseven 313
syscall_text:
314
	.ascii	"Unhandled syscall!\0"
85 theseven 315
 
316
 
317
.section .icode.usec_timer, "ax", %progbits
318
.align 2
111 theseven 319
.global read_native_timer
320
.type read_native_timer, %function
321
read_native_timer:
85 theseven 322
	ldr	r0, val_3c700000
323
	ldr	r1, [r0,#0x80]
324
	ldr	r0, [r0,#0x84]
325
	bx	lr
111 theseven 326
.size read_native_timer, .-read_native_timer
85 theseven 327
 
328
.global read_usec_timer
329
.type read_usec_timer, %function
330
read_usec_timer:
331
	ldr	r0, val_3c700000
732 theseven 332
	ldr	r0, [r0,#0xb4]
85 theseven 333
	bx	lr
334
.size read_usec_timer, .-read_usec_timer
335
 
336
val_3c700000:
337
	.word	0x3c700000