diff options
Diffstat (limited to 'kernel/src/scheduler')
| -rw-r--r-- | kernel/src/scheduler/process.c | 60 | ||||
| -rw-r--r-- | kernel/src/scheduler/scheduler.c | 8 | ||||
| -rw-r--r-- | kernel/src/scheduler/switch.S | 4 |
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 |
