From: Amelia Coutard <eliottulio.coutard@gmail.com>
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 <cpuid.h>
 #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<const multiboot2::info_s
 	os::print("Enabling syscalls.\n");
 	os::enable_syscalls();
 
-	os::paging::setup_page(PML4T, (void*)0xFFFF'C000'0000'0000, true, false);
 	os::current_pid = 1;
 	os::get_process(os::current_pid) = test_module_process;