working on getting a unified stack setup for user and kernel tasks

This commit is contained in:
2026-07-01 22:09:01 -05:00
parent b6ee4fc3de
commit 48df965268
2 changed files with 11 additions and 4 deletions

View File

@@ -129,10 +129,9 @@ void load_root_program(const char* path) {
*(--u_esp) = 0; // argc = 0 *(--u_esp) = 0; // argc = 0
create_task(e_hdr->e_entry, (uint32_t)cr3, 1, (uint32_t)u_esp); create_task(e_hdr->e_entry, (uint32_t)cr3, 1, (uint32_t)u_esp);
load_pd((void*)kernel_cr3); load_pd((void*)kernel_cr3);
flush_tlb(); flush_tlb();
kprintf("task created for origin program %s\n", path);
} }
void kmain(uint32_t magic, multiboot_info* mbi) { void kmain(uint32_t magic, multiboot_info* mbi) {
@@ -168,10 +167,10 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
mount(vfs_root, initrd_root); mount(vfs_root, initrd_root);
kprintf("initrd read, mounted @ /\n"); kprintf("initrd read, mounted @ /\n");
disable_interrupts();
init_scheduler(); init_scheduler();
enable_interrupts(); enable_interrupts();
kprintf("loading origin program\n"); kprintf("loading origin program\n");
load_root_program("/origin.elf"); load_root_program("/origin.elf");
yield();
} }

View File

@@ -12,7 +12,7 @@
#include "gdt.h" #include "gdt.h"
static process_t* process_table; static process_t* process_table;
static int current_process = 0; static int current_process = 0;
static int total_processes = 0; static int total_processes = 0;
@@ -138,6 +138,8 @@ int create_task(uint32_t entry_point, uint32_t cr3, int user, uint32_t u_esp) {
*(--esp) = 0x23; *(--esp) = 0x23;
} else { } else {
// IRET values for Ring 0 // IRET values for Ring 0
*(--esp) = 0x23; // User Data Segment (SS) with RPL 3 (0x20 | 3)
*(--esp) = kstack_top; // User Stack Pointer (ESP) - location mapped in user space
*(--esp) = 0x0202; // EFLAGS *(--esp) = 0x0202; // EFLAGS
*(--esp) = 0x08; // Kernel Code Segment (CS) *(--esp) = 0x08; // Kernel Code Segment (CS)
*(--esp) = entry_point; // EIP *(--esp) = entry_point; // EIP
@@ -153,6 +155,12 @@ int create_task(uint32_t entry_point, uint32_t cr3, int user, uint32_t u_esp) {
*(--esp) = 0; // ESI *(--esp) = 0; // ESI
*(--esp) = 0; // EDI *(--esp) = 0; // EDI
if (user) {
*(--esp) = 0x23; // User Data Segment
} else {
*(--esp) = 0x10; // Kernel Data Segment
}
process->esp = (uint32_t)esp; process->esp = (uint32_t)esp;
if (!reuse) { if (!reuse) {
total_processes++; total_processes++;