summaryrefslogtreecommitdiff
path: root/kernel/sched/scheduler.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-02-17 16:45:16 +0100
committerAnton Kling <anton@kling.gg>2024-02-17 16:45:16 +0100
commit61c443579150a4714c132ecb1ac18779535f91c9 (patch)
treec1d83ed763b9d16051abd9fd921bb9815e710c70 /kernel/sched/scheduler.c
parent413d09388bf33c658f3e71b18e4b069f18461393 (diff)
cleanup
Diffstat (limited to 'kernel/sched/scheduler.c')
-rw-r--r--kernel/sched/scheduler.c74
1 files changed, 12 insertions, 62 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c
index 9ed6552..8cb5af7 100644
--- a/kernel/sched/scheduler.c
+++ b/kernel/sched/scheduler.c
@@ -5,6 +5,7 @@
#include <elf.h>
#include <errno.h>
#include <fs/vfs.h>
+#include <interrupts.h>
// FIXME: Use the process_t struct instead or keep this contained in it.
TCB *current_task_TCB;
@@ -184,8 +185,6 @@ void tasking_init(void) {
current_task = ready_queue = create_process(NULL, 0, 0);
current_task_TCB = current_task->tcb;
current_task->tcb->CR3 = current_task->cr3->physical_address;
- // // Switch to itself to update the internal values
- // switch_task(0);
}
int i = 0;
@@ -240,8 +239,7 @@ void exit(int status) {
tmp = tmp->next;
}
current_task->dead = 1;
- // This function will enable interrupts
- switch_task(1);
+ switch_task();
}
u32 setup_stack(u32 stack_pointer, int argc, char **argv) {
@@ -308,40 +306,6 @@ int exec(const char *filename, char **argv) {
ASSERT_NOT_REACHED;
return 0;
}
-/*
-int fork(void) {
- process_t *parent_task = (process_t *)current_task;
-
- process_t *new_task = create_process(parent_task);
-
- process_t *tmp_task = (process_t *)ready_queue;
- for (; tmp_task->next;)
- tmp_task = tmp_task->next;
-
- tmp_task->next = new_task;
-
- u32 eip = read_eip();
-
- if (current_task != parent_task) {
- return 0;
- }
-
- new_task->child_rc = -1;
- new_task->parent = current_task;
- current_task->child = new_task;
-
- new_task->eip = eip;
- asm("\
- mov %%esp, %0;\
- mov %%ebp, %1;"
- : "=r"(new_task->esp), "=r"(new_task->ebp));
- asm("\
- mov %%esp, %0;"
- : "=r"(new_task->tcb->ESP));
- asm("sti");
- return new_task->pid;
-}
-*/
process_t *internal_fork(process_t *parent);
int fork(void) {
@@ -378,7 +342,15 @@ int is_halted(process_t *process) {
extern PageDirectory *active_directory;
process_t *next_task(process_t *c) {
+ process_t *s = c;
+ int loop = 0;
for (;;) {
+ if (s == c) {
+ if (1 == loop) {
+ return s;
+ }
+ loop = 1;
+ }
c = c->next;
if (!c)
c = ready_queue;
@@ -393,24 +365,6 @@ process_t *next_task(process_t *c) {
return c;
}
-int task_save_state() {
- asm("mov %%esp, %0" : "=r"(current_task->esp));
- asm("mov %%ebp, %0" : "=r"(current_task->ebp));
-
- u32 eip = read_eip();
-
- if (0x1 == eip) {
- // Should the returned value from read_eip be equal to one it
- // means that we have just switched over to this task after we
- // saved the state(since the switch_task() function changes the
- // eax register to 1).
- return 0;
- }
-
- current_task->eip = eip;
- return 1;
-}
-
int kill(pid_t pid, int sig) {
process_t *p = current_task;
p = p->next;
@@ -429,15 +383,11 @@ int kill(pid_t pid, int sig) {
return 0;
}
-void jump_signal_handler(void *func, u32 esp);
-
-void none_save_switch() {
-}
-
-void switch_task(int save) {
+void switch_task() {
if (!current_task) {
return;
}
+ disable_interrupts();
current_task = next_task((process_t *)current_task);
active_directory = current_task->cr3;