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
@
6
@    This file is part of emBIOS.
7
@
8
@    emBIOS is free software: you can redistribute it and/or
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
@
13
@    emBIOS is distributed in the hope that it will be useful,
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
19
@    along with emBIOS.  If not, see <http://www.gnu.org/licenses/>.
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
45
	orr	r0, r0, #1
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, =_initbssstart
64
	ldr	r1, =_initbssend
65
	mov	r2, #0
66
.clearinitbss:
67
	cmp	r1, r0
68
	strhi	r2, [r0], #4
69
	bhi	.clearinitbss
70
	ldr	r0, =_ibssstart
71
	ldr	r1, =_ibssend
72
.clearibss:
73
	cmp	r1, r0
74
	strhi	r2, [r0], #4
75
	bhi	.clearibss
76
	ldr	r0, =_bssstart
77
	ldr	r1, =_bssend
78
.clearbss:
79
	cmp	r1, r0
80
	strhi	r2, [r0], #4
81
	bhi	.clearbss
82
	ldr	r1, =0x38200000
83
	ldr	r0, [r1]
84
	orr	r0, r0, #1
85
	bic	r0, r0, #0x10000
86
	str	r0, [r1]
87
	mov	r0, #0
88
	mcr	p15, 0, r0,c7,c5,0
14 theseven 89
	mov	r1, #0x39c00000
90
	str	r0, [r1,#4]
91
	str	r0, [r1,#8]
92
	str	r0, [r1,#0x38]
93
	str	r0, [r1,#0x20]
94
	sub	r0, r0, #1
95
	str	r0, [r1]
96
	str	r0, [r1,#0x10]
97
	str	r0, [r1,#0x1c]
2 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
43 theseven 104
	msr	cpsr_c, #0x1f
2 theseven 105
	ldr	sp, =_initstackend
106
	bl	init
15 theseven 107
	bl	context_switch
14 theseven 108
	mov	r0, #0
99 theseven 109
	ldr	pc, =idleloop
2 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
 
2 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, #0x110000
126
	add	r0, r0, #0xff
127
	add	r1, r0, #0xa00
128
	mov	r2, #0x3c800000
129
	str	r1, [r2]
130
	mov	r1, #0xff0
131
	str	r1, [r2,#4]
132
	str	r0, [r2]
133
hang:
15 theseven 134
	msr	cpsr_c, #0xd3
135
	mcr	p15, 0, r0,c7,c0,4
2 theseven 136
	b	hang
137
.size reset, .-reset
138
.size hang, .-hang
139
 
140
.type reset_handler, %function
141
reset_handler:
43 theseven 142
	mov	r0, #0
143
	adr	r1, reset_text
2 theseven 144
	b	panic
145
reset_text:
146
	.ascii	"Hit reset vector!\0"
147
.size reset_handler, .-reset_handler
148
 
149
.type undef_instr_handler, %function
150
undef_instr_handler:
43 theseven 151
	mov	r0, #0
152
	adr	r1, undef_instr_text
153
	sub	r2, lr, #4
2 theseven 154
	b	panicf
155
.size undef_instr_handler, .-undef_instr_handler
156
 
157
.type prefetch_abort_handler, %function
158
prefetch_abort_handler:
43 theseven 159
	mov	r0, #0
160
	adr	r1, prefetch_abort_text
161
	sub	r2, lr, #4
2 theseven 162
	b	panicf
163
.size prefetch_abort_handler, .-prefetch_abort_handler
164
 
165
.type data_abort_handler, %function
166
data_abort_handler:
43 theseven 167
	mov	r0, #0
168
	adr	r1, data_abort_text
169
	sub	r2, lr, #4
2 theseven 170
	b	panicf
171
.size data_abort_handler, .-data_abort_handler
172
 
173
.type reserved_handler, %function
174
reserved_handler:
43 theseven 175
	mov	r0, #0
176
	adr	r1, reserved_text
2 theseven 177
	b	panic
178
.size reserved_handler, .-reserved_handler
179
 
180
.type fiq_handler, %function
181
fiq_handler:
43 theseven 182
	mov	r0, #2
183
	adr	r1, fiq_text
2 theseven 184
	b	panic
185
.size fiq_handler, .-fiq_handler
186
 
187
undef_instr_text:
188
	.ascii	"Undefined instruction at %08X!\0"
189
 
190
prefetch_abort_text:
191
	.ascii	"Prefetch abort at %08X!\0"
192
 
193
data_abort_text:
194
	.ascii	"Data abort at %08X!\0"
195
 
196
reserved_text:
197
	.ascii	"Hit reserved exception handler!\0"
198
 
199
fiq_text:
200
	.ascii	"Unhandled FIQ!\0"
201
 
202
syscall_text:
203
	.ascii	"Unhandled syscall!\0"
15 theseven 204
 
205
 
206
.section .icode.usec_timer, "ax", %progbits
207
.align 2
111 theseven 208
.global read_native_timer
209
.type read_native_timer, %function
210
read_native_timer:
15 theseven 211
	ldr	r0, val_3c700000
212
	ldr	r1, [r0,#0x80]
213
	ldr	r0, [r0,#0x84]
214
	bx	lr
111 theseven 215
.size read_native_timer, .-read_native_timer
15 theseven 216
 
217
.global read_usec_timer
218
.type read_usec_timer, %function
219
read_usec_timer:
220
	ldr	r0, val_3c700000
221
	ldr	r1, [r0,#0x80]
222
	ldr	r0, [r0,#0x84]
223
	add	r0, r0, r0,lsl#2
224
	bx	lr
225
.size read_usec_timer, .-read_usec_timer
226
 
227
val_3c700000:
228
	.word	0x3c700000
95 theseven 229
 
230
 
231
.section .text.control_nor_cache, "ax", %progbits
232
.align 2
233
.global control_nor_cache
234
.type control_nor_cache, %function
235
control_nor_cache:
236
	mrc	p15, 0, r3,c1,c0
237
	bic	r1, r3, #1
238
	mcr	p15, 0, r1,c1,c0
239
	mov	r1, #0
240
	mcr	p15, 0, r1,c7,c5
241
cnc_flushcache_loop:
242
	mcr	p15, 0, r1,c7,c14,2
243
	add	r2, r1, #0x10
244
	mcr	p15, 0, r2,c7,c14,2
245
	add	r2, r2, #0x10
246
	mcr	p15, 0, r2,c7,c14,2
247
	add	r2, r2, #0x10
248
	mcr	p15, 0, r2,c7,c14,2
249
	adds	r1, r1, #0x04000000
250
	bne	cnc_flushcache_loop
251
	mcr	p15, 0, r1,c7,c10,4
252
	ands	r0, r0, r0
253
	mrc	p15, 0, r1,c2,c0, 1
254
	biceq	r1, r1, #0x10
255
	orrne	r1, r1, #0x10
256
	mcr	p15, 0, r1,c2,c0, 1
257
	mrc	p15, 0, r1,c2,c0, 0
258
	biceq	r1, r1, #0x10
259
	orrne	r1, r1, #0x10
260
	mcr	p15, 0, r1,c2,c0, 0
261
	mrc	p15, 0, r1,c3,c0, 0
262
	biceq	r1, r1, #0x10
263
	orrne	r1, r1, #0x10
264
	mcr	p15, 0, r1,c3,c0, 0
265
	mcr	p15, 0, r3,c1,c0
266
	mov	pc, lr
267
.size control_nor_cache, .-control_nor_cache