From 57b9b6eb3053d2c59f99b6e5deb56439da057e38 Mon Sep 17 00:00:00 2001 From: Amelia Coutard Date: Mon, 13 Mar 2023 23:45:46 +0100 Subject: [PATCH] Made the stack pages load lazily --- kernel/src/elf64.cpp | 5 ----- kernel/src/interrupts.cpp | 9 ++++++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/kernel/src/elf64.cpp b/kernel/src/elf64.cpp index 79896ca..a093f02 100644 --- a/kernel/src/elf64.cpp +++ b/kernel/src/elf64.cpp @@ -68,10 +68,5 @@ os::process os::elf::load_elf(void* start, std::size_t length, const paging::PML } } - // Allocate and map stack (already 0-initialised by the page allocator): - for (std::size_t i = 0; i < stack_size / 0x1000 /* 64KiB */; i++) { - os::paging::setup_page(*result.PML4T, stack + i * 0x1000, 1, 1); - } - return result; } diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index 667b09c..5cea3c8 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -14,6 +14,7 @@ #include #include "interrupts.hpp" #include "paging.hpp" +#include "ring3.hpp" void os::lidt(idtr idtr) { asm volatile("lidt %0" : : "m"(idtr)); @@ -110,9 +111,15 @@ extern "C" void int_page_fault(std::uint32_t err_code, std::uint64_t vaddr) { if ( (0xFFFF'C000'0000'0000 <= vaddr && vaddr < 0xFFFF'C000'0801'0000) // process/port info ) { // Kernel memory - os::print("Alloccing: {}\n", vaddr); + os::print("Allocating (Ring 0): {}\n", vaddr); os::paging::setup_page(PML4T, (void*)vaddr, true, false); return; + } else if ( + (0x0000'7FFF'FFFF'0000 <= vaddr && vaddr < 0x0000'8000'0000'0000) // stack + ) { // Userspace memory + os::print("Allocating (Ring 3): {}\n", vaddr); + os::paging::setup_page(*os::get_process(os::current_pid).PML4T, (void*)vaddr, true, true); + return; } os::print("Interrupt: Page Fault.\n"); os::print("Err code: {}.\n", err_code); -- 2.47.0