From ed7b9318bc9ac285250b117f87f47fe7f84af51b Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Fri, 21 Jan 2022 12:55:57 -0700 Subject: Added scheduling logic --- src/sys/schedule.S | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'src/sys/schedule.S') diff --git a/src/sys/schedule.S b/src/sys/schedule.S index 298646a..4913034 100644 --- a/src/sys/schedule.S +++ b/src/sys/schedule.S @@ -1,26 +1,49 @@ .section ".text" .globl schedule - -// Implicit: SVC Mode .macro preserve_ctx cps #0x1f // Sys mode - push {r0-r12, lr} // Restore usr regs - cps #0x10 // Svc mode + // Store Usr regs + stmfd sp!, {r0-r12} + stmfd sp!, {lr} ldr r3, =scheduler // struct Scheduler - ldr r3, [r3, #4] // struct Thread* rthread - str lr, [r3, #0] // svc_lr -> void* pc + 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 .endm .macro restore_ctx ldr r3, =scheduler // struct Scheduler - ldr r3, [r3, #4] // struct Thread* rthread - ldr lr, [r3, #0] // void* pc -> lr_svc + ldr r2, [r3, #0] // struct Thread* rthread + ldr lr, [r2, #0] // void* pc -> lr_svc + ldr r0, [r2, #4] // void* sp -> r0 cps #0x1f // Sys mode - pop {r0-r12,lr} // Restore usr regs + mov sp, r0 // Set stack pointer + // Restore Usr regs + ldmfd sp!, {lr} + ldmfd sp!, {r0-r12} cps #0x10 // Svc mode .endm +// Assumption: Enter in SVC mode schedule: - //preserve_ctx - //restore_ctx - //bx lr + preserve_ctx + ldr r1, =irqlr + ldr r0, [r1] + cmp r0, #0 + beq 1f + // Replace LR with IRQ's LR + mov lr, r0 + // Clear IRQ's LR + mov r0, #0 + str r0, [r1] +1: + // bl get_next_thread // next_thread -> r0 + ldr r3, =scheduler + ldr r2, [r3, #0] // struct Thread* current + cmp r0, r2 // current = next? + beq 2f + str r0, [r3, #0] // next -> rthread +2: + restore_ctx + movs pc, lr -- cgit v1.2.1