Subversion Repositories freemyipod

Rev

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
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
233 theseven 81
.cleancache:
82
        mcr	p15, 0, r0,c7,c10,2
83
        add	r1, r0, #0x10
84
        mcr	p15, 0, r1,c7,c10,2
85
        add	r1, r1, #0x10
86
        mcr	p15, 0, r1,c7,c10,2
87
        add	r1, r1, #0x10
88
        mcr	p15, 0, r1,c7,c10,2
89
        adds	r0, r0, #0x04000000
90
        bne	.cleancache
91
        mcr	p15, 0, r0,c7,c10,4
2 theseven 92
	mcr	p15, 0, r0,c7,c5,0
14 theseven 93
	mov	r1, #0x39c00000
94
	str	r0, [r1,#4]
95
	str	r0, [r1,#8]
96
	str	r0, [r1,#0x38]
97
	str	r0, [r1,#0x20]
98
	sub	r0, r0, #1
99
	str	r0, [r1]
100
	str	r0, [r1,#0x10]
101
	str	r0, [r1,#0x1c]
2 theseven 102
	msr	cpsr_c, #0xd2
103
	ldr	sp, =_irqstackend
104
	msr	cpsr_c, #0xd7
105
	ldr	sp, =_abortstackend
106
	msr	cpsr_c, #0xdb
107
	ldr	sp, =_abortstackend
43 theseven 108
	msr	cpsr_c, #0x1f
436 theseven 109
	ldr	sp, =_abortstackend
2 theseven 110
	bl	init
15 theseven 111
	bl	context_switch
14 theseven 112
	mov	r0, #0
99 theseven 113
	ldr	pc, =idleloop
2 theseven 114
.ltorg
115
 
116
 
117
.section .icode, "ax", %progbits
118
.align 2
99 theseven 119
idleloop:
120
	mcr	p15, 0, r0,c7,c0,4
121
	b	idleloop
122
 
2 theseven 123
.global reset
124
.global hang
125
.type reset, %function
126
.type hang, %function
127
reset:
128
	msr	cpsr_c, #0xd3
129
	mov	r0, #0x110000
130
	add	r0, r0, #0xff
131
	add	r1, r0, #0xa00
132
	mov	r2, #0x3c800000
133
	str	r1, [r2]
134
	mov	r1, #0xff0
135
	str	r1, [r2,#4]
136
	str	r0, [r2]
137
hang:
15 theseven 138
	msr	cpsr_c, #0xd3
139
	mcr	p15, 0, r0,c7,c0,4
2 theseven 140
	b	hang
141
.size reset, .-reset
142
.size hang, .-hang
143
 
144
.type reset_handler, %function
145
reset_handler:
43 theseven 146
	mov	r0, #0
147
	adr	r1, reset_text
2 theseven 148
	b	panic
149
reset_text:
150
	.ascii	"Hit reset vector!\0"
151
.size reset_handler, .-reset_handler
152
 
153
.type undef_instr_handler, %function
154
undef_instr_handler:
43 theseven 155
	mov	r0, #0
156
	adr	r1, undef_instr_text
157
	sub	r2, lr, #4
2 theseven 158
	b	panicf
159
.size undef_instr_handler, .-undef_instr_handler
160
 
161
.type prefetch_abort_handler, %function
162
prefetch_abort_handler:
43 theseven 163
	mov	r0, #0
164
	adr	r1, prefetch_abort_text
165
	sub	r2, lr, #4
2 theseven 166
	b	panicf
167
.size prefetch_abort_handler, .-prefetch_abort_handler
168
 
169
.type data_abort_handler, %function
170
data_abort_handler:
43 theseven 171
	mov	r0, #0
172
	adr	r1, data_abort_text
173
	sub	r2, lr, #4
2 theseven 174
	b	panicf
175
.size data_abort_handler, .-data_abort_handler
176
 
177
.type reserved_handler, %function
178
reserved_handler:
43 theseven 179
	mov	r0, #0
180
	adr	r1, reserved_text
2 theseven 181
	b	panic
182
.size reserved_handler, .-reserved_handler
183
 
184
.type fiq_handler, %function
185
fiq_handler:
43 theseven 186
	mov	r0, #2
187
	adr	r1, fiq_text
2 theseven 188
	b	panic
189
.size fiq_handler, .-fiq_handler
190
 
191
undef_instr_text:
192
	.ascii	"Undefined instruction at %08X!\0"
193
 
194
prefetch_abort_text:
195
	.ascii	"Prefetch abort at %08X!\0"
196
 
197
data_abort_text:
198
	.ascii	"Data abort at %08X!\0"
199
 
200
reserved_text:
201
	.ascii	"Hit reserved exception handler!\0"
202
 
203
fiq_text:
204
	.ascii	"Unhandled FIQ!\0"
205
 
206
syscall_text:
207
	.ascii	"Unhandled syscall!\0"
15 theseven 208
 
209
 
210
.section .icode.usec_timer, "ax", %progbits
211
.align 2
111 theseven 212
.global read_native_timer
213
.type read_native_timer, %function
214
read_native_timer:
15 theseven 215
	ldr	r0, val_3c700000
216
	ldr	r1, [r0,#0x80]
217
	ldr	r0, [r0,#0x84]
218
	bx	lr
111 theseven 219
.size read_native_timer, .-read_native_timer
15 theseven 220
 
221
.global read_usec_timer
222
.type read_usec_timer, %function
223
read_usec_timer:
224
	ldr	r0, val_3c700000
225
	ldr	r1, [r0,#0x80]
226
	ldr	r0, [r0,#0x84]
227
	add	r0, r0, r0,lsl#2
228
	bx	lr
229
.size read_usec_timer, .-read_usec_timer
230
 
231
val_3c700000:
232
	.word	0x3c700000
95 theseven 233
 
234
 
235
.section .text.control_nor_cache, "ax", %progbits
236
.align 2
237
.global control_nor_cache
238
.type control_nor_cache, %function
239
control_nor_cache:
240
	mrc	p15, 0, r3,c1,c0
241
	bic	r1, r3, #1
242
	mcr	p15, 0, r1,c1,c0
243
	mov	r1, #0
244
	mcr	p15, 0, r1,c7,c5
245
cnc_flushcache_loop:
246
	mcr	p15, 0, r1,c7,c14,2
247
	add	r2, r1, #0x10
248
	mcr	p15, 0, r2,c7,c14,2
249
	add	r2, r2, #0x10
250
	mcr	p15, 0, r2,c7,c14,2
251
	add	r2, r2, #0x10
252
	mcr	p15, 0, r2,c7,c14,2
253
	adds	r1, r1, #0x04000000
254
	bne	cnc_flushcache_loop
255
	mcr	p15, 0, r1,c7,c10,4
256
	ands	r0, r0, r0
257
	mrc	p15, 0, r1,c2,c0, 1
258
	biceq	r1, r1, #0x10
259
	orrne	r1, r1, #0x10
260
	mcr	p15, 0, r1,c2,c0, 1
261
	mrc	p15, 0, r1,c2,c0, 0
262
	biceq	r1, r1, #0x10
263
	orrne	r1, r1, #0x10
264
	mcr	p15, 0, r1,c2,c0, 0
265
	mrc	p15, 0, r1,c3,c0, 0
266
	biceq	r1, r1, #0x10
267
	orrne	r1, r1, #0x10
268
	mcr	p15, 0, r1,c3,c0, 0
269
	mcr	p15, 0, r3,c1,c0
270
	mov	pc, lr
271
.size control_nor_cache, .-control_nor_cache