From 3f9b78b05e9629d43a09ebf68ad5284ada47c581 Mon Sep 17 00:00:00 2001 From: xamidev Date: Mon, 9 Mar 2026 09:27:55 +0100 Subject: [PATCH] Scheduler returns to IDLE when.. idle. --- README.md | 1 + src/idt/idt.c | 3 +-- src/kernel.h | 3 +-- src/kmain.c | 16 ++++++++++------ src/sched/process.c | 4 ++-- src/sched/scheduler.c | 10 +++++----- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 113bfb2..70a26f1 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,4 @@ PepperOS wouldn't be possible without the following freely-licensed software: - the [OSDev](https://osdev.org) wiki & forums - Intel 64 and IA-32 Architectures Software Developer's Manual +- Documentation for the [GNU Compiler Collection](https://gcc.gnu.org/onlinedocs/gcc/) \ No newline at end of file diff --git a/src/idt/idt.c b/src/idt/idt.c index bab6525..5b9504b 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -52,8 +52,7 @@ void idt_load(void* idt_addr) void idt_init() { - // We set 256 entries, but we have only the first few stubs. - // Undefined behavior? + // Hardcoded... for (size_t i=0; i<=33; i++) { // Each vector handler is 16-byte aligned, so *16 = address of that handler diff --git a/src/kernel.h b/src/kernel.h index a8f59ba..f7dd570 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -23,8 +23,7 @@ enum ErrorCodes extern volatile uint64_t ticks; -#define DEBUG(log, ...) fctprintf((void*)&skputc, 0, "[%8u] debug: [%s]: " log "\r\n", ticks, __FILE__, ##__VA_ARGS__) - +#define DEBUG(log, ...) fctprintf((void*)&skputc, 0, "[%8u] debug: <%s>: " log "\r\n", ticks, __func__, ##__VA_ARGS__) /* #define DEBUG(log, ...) \ printf("debug: [%s]: " log "\r\n", __FILE__, ##__VA_ARGS__); \ diff --git a/src/kmain.c b/src/kmain.c index 557c10a..5c38aa3 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -50,16 +50,24 @@ extern volatile struct limine_kernel_address_request kerneladdr_request; extern struct process_t* processes_list; extern struct process_t* current_process; +struct process_t* idle_proc; +bool iran = false; + +// Never gets executed although pedicel is scheduled? void pedicel_main(void* arg) { + bool iran = true; // FROM THE NEXT LINE ONWARDS, CANNOT WRITE TO FRAMEBUFFER WITHOUT PAGE FAULT! //printf("\n\nWelcome to PepperOS! Pedicel speaking.\nNothing left to do, halting the system!"); } void idle_main(void* arg) { - for(;;)asm("hlt"); + for (;;) + { + asm("hlt"); + } } extern uintptr_t kheap_start; @@ -94,17 +102,13 @@ void kmain() idt_init(); process_init(); - struct process_t* idle_proc = process_create("idle", (void*)idle_main, 0); + idle_proc = process_create("idle", (void*)idle_main, 0); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); process_display_list(processes_list); scheduler_init(); - current_process = idle_proc; - current_process->status = RUNNING; - kputs(PEPPEROS_SPLASH); - //panic(NULL, "Test panic"); idle(); } diff --git a/src/sched/process.c b/src/sched/process.c index e0fc25b..484f7dc 100644 --- a/src/sched/process.c +++ b/src/sched/process.c @@ -45,7 +45,7 @@ void process_display_list(struct process_t* processes_list) struct process_t* process_create(char* name, void(*function)(void*), void* arg) { -/* CLEAR_INTERRUPTS; */ + CLEAR_INTERRUPTS; struct process_t* proc = (struct process_t*)kmalloc(sizeof(struct process_t)); struct cpu_status_t* ctx = (struct cpu_status_t*)kmalloc(sizeof(struct cpu_status_t)); @@ -79,7 +79,7 @@ struct process_t* process_create(char* name, void(*function)(void*), void* arg) process_add(&processes_list, proc); -/* SET_INTERRUPTS; */ + SET_INTERRUPTS; return proc; } diff --git a/src/sched/scheduler.c b/src/sched/scheduler.c index e1b3299..14a3fe0 100644 --- a/src/sched/scheduler.c +++ b/src/sched/scheduler.c @@ -12,6 +12,7 @@ extern struct process_t* processes_list; extern struct process_t* current_process; +extern struct process_t* idle_proc; void scheduler_init() { @@ -28,9 +29,8 @@ struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) if (current_process == NULL) { - // Wtf happened - current_process = processes_list; - //panic(NULL, "Scheduler called without current process"); + // If no more processes, then set IDLE as the current process, that's it. + current_process = idle_proc; } current_process->context = context; @@ -49,15 +49,15 @@ struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) if (current_process != NULL && current_process->status == DEAD) { process_delete(&prev_process, current_process); + current_process = NULL; + return idle_proc->context; } else { current_process->status = RUNNING; break; } } - - // Current_process gets wrong context?? (iret_rip points to other stuff than process function; like putpixel() for example) DEBUG("current_process={pid=%u, name='%s', root_page_table[virt]=%p}", current_process->pid, current_process->name, current_process->root_page_table); load_cr3(VIRT_TO_PHYS((uint64_t)current_process->root_page_table));