diff options
| author | Christian Cunningham <cc@localhost> | 2022-01-11 09:32:31 -0700 | 
|---|---|---|
| committer | Christian Cunningham <cc@localhost> | 2022-01-11 09:32:31 -0700 | 
| commit | 516df5812ac64d87ac2e32ebf0211534ea0abaa7 (patch) | |
| tree | 2850df144c282e96dfa15a6413b3ba0a29cdf9c4 /src/sys/schedule.S | |
| parent | 6d4d2fe7fc4a0d2c70b64d9c232ef2758dd8bf80 (diff) | |
Update stuff
Diffstat (limited to 'src/sys/schedule.S')
| -rw-r--r-- | src/sys/schedule.S | 86 | 
1 files changed, 48 insertions, 38 deletions
diff --git a/src/sys/schedule.S b/src/sys/schedule.S index 302c4d8..aa33942 100644 --- a/src/sys/schedule.S +++ b/src/sys/schedule.S @@ -1,32 +1,52 @@ -.section .text +.section ".text"  .globl schedule  // TODO: Implement Scheduler for IRQ + +// Save Context +// reg = struct cpu_context* +.macro save_context reg +	str r4,  [\reg, #0x00] +	str r5,  [\reg, #0x04] +	str r6,  [\reg, #0x08] +	str r7,  [\reg, #0x0c] +	str r8,  [\reg, #0x10] +	str r9,  [\reg, #0x14] +	str r10, [\reg, #0x18] +	str r11, [\reg, #0x1c] +	str r12, [\reg, #0x20] +	str lr,  [\reg, #0x24] +.endm +// Restore Context +// reg = struct cpu_context* +.macro restore_context reg +	ldr r4, [\reg, #0x00] +	ldr r5, [\reg, #0x04] +	ldr r6, [\reg, #0x08] +	ldr r7, [\reg, #0x0c] +	ldr r8, [\reg, #0x10] +	ldr r9, [\reg, #0x14] +	ldr r10, [\reg, #0x18] +	ldr r11, [\reg, #0x1c] +	ldr r12, [\reg, #0x20] +	ldr lr , [\reg, #0x24] +.endm +  // Implemented the scheduler in Assembly since the C defined was messing around with the program stacks  //  This way, I can be confident that the stacks will be unchanged  schedule:  	ldr r3, =scheduler -	// r3 = struct Scheduler*  	// Preserve context -	//add r0, r3, #4 // struct cpu_context* ctx  	ldr r0, [r3, #4]  	// r0 = struct cpu_context* -	str r4,  [r0, #0x00] -	str r5,  [r0, #0x04] -	str r6,  [r0, #0x08] -	str r7,  [r0, #0x0c] -	str r8,  [r0, #0x10] -	str r9,  [r0, #0x14] -	str r10, [r0, #0x18] -	str r11, [r0, #0x1c] -	str r12, [r0, #0x20] -	str lr,  [r0, #0x24] +	save_context r0  	// Get the next available thread -	push {r3, lr} +	push {r1-r3, lr}  	bl get_next_thread -	// r0 = struct LL* next_thread_ll -	pop {r3, lr} +	pop {r1-r3, lr}  	ldr r1,  [r3, #0]  +	// r3 = struct Scheduler* +	// r0 = struct LL* next_thread_ll  	// r1 = struct LL* current_thread_ll  	// Check if there is a valid currently running thread  	cmp r1, #0 @@ -34,11 +54,20 @@ schedule:  schedule.current_thread_exists:  	cmp r0, r1  	beq schedule.run_current +	cmp r0, #0 +	moveq r0, r1 // Make the current running thread the next running thread if no next running thread  	// Next is not the same as the current  	// Preserve stack of current  	ldr r2,  [r1, #0x8] // struct Thread* current +	ldrh r1, [r2, #0x0e] +	cmp r1, #2 // THREAD_WAITING +	beq schedule.temp_status +	cmp r1, #1 // THREAD_RUNNING +	bne schedule.dont_modify_status +schedule.temp_status:  	mov r1, #0 // THREAD_READY  	strh r1, [r2, #0x0e] +schedule.dont_modify_status:  	str sp,  [r2, #0x4] // void* stack // Preserve stack  	// Preserve program counter of current  	str lr,  [r2, #0x0] // void* thread // Preserve pc @@ -84,16 +113,7 @@ schedule.dont_overwrite_sys_stack:  schedule.run_current:  	// Restore context  	ldr r2,  [r3, #0x4] // struct cpu_context* ctx // Set new context -	ldr r4,  [r2, #0x00] -	ldr r5,  [r2, #0x04] -	ldr r6,  [r2, #0x08] -	ldr r7,  [r2, #0x0c] -	ldr r8,  [r2, #0x10] -	ldr r9,  [r2, #0x14] -	ldr r10, [r2, #0x18] -	ldr r11, [r2, #0x1c] -	ldr r12, [r2, #0x20] -	ldr lr,  [r2, #0x24] +	restore_context r2  	// Run  	ldr r1, [r3, #0]  	// r1 = struct LL* rthread_ll @@ -117,17 +137,7 @@ schedule.no_next_thread:  	mov r1, #0  	str r1, [r0] // Clear stack pointer  schedule.exit: -	// Restore context -	ldr r2,  [r3, #0x4] // struct cpu_context* ctx // Set new context  	// Restore register context -	ldr r4,  [r2, #0x00] -	ldr r5,  [r2, #0x04] -	ldr r6,  [r2, #0x08] -	ldr r7,  [r2, #0x0c] -	ldr r8,  [r2, #0x10] -	ldr r9,  [r2, #0x14] -	ldr r10, [r2, #0x18] -	ldr r11, [r2, #0x1c] -	ldr r12, [r2, #0x20] -	ldr lr,  [r2, #0x24] +	ldr r2,  [r3, #0x4] // struct cpu_context* ctx // Set new context +	restore_context r2  	bx lr  | 
