From: Amelia Coutard <eliottulio.coutard@gmail.com>
Date: Mon, 13 Mar 2023 22:45:46 +0000 (+0100)
Subject: Made the stack pages load lazily
X-Git-Url: https://git.ameliathe1st.gay/?a=commitdiff_plain;h=57b9b6eb3053d2c59f99b6e5deb56439da057e38;p=voyage-au-centre-des-fichiers.git

Made the stack pages load lazily
---

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 <cpuid.h>
 #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);