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:
85 theseven 44
	ldr	r0, =0x00450878
45
	mcr	p15, 0, r0,c1,c0,0
10 theseven 46
	ldr	r0, =_sramsource
47
	ldr	r1, =_sramstart
48
	ldr	r2, =_sramend
49
.copysram:
50
	cmp	r2, r1
51
	ldrhi	r3, [r0], #4
52
	strhi	r3, [r1], #4
53
	bhi	.copysram
54
	ldr	r0, =_sdramsource
55
	ldr	r1, =_sdramstart
56
	ldr	r2, =_sdramend
57
.copysdram:
58
	cmp	r2, r1
59
	ldrhi	r3, [r0], #4
60
	strhi	r3, [r1], #4
61
	bhi	.copysdram
62
	ldr	r0, =_ibssstart
63
	ldr	r1, =_ibssend
437 theseven 64
	mov	r2, #0
10 theseven 65
.clearibss:
66
	cmp	r1, r0
67
	strhi	r2, [r0], #4
68
	bhi	.clearibss
69
	ldr	r0, =_bssstart
70
	ldr	r1, =_bssend
71
.clearbss:
72
	cmp	r1, r0
73
	strhi	r2, [r0], #4
74
	bhi	.clearbss
75
	ldr	r1, =0x38200000
76
	ldr	r0, [r1]
77
	orr	r0, r0, #1
78
	bic	r0, r0, #0x10000
79
	str	r0, [r1]
80
	mov	r0, #0
81
	mcr	p15, 0, r0,c7,c5,0
85 theseven 82
	add	r1, r1, #0x00c00000
83
	add	r2, r1, #0x00001000
84
	add	r3, r1, #0x00002000
85
	sub	r4, r0, #1
86
	str	r4, [r1,#0x14]
87
	str	r4, [r2,#0x14]
88
	str	r4, [r1,#0xf00]
89
	str	r4, [r2,#0xf00]
90
	str	r4, [r3,#0x08]
91
	str	r4, [r3,#0x0c]
92
	str	r0, [r1,#0x14]
93
	str	r0, [r2,#0x14]
94
	mov	r0, #0
95
	ldr	r1, =0x3c500000
96
	str	r0, [r1,#0x48]
97
	str	r0, [r1,#0x4c]
10 theseven 98
	msr	cpsr_c, #0xd2
99
	ldr	sp, =_irqstackend
100
	msr	cpsr_c, #0xd7
101
	ldr	sp, =_abortstackend
102
	msr	cpsr_c, #0xdb
103
	ldr	sp, =_abortstackend
85 theseven 104
	msr	cpsr_c, #0x1f
436 theseven 105
	ldr	sp, =_abortstackend
10 theseven 106
	bl	init
593 theseven 107
	bl	yield
14 theseven 108
	mov	r0, #0
99 theseven 109
	ldr	pc, =idleloop
10 theseven 110
.ltorg
111
 
112
 
113
.section .icode, "ax", %progbits
114
.align 2
99 theseven 115
idleloop:
116
	mcr	p15, 0, r0,c7,c0,4
117
	b	idleloop
118
 
10 theseven 119
.global reset
120
.global hang
121
.type reset, %function
122
.type hang, %function
123
reset:
124
	msr	cpsr_c, #0xd3
125
	mov	r0, #0x100000
126
	mov	r1, #0x3c800000
127
	str	r0, [r1]
128
hang:
85 theseven 129
	msr	cpsr_c, #0xd3
130
	mcr	p15, 0, r0,c7,c0,4
10 theseven 131
	b	hang
132
.size reset, .-reset
133
.size hang, .-hang
134
 
135
.type reset_handler, %function
136
reset_handler:
702 theseven 137
	stmfd	sp, {r10-r12}
138
	mov	r10, sp
139
	mov	r11, lr
140
	mrs	r12, cpsr
141
	msr	cpsr_c, #0xd7
142
	sub	sp, sp, #0x44
143
	stmia	sp!, {r0-r9}
144
	sub	r0, r10, #0xc
145
	ldmia	r0, {r0-r2}
146
	mov	r3, r10
147
	mov	r4, r11
148
	mov	r5, r11
149
	mov	r6, r12
150
	stmia	sp!, {r0-r6}
151
	sub	sp, sp, #0x44
85 theseven 152
	mov	r0, #0
153
	adr	r1, reset_text
702 theseven 154
	mov	r2, r11
10 theseven 155
	b	panic
156
.size reset_handler, .-reset_handler
157
 
704 theseven 158
.global undef_instr_handler
10 theseven 159
.type undef_instr_handler, %function
160
undef_instr_handler:
702 theseven 161
	sub	sp, sp, #0x44
162
	stmia	sp!, {r0-r12}
163
	sub	r2, lr, #4
164
	mrs	r3, spsr
165
	mrs	r4, cpsr
166
	orr	r0, r3, #0xc0
167
	msr	cpsr_c, r0
168
	mov	r0, sp
169
	mov	r1, lr
170
	msr	cpsr_c, r4
171
	stmia	sp!, {r0-r3}
172
	sub	sp, sp, #0x44
85 theseven 173
	mov	r0, #0
174
	adr	r1, undef_instr_text
702 theseven 175
	ldr	r3, [r2]
10 theseven 176
	b	panicf
177
.size undef_instr_handler, .-undef_instr_handler
178
 
179
.type prefetch_abort_handler, %function
180
prefetch_abort_handler:
702 theseven 181
	sub	sp, sp, #0x44
182
	stmia	sp!, {r0-r12}
183
	sub	r2, lr, #4
184
	mrs	r3, spsr
185
	mrs	r4, cpsr
186
	orr	r0, r3, #0xc0
187
	msr	cpsr_c, r0
188
	mov	r0, sp
189
	mov	r1, lr
190
	msr	cpsr_c, r4
191
	stmia	sp!, {r0-r3}
192
	sub	sp, sp, #0x44
85 theseven 193
	mov	r0, #0
194
	adr	r1, prefetch_abort_text
702 theseven 195
	mrc	p15, 0, r3,c5,c0,1
196
	mov	r4, r3,lsr#4
197
	and	r4, r4, #0xf
198
	and	r5, r3, #0xf
199
	stmfd	sp!, {r4-r5}
10 theseven 200
	b	panicf
201
.size prefetch_abort_handler, .-prefetch_abort_handler
202
 
203
.type data_abort_handler, %function
204
data_abort_handler:
702 theseven 205
	sub	sp, sp, #0x44
206
	stmia	sp!, {r0-r12}
207
	sub	r2, lr, #8
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
85 theseven 217
	mov	r0, #0
218
	adr	r1, data_abort_text
702 theseven 219
	mrc	p15, 0, r3,c5,c0
220
	mov	r4, r3,lsr#4
221
	and	r4, r4, #0xf
222
	and	r5, r3, #0xf
223
	mrc	p15, 0, r6,c6,c0
224
	stmfd	sp!, {r4-r6}
10 theseven 225
	b	panicf
226
.size data_abort_handler, .-data_abort_handler
227
 
228
.type reserved_handler, %function
229
reserved_handler:
702 theseven 230
	stmfd	sp, {r10-r12}
231
	mov	r10, sp
232
	mov	r11, lr
233
	mrs	r12, cpsr
234
	msr	cpsr_c, #0xd7
235
	sub	sp, sp, #0x44
236
	stmia	sp!, {r0-r9}
237
	sub	r0, r10, #0xc
238
	ldmia	r0, {r0-r2}
239
	mov	r3, r10
240
	mov	r4, r11
241
	mov	r5, r11
242
	mov	r6, r12
243
	stmia	sp!, {r0-r6}
244
	sub	sp, sp, #0x44
85 theseven 245
	mov	r0, #0
246
	adr	r1, reserved_text
702 theseven 247
	mov	r2, r11
10 theseven 248
	b	panic
249
.size reserved_handler, .-reserved_handler
250
 
251
.type fiq_handler, %function
252
fiq_handler:
85 theseven 253
	mov	r0, #2
254
	adr	r1, fiq_text
10 theseven 255
	b	panic
256
.size fiq_handler, .-fiq_handler
257
 
702 theseven 258
prefetch_abort_text:
259
	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0"
260
 
261
reset_text:
262
	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0"
263
 
10 theseven 264
undef_instr_text:
702 theseven 265
	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0"
10 theseven 266
 
267
data_abort_text:
702 theseven 268
	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0"
10 theseven 269
 
270
fiq_text:
271
	.ascii	"Unhandled FIQ!\0"
272
 
702 theseven 273
reserved_text:
274
	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0"
275
 
10 theseven 276
syscall_text:
277
	.ascii	"Unhandled syscall!\0"
85 theseven 278
 
279
 
280
.section .icode.usec_timer, "ax", %progbits
281
.align 2
111 theseven 282
.global read_native_timer
283
.type read_native_timer, %function
284
read_native_timer:
85 theseven 285
	ldr	r0, val_3c700000
286
	ldr	r1, [r0,#0x80]
287
	ldr	r0, [r0,#0x84]
288
	bx	lr
111 theseven 289
.size read_native_timer, .-read_native_timer
85 theseven 290
 
291
.global read_usec_timer
292
.type read_usec_timer, %function
293
read_usec_timer:
294
	ldr	r0, val_3c700000
295
	ldr	r1, [r0,#0x80]
296
	ldr	r0, [r0,#0x84]
297
	mov	r0, r0,lsr#5
298
	orr	r0, r0, r1,lsl#27
299
	add	r0, r0, r0,asr#2
300
	add	r0, r0, r0,asr#6
301
	bx	lr
302
.size read_usec_timer, .-read_usec_timer
303
 
304
val_3c700000:
305
	.word	0x3c700000