Subversion Repositories freemyipod

Rev

Rev 819 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 theseven 1
@
2
@
3
@    Copyright 2010 TheSeven
4
@
5
@
427 farthen 6
@    This file is part of emCORE.
14 theseven 7
@
427 farthen 8
@    emCORE is free software: you can redistribute it and/or
14 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,
14 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/>.
14 theseven 20
@
21
@
22
 
563 theseven 23
#define ASM_FILE
24
#include "global.h"
14 theseven 25
 
702 theseven 26
.section .icode.contextswitch, "ax", %progbits
14 theseven 27
.align 2
593 theseven 28
.global yield
29
.type yield, %function
30
yield:
15 theseven 31
	mrs	r1, cpsr
43 theseven 32
	msr	cpsr_c, #0xdf
14 theseven 33
	ldr	r0, =current_thread
34
	ldr	r0, [r0]
595 theseven 35
	stmia	r0, {r0-r14}
36
	str	lr, [r0,#0x3c]
37
	str	r1, [r0,#0x40]
15 theseven 38
	msr	cpsr_c, #0xd2
595 theseven 39
	mov	r4, r0
594 theseven 40
	bl	scheduler_pause_accounting
819 theseven 41
switch_thread:
14 theseven 42
	adr	lr, resume_thread
595 theseven 43
	mov	r0, #0
44
	mov	r1, r4
14 theseven 45
	b	scheduler_switch
593 theseven 46
.size yield, .-yield
14 theseven 47
 
819 theseven 48
.global leave_thread
49
.type leave_thread, %function
50
leave_thread:
51
	msr	cpsr_c, #0xd2
52
	mov	r4, #0
53
	b	switch_thread
54
.size leave_thread, .-leave_thread
55
 
43 theseven 56
.global syscall_handler
57
.type syscall_handler, %function
58
syscall_handler:
59
	ldr	sp, [lr,#-4]
60
	bics	sp, sp, #0xff000000
61
	beq	syscall_breakpoint
704 theseven 62
	cmp	sp, #(swilist_end-swilist_start)/4+1
63
	bcs	unknown_swi
43 theseven 64
	mov	r12, lr
65
	mrs	sp, spsr
66
	msr	cpsr_c, sp
67
	mov	lr, r12
68
	ldr	r12, [lr,#-4]
69
	bic	r12, r12, #0xff000000
704 theseven 70
	sub	r12, r12, #2
71
	add	pc, pc, r12,lsl#2
43 theseven 72
swilist_start:
73
	b	panicf
74
	b	get_syscall_table
75
swilist_end:
76
 
77
syscall_breakpoint:
78
	msr	cpsr_c, #0xd3
79
	ldr	sp, =current_thread
80
	ldr	sp, [sp]
81
	stmia	sp!, {r0-r12}
82
	mov	r2, lr
83
	mrs	r3, spsr
84
	mov	r4, #1
85
	mov	r5, sp
86
	msr	cpsr_c, #0xdf
87
	mov	r0, sp
88
	mov	r1, lr
89
	msr	cpsr_c, #0xd2
90
	stmia	r5, {r0-r4}
389 theseven 91
	bl	scheduler_pause_accounting
43 theseven 92
	adr	lr, resume_thread
595 theseven 93
	mov	r0, #0
94
	mov	r1, #0
43 theseven 95
	b	scheduler_switch
704 theseven 96
 
97
unknown_swi:
98
	ldr	sp, =_abortstackend - 0x44
99
	str	lr, [sp,#-4]
100
	mrs	lr, spsr
101
	str	lr, [sp,#-8]
102
	msr	cpsr_c, #0xdb
103
	ldr	lr, [sp,#-8]
104
	msr	spsr_all, lr
105
	ldr	lr, [sp,#-4]
106
	b	undef_instr_handler
43 theseven 107
.size syscall_handler, .-syscall_handler
108
 
14 theseven 109
.global irq_handler
110
.type irq_handler, %function
43 theseven 111
was_in_svc_mode:
112
	msr	cpsr_c, #0xd3
113
	sub	r3, lr, #4
114
	mrs	r4, spsr
115
	msr	cpsr_c, r5
116
	b enter_irqhandler
117
 
14 theseven 118
irq_handler:
119
	str	r12, [sp,#-4]
120
	ldr	r12, =current_thread
121
	ldr	r12, [r12]
122
	stmia	r12!, {r0-r11}
123
	ldr	r0, [sp,#-4]
124
	mrs	r5, cpsr
125
	mrs	r4, spsr
43 theseven 126
	msr	cpsr_c, #0xdf
14 theseven 127
	mov	r1, sp
128
	mov	r2, lr
43 theseven 129
	and	r3, r4, #0x1f
130
	cmp	r3, #0x13
131
	beq	was_in_svc_mode
14 theseven 132
	msr	cpsr_c, r5
133
	sub	r3, lr, #4
43 theseven 134
enter_irqhandler:
14 theseven 135
	stmia	r12, {r0-r4}
389 theseven 136
	bl	scheduler_pause_accounting
14 theseven 137
	bl	irqhandler
138
@ fallthrough
139
 
140
.global resume_thread
141
.type resume_thread, %function
142
resume_thread:
389 theseven 143
	bl	scheduler_resume_accounting
15 theseven 144
	ldr	lr, =current_thread
145
	ldr	lr, [lr]
146
	mov	r0, lr
147
	ldr	r1, [lr,#0x40]
148
	ldr	lr, [lr,#0x3c]
149
	msr	spsr_all, r1
43 theseven 150
	msr	cpsr_c, 0xdf
15 theseven 151
	ldmia	r0, {r0-r14}
14 theseven 152
	msr	cpsr_c, #0xd2
153
	movs	pc, lr
154
.size irq_handler, .-irq_handler
155
.size resume_thread, .-resume_thread
156
 
157
.global enter_critical_section
158
.type enter_critical_section, %function
159
enter_critical_section:
160
	mrs	r0, cpsr
15 theseven 161
	orr	r1, r0, #0xc0
162
	msr	cpsr_c, r1
14 theseven 163
	mov	pc, lr
164
.size enter_critical_section, .-enter_critical_section
165
 
166
.global leave_critical_section
167
.type leave_critical_section, %function
168
leave_critical_section:
169
	msr	cpsr_c, r0
170
	mov	pc, lr
171
.size leave_critical_section, .-leave_critical_section
43 theseven 172
 
127 theseven 173
.global execfirmware
174
.type execfirmware, %function
175
execfirmware:
519 theseven 176
	ldr	sp, =_abortstackend
438 theseven 177
	stmfd	sp!, {r0-r2}
219 theseven 178
	bl	interrupt_shutdown
443 theseven 179
	mov	r0, sp
438 theseven 180
	msr	cpsr_c, #0xd3
443 theseven 181
	mov	sp, r0
438 theseven 182
	ldmfd	sp, {r0-r2}
183
	bl	memmove
140 theseven 184
	bl	clean_dcache
563 theseven 185
#ifdef HAVE_TARGETINIT_EXECFIRMWARE
186
	bl	targetinit_execfirmware
187
#endif
438 theseven 188
	ldr	r1, [sp]
140 theseven 189
	mrc	p15, 0, r0,c1,c0
312 theseven 190
	bic	r0, r0, #5
140 theseven 191
	mcr	p15, 0, r0,c1,c0
312 theseven 192
	mov	r0, #0
140 theseven 193
	mcr	p15, 0, r0,c7,c5
194
	bx	r1
127 theseven 195
.size execfirmware, .-execfirmware
196
 
704 theseven 197
.global panic_recover
198
.type panic_recover, %function
199
panic_recover:
200
	and	r0, r0, #0x1f
201
	cmp	r0, #0x12
202
	beq	irqpanic
203
	cmp	r0, #0x17
204
	cmpne	r0, #0x1b
205
	bne	yield
206
	ldr	sp, =_abortstackend - 0x44
207
	ldr	r0, [sp,#0x40]
208
	and	r0, r0, #0x1f
209
	cmp	r0, #0x12
210
	beq	irqabort
211
	ldr	r9, =current_thread
212
	ldr	lr, [r9]
213
	ldmia	sp!, {r0-r7}
214
	stmia	lr!, {r0-r7}
215
	ldmia	sp!, {r0-r8}
216
	stmia	lr!, {r0-r8}
217
	msr	cpsr_c, #0xd2
218
	bl	scheduler_pause_accounting
219
	adr	lr, resume_thread
220
	mov	r0, #0
221
	mov	r1, r9
222
	b	scheduler_switch
223
.size panic_recover, .-panic_recover
224
 
225
irqabort:
226
	mov	r0, #CONSOLE_PANIC
227
	adr	r1, irqabort_string
228
	ldmfd	sp!, {r2,r3}
229
	bl	csprintf
230
	mov	r0, #CONSOLE_PANIC
231
	bl	csflush
232
	mov	r0, #CONSOLE_PANICDUMP
233
	adr	r1, stack_string
234
	bl	csputs
235
	add	sp, sp, #0x3c
236
	ldr	r4, [sp,#-0x10]
237
	sub	r4, r4, #0x800
238
	add	r5, r4, #0x2000
239
irqabort_stackline:
240
	mov	r0, #CONSOLE_PANICDUMP
241
	adr	r1, hexdump_string
242
	mov	r2, r4
243
	ldr	r3, [r4], #4
244
	bl	csprintf
245
	cmp	r4, r5
246
	bne	irqabort_stackline
247
	mov	r0, #CONSOLE_PANICDUMP
248
	bl	csflush
249
	b	hang
250
 
251
irqpanic:
252
	mov	r0, #CONSOLE_PANIC
253
	adr	r1, irqpanic_string
254
	bl	csputs
255
	mov	r0, #CONSOLE_PANIC
256
	bl	csflush
257
@ fallthrough
258
 
259
.global panic_fatal
260
.type panic_fatal, %function
261
panic_fatal:
262
	b	hang
263
.size panic_fatal, .-panic_fatal
264
 
265
stack_string:
266
	.ascii "Stack:\n\0"
267
 
268
hexdump_string:
269
	.ascii "%08X: %08X\n\0"
270
 
271
irqabort_string:
272
	.ascii "Exception in IRQ handler!\n"
273
	.ascii " R0: %08X  R1: %08X\n R2: %08X  R3: %08X\n"
274
	.ascii " R4: %08X  R5: %08X\n R6: %08X  R7: %08X\n"
275
	.ascii " R8: %08X  R9: %08X\nR10: %08X R11: %08X\n"
276
	.ascii "R12: %08X R13: %08X\nR14: %08X R15: %08X\n"
277
	.ascii "CPSR: %08X\n\0"
278
 
279
irqpanic_string:
280
	.ascii "Panic in IRQ handler!\n\0"
281