aboutsummaryrefslogtreecommitdiff
path: root/scheduler.c
diff options
context:
space:
mode:
authorvetch <vetch97@gmail.com>2020-01-04 19:37:32 +0100
committervetch <vetch97@gmail.com>2020-01-04 19:37:32 +0100
commit615e3302c9dd358bb64cd56d1f3814ad8d5df84d (patch)
tree07b0469807eb3bff7ff7d3f3576858642bc66675 /scheduler.c
parent885a097da42317f48cead2d91c0e0240066943a8 (diff)
downloadrpi-MMU-example-615e3302c9dd358bb64cd56d1f3814ad8d5df84d.tar.gz
rpi-MMU-example-615e3302c9dd358bb64cd56d1f3814ad8d5df84d.zip
rearranged files, updated makefile
Diffstat (limited to 'scheduler.c')
-rw-r--r--scheduler.c156
1 files changed, 0 insertions, 156 deletions
diff --git a/scheduler.c b/scheduler.c
deleted file mode 100644
index 141ba1d..0000000
--- a/scheduler.c
+++ /dev/null
@@ -1,156 +0,0 @@
-#include "scheduler.h"
-#include "uart.h"
-#include "strings.h"
-#include "armclock.h"
-#include "memory.h"
-#include "io.h"
-
-// for now we only have 1 process in "queue"
-// later there is going to be an actual queue
-uint32_t PL0_regs[14] = {0}; // contains r0-r12, pc
-uint32_t PL0_sp;
-uint32_t PL0_lr;
-
-PSR_t PL0_PSR; // to be put into spsr when jumping to user mode
-
-PSR_t PL1_PSR;
-
-// when set, it means process used GETCHAR system call and once we get
-// a char, we have to return it
-_Bool waiting_for_input = 0;
-
-// when set, it means process used PUTCHAR system call and once we
-// manage to put the char, we can return to process
-_Bool waiting_for_output = 0;
-char waiting_output;
-
-// 0 is kernel code in system mode is being run
-// 1 if our process is being run
-// later when we have many processes and this will hold process id
-uint32_t current_process;
-
-void setup_scheduler_structures(void)
-{
- PL1_PSR = read_CPSR();
-}
-
-void scheduler_try_output(void)
-{
- if (waiting_for_output)
- if (!putchar_non_blocking(waiting_output))
- {
- waiting_for_output = 0;
- uart_send_irq_disable();
- }
-}
-
-void scheduler_try_input(void)
-{
- if (waiting_for_input)
- if ((PL0_regs[0] = getchar_non_blocking()) != (uint32_t) (-1))
- {
- waiting_for_input = 0;
- uart_recv_irq_disable();
- }
-}
-
-void __attribute__((noreturn))
-schedule_new(uint32_t pc, uint32_t sp)
-{
- PL0_regs[13] = pc;
- PL0_sp = sp;
- PL0_lr = 0;
-
- PL0_PSR = read_CPSR();
- PL0_PSR.fields.PSR_MODE_4_0 = MODE_USER;
- PL0_PSR.fields.PSR_IRQ_MASK_BIT = 0;
-
- schedule();
-}
-
-void __attribute__((noreturn))
-schedule_wait_for_output(uint32_t regs[14], char c)
-{
- if (current_process == 0)
- error("SYSTEM tried waiting for output!");
-
- waiting_for_output = 1;
- waiting_output = c;
- uart_send_irq_enable();
-
- schedule_save_context(regs);
-}
-
-void __attribute__((noreturn))
-schedule_wait_for_input(uint32_t regs[14])
-{
- if (current_process == 0)
- error("SYSTEM tried waiting for input!");
-
- waiting_for_input = 1;
- uart_recv_irq_enable();
-
- schedule_save_context(regs);
-}
-
-void __attribute__((noreturn))
-schedule_save_context(uint32_t regs[14])
-{
- memcpy(PL0_regs, regs, sizeof(PL0_regs));
-
- PL0_PSR = read_SPSR();
-
- asm volatile("cps %[sysmode]\n\r"
- "isb\n\r"
- "mov %[sp_transfer], sp\n\r"
- "mov %[lr_transfer], lr\n\r"
- "cps %[supmode]\n\r"
- "isb\n\r" :
- [sp_transfer]"=r" (PL0_sp),
- [lr_transfer]"=r" (PL0_lr):
- [sysmode]"I" (MODE_SYSTEM),
- [supmode]"I" (MODE_SUPERVISOR) : "memory");
-
- schedule();
-}
-
-void __attribute__((noreturn)) schedule(void)
-{
- current_process = 0;
- armclk_disable_timer_irq();
-
- if (waiting_for_input || waiting_for_output)
- {
- PSR_t new_CPSR = PL1_PSR;
- new_CPSR.fields.PSR_IRQ_MASK_BIT = 0;
-
- write_CPSR(new_CPSR);
-
- asm volatile("wfi");
-
- __builtin_unreachable();
- }
-
- current_process = 1;
-
- asm volatile("cps %[sysmode]\n\r"
- "isb\n\r"
- "mov sp, %[stackaddr]\n\r"
- "mov lr, %[linkaddr]\n\r"
- "cps %[supmode]\n\r"
- "isb" ::
- [sysmode]"I" (MODE_SYSTEM),
- [supmode]"I" (MODE_SUPERVISOR),
- [stackaddr]"r" (PL0_sp),
- [linkaddr]"r" (PL0_lr) : "memory");
-
- armclk_irq_settimeout(0x00100000);
- armclk_enable_timer_irq();
-
- write_SPSR(PL0_PSR);
-
- asm volatile("ldm %0, {r0 - r12, pc} ^" ::
- "r" (PL0_regs) : "memory");
-
- __builtin_unreachable();
-}