diff options
| author | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-03-02 20:30:55 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-03-02 20:30:55 +0100 |
| commit | fbc2cc52c8a38c3c63a34f5547ba7c4209a667ac (patch) | |
| tree | 985e3b96308123dc1771abfc30e9fe4f8daac5f4 /kernel/src/scheduler | |
| parent | 1e1c00c09991846257af4c8e50a177178355d986 (diff) | |
scheduling usermode processes & code refactoring
Diffstat (limited to 'kernel/src/scheduler')
| -rw-r--r-- | kernel/src/scheduler/process.c | 20 | ||||
| -rw-r--r-- | kernel/src/scheduler/scheduler.c | 18 |
2 files changed, 15 insertions, 23 deletions
diff --git a/kernel/src/scheduler/process.c b/kernel/src/scheduler/process.c index e057df0..0b383bf 100644 --- a/kernel/src/scheduler/process.c +++ b/kernel/src/scheduler/process.c @@ -35,7 +35,7 @@ process_t *init_process(uint64_t priv_lvl, uint64_t rip, uint64_t argc, regs->r14 = 0; regs->r15 = 0; regs->rip = (uint64_t)process_init_wrapper; - regs->rflags = 0; + regs->rflags = 0x202; regs->error = 0; if (priv_lvl == 0) { @@ -87,20 +87,7 @@ void process_init_wrapper(uint64_t rip, uint64_t argc, uint64_t *argv) __attribute__((noreturn)) void idle_thread() { - printf("idle_thread()\n"); for (;;) { - printf("1"); - wait(2000); - __asm__ __volatile__("pause; hlt;"); - } -} - -__attribute__((noreturn)) void idle_thread2() -{ - printf("idle_thread2()\n"); - for (;;) { - printf("2"); - wait(1000); __asm__ __volatile__("pause; hlt;"); } } @@ -111,10 +98,7 @@ __attribute__((noreturn)) void remove_current_process() kfree(curr_process); curr_process = scheduler(); if (curr_process == NULL) { - printf("no processes left\n"); - for (;;) { - __asm__ __volatile__("pause; hlt;"); - } + panic(0, "no processes left\n"); } restore_context_from_rsp(curr_process->rsp); } diff --git a/kernel/src/scheduler/scheduler.c b/kernel/src/scheduler/scheduler.c index 91e5ddd..28e2cae 100644 --- a/kernel/src/scheduler/scheduler.c +++ b/kernel/src/scheduler/scheduler.c @@ -7,19 +7,27 @@ #include <libk/stdio.h> #include <panic.h> #include <regs.h> +#include <userspace.h> +#include <apic.h> mutex_t scheduler_lock; uint32_t sched_init = 0; __attribute__((noreturn)) void init_scheduler() { + uint32_t argc; + uint64_t *argv; + INIT_LIST(process_queue.list); init_mutex(&scheduler_lock); - uint64_t argc = 6; - uint64_t *argv = (uint64_t *)kalloc(sizeof(uint64_t) * 6); - memset(argv, 0, sizeof(uint64_t) * 6); - init_process(0, (uint64_t)idle_thread2, argc, argv); - curr_process = init_process(0, (uint64_t)idle_thread, argc, argv); + + argc = 1; + argv = (uint64_t *)kalloc(argc * sizeof(uint64_t)); + memset(argv, 0, sizeof(uint64_t) * argc); + init_process(0, (uint64_t)idle_thread, argc, argv); + curr_process = init_process(0, (uint64_t)init_ap_cpus, argc, argv); + init_process(3, (uint64_t)begin_userspace, argc, argv); + sched_init = 1; restore_context_from_rsp(curr_process->rsp); } |
