]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Made the stack pages load lazily
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Mon, 13 Mar 2023 22:45:46 +0000 (23:45 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Mon, 13 Mar 2023 22:45:46 +0000 (23:45 +0100)
kernel/src/elf64.cpp
kernel/src/interrupts.cpp

index 79896ca62d47367fb00a4569a97d71e754999d4e..a093f02feacae176cd9506923d3971d2f711e66c 100644 (file)
@@ -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;
 }
index 667b09cbf40d81d94d9738ee0607037c48aabf23..5cea3c89550d1c5649e8967ef509608a096a4259 100644 (file)
@@ -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);