-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcontext_switch.S
89 lines (69 loc) · 1.27 KB
/
context_switch.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "syscall_number.h"
.syntax unified
.global get_pid
get_pid:
svc GET_PID_SVC_NUMBER
bx lr
.global sleep
sleep:
svc SLEEP_SVC_NUMBER
bx lr
.global get_ticks
get_ticks:
svc GET_TICKS_SVC_NUMBER
bx lr
.global sbrk
sbrk:
svc SBRK_SVC_NUMBER
bx lr
.global register_fifo
register_fifo:
svc REGISTER_FIFO_SVC_NUMBER
bx lr
.global unregister_fifo
unregister_fifo:
svc UNREGISTER_FIFO_SVC_NUMBER
bx lr
.global attach_fifo
attach_fifo:
svc ATTACH_FIFO_SVC_NUMBER
bx lr
.global send
send:
svc SEND_SVC_NUMBER
bx lr
.global receive
receive:
svc RECEIVE_SVC_NUMBER
bx lr
.global write_fifo
write_fifo:
svc WRITE_FIFO_SVC_NUMBER
bx lr
.global read_fifo
read_fifo:
push {r0}
svc READ_FIFO_SVC_NUMBER
cmp r0, #0
itttt eq
moveq r0, #20
svceq SLEEP_SVC_NUMBER
popeq {r0}
beq read_fifo
bx lr
.global read_fifo_nb
read_fifo_nb:
svc READ_FIFO_SVC_NUMBER
bx lr
.global activate
activate:
/* save kernel state in ip register */
mrs ip, psr
push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr}
/* load user state */
ldmia r0!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
/* switch to process stack */
msr psp, r0
mov r0, #2
msr control, r0
bx lr