From: Amelia Coutard Date: Sat, 11 Mar 2023 01:09:12 +0000 (+0100) Subject: Added automatic page mapping on some page faults. Also fixed a critical bug in the... X-Git-Url: https://git.ameliathe1st.gay/?a=commitdiff_plain;h=b2d3dd9d5501e94cac36ec324bc5106d67ee34bd;p=voyage-au-centre-des-fichiers.git Added automatic page mapping on some page faults. Also fixed a critical bug in the implementation of interrupt handlers with a error code --- diff --git a/kernel/src/interrupts.S b/kernel/src/interrupts.S index 0974203..a5f6c8a 100644 --- a/kernel/src/interrupts.S +++ b/kernel/src/interrupts.S @@ -44,7 +44,7 @@ call set_APIC_reg_asm; \ sti; \ POP_REGS \ - addq 4, %rsp;\ + addq $8, %rsp;\ iretq #define HANDLER_NOERRCODE(n, handler) \ .globl handler_##n ;\ @@ -73,7 +73,20 @@ HANDLER_ERRCODE (0x0a, int_invalid_TSS) HANDLER_ERRCODE (0x0b, int_segment_not_present) HANDLER_ERRCODE (0x0c, int_stack_segment_fault) HANDLER_ERRCODE (0x0d, int_general_protection_fault) -HANDLER_ERRCODE (0x0e, int_page_fault) +.globl handler_0x0e + handler_0x0e: + cli + PUSH_REGS + movl 72(%rsp), %edi + movq %cr2, %rsi + call int_page_fault + movq $0xB0, %rdi + movq $0, %rsi + call set_APIC_reg_asm + sti + POP_REGS + addq $8, %rsp + iretq HANDLER_NOERRCODE(0x0f, int_default) HANDLER_NOERRCODE(0x10, int_x87_floating_point_exception) HANDLER_ERRCODE (0x11, int_alignment_check) diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index 1d22bdb..667b09c 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -13,6 +13,7 @@ #include #include "interrupts.hpp" +#include "paging.hpp" void os::lidt(idtr idtr) { asm volatile("lidt %0" : : "m"(idtr)); @@ -104,9 +105,18 @@ extern "C" void int_general_protection_fault(std::uint32_t err_code) { os::print("Err code: {}.\n", err_code); while (true) { os::hlt(); } } -extern "C" void int_page_fault(std::uint32_t err_code) { +extern "C" os::paging::PML4T PML4T; +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::paging::setup_page(PML4T, (void*)vaddr, true, false); + return; + } os::print("Interrupt: Page Fault.\n"); os::print("Err code: {}.\n", err_code); + os::print("Vaddr: {}.\n", vaddr); while (true) { os::hlt(); } } extern "C" void int_x87_floating_point_exception() { diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 6684df7..2e4146e 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -204,7 +204,6 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr