Subversion Repositories freemyipod

Rev

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