summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/scheduler')
-rw-r--r--kernel/src/scheduler/process.c60
-rw-r--r--kernel/src/scheduler/scheduler.c8
-rw-r--r--kernel/src/scheduler/switch.S4
3 files changed, 69 insertions, 3 deletions
diff --git a/kernel/src/scheduler/process.c b/kernel/src/scheduler/process.c
index e69de29..e85cc11 100644
--- a/kernel/src/scheduler/process.c
+++ b/kernel/src/scheduler/process.c
@@ -0,0 +1,60 @@
+#include <types.h>
+#include <regs.h>
+#include <heap.h>
+#include <scheduler.h>
+#include <libk/list.h>
+#include <process.h>
+
+process_t process_queue;
+process_t *curr_process;
+
+void init_process(uint64_t priv_lvl, uint64_t rip, uint64_t rdi, uint64_t rsi,
+ uint64_t rdx)
+{
+ uint32_t stack_size = 32 * 1024;
+ uint64_t rsp = (uint64_t)kalloc(stack_size) + stack_size;
+ regs_t *regs = (regs_t *)(rsp + sizeof(regs_t));
+
+ regs->rax = 0;
+ regs->rbx = 0;
+ regs->rcx = 0;
+ regs->rdx = rdx;
+ regs->rdi = rdi;
+ regs->rsi = rsi;
+ regs->rsp = rsp;
+ regs->rbp = 0;
+ regs->r8 = 0;
+ regs->r9 = 0;
+ regs->r10 = 0;
+ regs->r11 = 0;
+ regs->r12 = 0;
+ regs->r13 = 0;
+ regs->r14 = 0;
+ regs->r15 = 0;
+ regs->rip = rip;
+ regs->rflags = 0;
+ regs->error = 0;
+
+ if (priv_lvl == 0) {
+ regs->cs = 0x8;
+ regs->ss = 0x10;
+ regs->seg = 0x0010001000100010;
+ } else {
+ regs->cs = 0x23;
+ regs->ss = 0x1b;
+ regs->seg = 0x001b001b001b001b;
+ }
+
+ process_t *new_process = (process_t *)kalloc(sizeof(process_t));
+ add_to_list(&new_process->list, &process_queue.list,
+ process_queue.list.next);
+}
+
+__attribute__((noreturn)) void context_switch(uint64_t irq_rsp)
+{
+ save_context_to_rsp(irq_rsp, curr_process->rsp);
+
+ process_t *next_process = scheduler();
+
+ restore_context_from_rsp(next_process->rsp);
+}
diff --git a/kernel/src/scheduler/scheduler.c b/kernel/src/scheduler/scheduler.c
index b8f3dab..263c11a 100644
--- a/kernel/src/scheduler/scheduler.c
+++ b/kernel/src/scheduler/scheduler.c
@@ -1,6 +1,12 @@
#include <types.h>
#include <scheduler.h>
+#include <libk/list.h>
+#include <process.h>
-void schedule(void)
+process_t *scheduler(void)
{
+ process_t *pos = curr_process;
+ process_t *next_process = list_next_entry(pos, list);
+
+ return next_process;
}
diff --git a/kernel/src/scheduler/switch.S b/kernel/src/scheduler/switch.S
index 4e216e0..4d5dfb6 100644
--- a/kernel/src/scheduler/switch.S
+++ b/kernel/src/scheduler/switch.S
@@ -2,7 +2,7 @@
/* %rdi - irq's rsp */
/* %rsi - task's rsp */
-.global save_to_rsp
+.global save_context_to_rsp
save_context_to_rsp:
mov %rsi, %rsp
push SS_OFF(%rdi)
@@ -29,7 +29,7 @@ save_context_to_rsp:
push R15_OFF(%rdi)
/* %rdi - task's rsp */
-.global restore_from_rsp
+.global restore_context_from_rsp
restore_context_from_rsp:
mov %rdi, %rsp
pop_callee_saved