From 6e77fbc32363253835124bab7c0b36185da1356a Mon Sep 17 00:00:00 2001 From: RaphProductions <81994075+RaphProductions@users.noreply.github.com> Date: Sun, 11 May 2025 17:29:59 +0200 Subject: [PATCH] sched: fix a dumb stack bug inside the scheduler --- kernel/src/sched/sched.c | 14 ++++++++------ kernel/src/sys/arch/x86_64/gdt.c | 6 ++++-- kernel/src/sys/syscall.c | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/kernel/src/sched/sched.c b/kernel/src/sched/sched.c index d358fff..907f83a 100644 --- a/kernel/src/sched/sched.c +++ b/kernel/src/sched/sched.c @@ -34,6 +34,8 @@ void sched_init() { memcpy(proc_list->name, "System\0", 7); proc_list->pid = -1; proc_list->type = SCHED_EMPTY; + proc_list->flags = SCHED_KERNEL_PROCESS; + proc_list->pm = vmm_kernel_pm; curr_proc = proc_list; @@ -71,13 +73,13 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm, if (flags == SCHED_KERNEL_PROCESS) { proc->stack_base = stack_phys; proc->stack_base_physical = stack_phys; - proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE; + proc->stack_end = proc->stack_base + PMM_PAGE_SIZE; } else if (flags == SCHED_USER_PROCESS) { vmm_map_user(proc->pm, (uint64_t)stack_virt, (uint64_t)stack_phys, VMM_PRESENT | VMM_WRITABLE | VMM_USER); proc->stack_base = stack_virt; proc->stack_base_physical = stack_phys; - proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE; + proc->stack_end = proc->stack_base + PMM_PAGE_SIZE; } proc->regs.rip = (uint64_t)entry_point; @@ -85,8 +87,8 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm, proc->regs.cs = 0x28; // Run in kernel mode proc->regs.ss = 0x30; } else if (flags == SCHED_USER_PROCESS) { - proc->regs.cs = 0x43; // Run in user mode - proc->regs.ss = 0x3B; + proc->regs.cs = 0x38 | 3; // Run in user mode + proc->regs.ss = 0x40 | 3; } proc->regs.rflags = 0x202; // Enable interrupts proc->regs.rsp = (uint64_t)proc->stack_end; @@ -153,9 +155,9 @@ void schedule(registers_t *regs) { if (curr_proc == NULL) curr_proc = proc_list; - log("sched - I choosed process %d\n", curr_proc->pid); + //log("sched - I choosed process %d\n", curr_proc->pid); - // log("sched - I choosed process %d\n", curr_proc->pid); + //log("sched - I choosed process %d (pm: %s, rip: %p)\n", curr_proc->pid, curr_proc->pm == vmm_kernel_pm ? "kernel" : "user", curr_proc->regs.rip); memcpy(regs, &curr_proc->regs, sizeof(registers_t)); // Finally, load our pagemap diff --git a/kernel/src/sys/arch/x86_64/gdt.c b/kernel/src/sys/arch/x86_64/gdt.c index e528eff..61b6ae4 100644 --- a/kernel/src/sys/arch/x86_64/gdt.c +++ b/kernel/src/sys/arch/x86_64/gdt.c @@ -16,8 +16,8 @@ gdt_table def_table = {{ 0x00af9b000000ffff, // 0x28 64 bit code cs 0x00af93000000ffff, // 0x30 64 bit data ss - 0x00aff3000000ffff, // 0x38 data ss - 0x00affb000000ffff, // 0x40 user mode code cs + 0x00affb000000ffff, // 0x38 user mode code cs + 0x00aff3000000ffff, // 0x40 user mode data ss }, {}}; @@ -26,7 +26,9 @@ tssr tss_list[256]; // One tssr per CPU void gdt_init(char *kstack) { // TODO: adapt for multiprocessor kernel + memset(&tss_list[0], 0, sizeof(tssr)); tss_list[0].rsp[0] = (uint64_t)kstack; + tss_list[0].iopb = sizeof(tssr); uintptr_t tss = (uintptr_t)&tss_list[0]; def_table.tss_entry.length = sizeof(tss_entry); diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c index c87134e..0a3567c 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -18,7 +18,7 @@ void syscall_handle(registers_t *regs) { return; } - if (curr_proc == NULL || curr_proc->regs.cs != 0x43) { + if (curr_proc == NULL || curr_proc->regs.cs != 0x3B) { log("syscall - syscall_handle was called by the kernel. is this wanted?\n"); return; }