diff options
Diffstat (limited to 'kc/core/task.c')
| -rw-r--r-- | kc/core/task.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kc/core/task.c b/kc/core/task.c index 8f78516..b825f01 100644 --- a/kc/core/task.c +++ b/kc/core/task.c @@ -2,6 +2,7 @@ #include "memory.h" #include "panic.h" #include "cpu.h" +#include "kprint.h" struct kc_thread *current_task = NULL; struct kc_thread *first_ready_task = NULL; @@ -72,5 +73,42 @@ static void set_thread_status(enum kc_thread_status status) static void idle_task_thread(void) { + kputs("in idle thread\n"); + while (1) + { + __asm__ volatile ("hlt;"); + } + kputs("scheduling\n"); + lock_scheduler(); + task_schedule(); + unlock_scheduler(); +} + +noreturn void task_init(void) +{ + char *kernel_rsp0 = vm_alloc(4096); + // TODO: make it so this isn't demand-allocated. + kernel_rsp0[1] = 0; + *get_tss_rsp0() = (uintptr_t)kernel_rsp0; + char *first_task = vm_alloc(16384); + struct kc_thread *idle_thread = + (struct kc_thread *)(first_task + 16384 - sizeof(*idle_thread)); + idle_thread->state.stack = (uintptr_t)idle_thread; + idle_thread->state.stack_top = (uintptr_t)kernel_rsp0; + + __asm__ volatile + ( + "mov %%cr3, %%rax\n\t" + "mov %%rax, 0(%%rsi)\n\t" + "mov %%rcx, %%rsp\n\t" + "jmp idle_task_thread\n\t" + : "=m"(idle_thread->state.page_map) + : "S"(&idle_thread->state.page_map), + "c"(idle_thread) + : "rax" + ); + + // shouldn't ever get here + panic(GENERAL_PANIC); } |
