summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-03-02 20:30:55 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-03-02 20:30:55 +0100
commitfbc2cc52c8a38c3c63a34f5547ba7c4209a667ac (patch)
tree985e3b96308123dc1771abfc30e9fe4f8daac5f4 /kernel/src/scheduler
parent1e1c00c09991846257af4c8e50a177178355d986 (diff)
scheduling usermode processes & code refactoring
Diffstat (limited to 'kernel/src/scheduler')
-rw-r--r--kernel/src/scheduler/process.c20
-rw-r--r--kernel/src/scheduler/scheduler.c18
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);
}