aboutsummaryrefslogtreecommitdiff
path: root/src/sys/schedule.S
diff options
context:
space:
mode:
authorChristian Cunningham <cc@localhost>2022-01-21 18:52:25 -0700
committerChristian Cunningham <cc@localhost>2022-01-21 18:52:25 -0700
commit0d551d712c098d6ebb75512340d7503da98361b4 (patch)
treead01fa489a37f70e3dd4e94bd22dc67381e05710 /src/sys/schedule.S
parentc7c1702dc66f5be0f8f07703e2c8e9f5bd8db80d (diff)
Got some scheduling
Diffstat (limited to 'src/sys/schedule.S')
-rw-r--r--src/sys/schedule.S32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/sys/schedule.S b/src/sys/schedule.S
index f80b707..6b6ef1c 100644
--- a/src/sys/schedule.S
+++ b/src/sys/schedule.S
@@ -12,7 +12,7 @@
ldr r2, [r3, #0] // struct Thread* rthread
str lr, [r2, #0] // svc_lr -> void* pc
str sp, [r2, #4] // svc_lr -> void* sp
- cps #0x10 // Svc mode
+ cps #0x13 // Svc mode
.endm
.macro restore_ctx
@@ -25,7 +25,7 @@
// Restore Usr regs
ldmfd sp!, {lr}
ldmfd sp!, {r0-r12}
- cps #0x10 // Svc mode
+ cps #0x13 // Svc mode
.endm
// Assumption: Enter in SVC mode
@@ -41,12 +41,34 @@ schedule:
mov r0, #0
str r0, [r1]
1:
- // bl get_next_thread // next_thread -> r0
+ bl next_thread // Thread* next -> r0
ldr r3, =scheduler
- ldr r2, [r3, #0] // struct Thread* current
+ ldr r2, [r3, #0] // Thread* current
cmp r0, r2 // current = next?
beq 2f
str r0, [r3, #0] // next -> rthread
2:
restore_ctx
- movs pc, lr
+ subs pc, lr, #0
+
+.globl cleanup
+cleanup:
+ // roffset++
+ bl get_rthread_roffset
+ ldr r1, [r0, #0]
+ add r1, #1
+ str r1, [r0, #0]
+ // usrloop -> rthread
+ ldr r2, =usrloopthread
+ str r2, [r3, #0]
+ ldr sp, [r2, #4]
+ ldmfd sp!,{lr}
+ ldmfd sp!,{r0-r12}
+ ldr lr, =kernel_usr_task_loop
+ // svc sched
+ svc #2
+.globl kernel_usr_task_loop
+kernel_usr_task_loop:
+ wfe
+ //svc #2
+ b kernel_usr_task_loop