Subversion Repositories freemyipod

Rev

Rev 15 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 15 Rev 43
Line 25... Line 25...
25
.align 2
25
.align 2
26
.global context_switch
26
.global context_switch
27
.type context_switch, %function
27
.type context_switch, %function
28
context_switch:
28
context_switch:
29
	mrs	r1, cpsr
29
	mrs	r1, cpsr
30
	orr	r0, r1, #0xc0
-
 
31
	msr	cpsr_c, r0
30
	msr	cpsr_c, #0xdf
32
	ldr	r0, =current_thread
31
	ldr	r0, =current_thread
33
	ldr	r0, [r0]
32
	ldr	r0, [r0]
34
	stmia	r0!, {r0-r14}
33
	stmia	r0!, {r0-r14}
35
	str	lr, [r0], #4
34
	str	lr, [r0], #4
36
	str	r1, [r0]
35
	str	r1, [r0]
Line 38... Line 37...
38
	adr	lr, resume_thread
37
	adr	lr, resume_thread
39
	mov	r0, #-1
38
	mov	r0, #-1
40
	b	scheduler_switch
39
	b	scheduler_switch
41
.size context_switch, .-context_switch
40
.size context_switch, .-context_switch
42
 
41
 
-
 
42
.global syscall_handler
-
 
43
.type syscall_handler, %function
-
 
44
syscall_handler:
-
 
45
	ldr	sp, [lr,#-4]
-
 
46
	bics	sp, sp, #0xff000000
-
 
47
	beq	syscall_breakpoint
-
 
48
	mov	r12, lr
-
 
49
	mrs	sp, spsr
-
 
50
	msr	cpsr_c, sp
-
 
51
	mov	lr, r12
-
 
52
	ldr	r12, [lr,#-4]
-
 
53
	bic	r12, r12, #0xff000000
-
 
54
	cmp	r12, #(swilist_end-swilist_start)/4+1
-
 
55
	movcs	r0, #0
-
 
56
	addcc	pc, pc, r12,lsl#2
-
 
57
	adr	r1, unknown_swi_string
-
 
58
	mov	r2, r12
-
 
59
swilist_start:
-
 
60
	b	panicf
-
 
61
	b	get_syscall_table
-
 
62
swilist_end:
-
 
63
 
-
 
64
syscall_breakpoint:
-
 
65
	msr	cpsr_c, #0xd3
-
 
66
	ldr	sp, =current_thread
-
 
67
	ldr	sp, [sp]
-
 
68
	stmia	sp!, {r0-r12}
-
 
69
	mov	r2, lr
-
 
70
	mrs	r3, spsr
-
 
71
	mov	r4, #1
-
 
72
	mov	r5, sp
-
 
73
	msr	cpsr_c, #0xdf
-
 
74
	mov	r0, sp
-
 
75
	mov	r1, lr
-
 
76
	msr	cpsr_c, #0xd2
-
 
77
	stmia	r5, {r0-r4}
-
 
78
	adr	lr, resume_thread
-
 
79
	mov	r0, #-1
-
 
80
	b	scheduler_switch
-
 
81
.size syscall_handler, .-syscall_handler
-
 
82
 
43
.global irq_handler
83
.global irq_handler
44
.type irq_handler, %function
84
.type irq_handler, %function
-
 
85
was_in_svc_mode:
-
 
86
	msr	cpsr_c, #0xd3
-
 
87
	sub	r3, lr, #4
-
 
88
	mrs	r4, spsr
-
 
89
	msr	cpsr_c, r5
-
 
90
	b enter_irqhandler
-
 
91
 
45
irq_handler:
92
irq_handler:
46
	str	r12, [sp,#-4]
93
	str	r12, [sp,#-4]
47
	ldr	r12, =current_thread
94
	ldr	r12, =current_thread
48
	ldr	r12, [r12]
95
	ldr	r12, [r12]
49
	stmia	r12!, {r0-r11}
96
	stmia	r12!, {r0-r11}
50
	ldr	r0, [sp,#-4]
97
	ldr	r0, [sp,#-4]
51
	mrs	r5, cpsr
98
	mrs	r5, cpsr
52
	mrs	r4, spsr
99
	mrs	r4, spsr
53
	orr	r6, r4, #0xc0
-
 
54
	msr	cpsr_c, r6
100
	msr	cpsr_c, #0xdf
55
	mov	r1, sp
101
	mov	r1, sp
56
	mov	r2, lr
102
	mov	r2, lr
-
 
103
	and	r3, r4, #0x1f
-
 
104
	cmp	r3, #0x13
-
 
105
	beq	was_in_svc_mode
57
	msr	cpsr_c, r5
106
	msr	cpsr_c, r5
58
	sub	r3, lr, #4
107
	sub	r3, lr, #4
-
 
108
enter_irqhandler:
59
	stmia	r12, {r0-r4}
109
	stmia	r12, {r0-r4}
60
	bl	irqhandler
110
	bl	irqhandler
61
@ fallthrough
111
@ fallthrough
62
 
112
 
63
.global resume_thread
113
.global resume_thread
Line 67... Line 117...
67
	ldr	lr, [lr]
117
	ldr	lr, [lr]
68
	mov	r0, lr
118
	mov	r0, lr
69
	ldr	r1, [lr,#0x40]
119
	ldr	r1, [lr,#0x40]
70
	ldr	lr, [lr,#0x3c]
120
	ldr	lr, [lr,#0x3c]
71
	msr	spsr_all, r1
121
	msr	spsr_all, r1
72
	orr	r1, r1, #0xc0
-
 
73
	msr	cpsr_c, r1
122
	msr	cpsr_c, 0xdf
74
	ldmia	r0, {r0-r14}
123
	ldmia	r0, {r0-r14}
75
	msr	cpsr_c, #0xd2
124
	msr	cpsr_c, #0xd2
76
	movs	pc, lr
125
	movs	pc, lr
77
.size irq_handler, .-irq_handler
126
.size irq_handler, .-irq_handler
78
.size resume_thread, .-resume_thread
127
.size resume_thread, .-resume_thread
Line 90... Line 139...
90
.type leave_critical_section, %function
139
.type leave_critical_section, %function
91
leave_critical_section:
140
leave_critical_section:
92
	msr	cpsr_c, r0
141
	msr	cpsr_c, r0
93
	mov	pc, lr
142
	mov	pc, lr
94
.size leave_critical_section, .-leave_critical_section
143
.size leave_critical_section, .-leave_critical_section
-
 
144
 
-
 
145
unknown_swi_string:
-
 
146
	.ascii "Unhandled SWI %08X\0"