aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Cunningham <cc@localhost>2022-01-23 17:16:23 -0700
committerChristian Cunningham <cc@localhost>2022-01-23 17:16:23 -0700
commitfff7e6dae85af08ca98ac13315bea166946a690c (patch)
tree7f3946a16418c42aaeb019f26075e8037a53a97c
parentd085707a1054df197a8695a3a822687dd1a16022 (diff)
Added SVC jumps
-rw-r--r--src/boot.S29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/boot.S b/src/boot.S
index 5c157e0..1faf860 100644
--- a/src/boot.S
+++ b/src/boot.S
@@ -136,30 +136,37 @@ svc:
// SVC #0 returns to supervisor mode
// TODO: Make supervisor mode return to a specific location
// (rather than to a user location) such as the kernel loop
- cmp r0, #0
- bne 3f
- cps #0x13
- b 1f
-3:
+ cmp r0, #3
+ bgt svc_exit
+ beq svc_000003
cmp r0, #2
- bne 2f
+ beq svc_000002
+ cmp r0, #1
+ beq svc_000001
+ cmp r0, #1
+ beq svc_000000
+svc_000000:
+ cps #0x13
+ b svc_exit
+svc_000001:
+ b svc_exit
+svc_000002:
ldmfd sp!, {r0-r12,lr}
b schedule
-2:
- cmp r0, #3
- bne 1f
+svc_000003:
ldr r3, =scheduler
ldr r2, [r3, #0]
ldr r1, [r2, #8] // sp_base
cmp r1, #-1
- beq 1f
+ beq svc_exit
ldr r3, =stacks_table
mov r0, #0
strb r0, [r3, r1]
// Free the thread after freeing the stack
mov r0, r2
bl free
-1:
+ b svc_exit
+svc_exit:
ldmfd sp!, {r0-r12,pc}^
prefetch:
stmfd sp!, {r0-r12,lr}