From: Amelia Coutard <eliottulio.coutard@gmail.com>
Date: Sun, 5 Mar 2023 17:58:08 +0000 (+0100)
Subject: Moved most asm simple utils to utils.?pp. Also fixed invlpg usage
X-Git-Url: https://git.ameliathe1st.gay/?a=commitdiff_plain;h=eff72e370689bb367c5d6ac9a4a41590371961cf;p=voyage-au-centre-des-fichiers.git

Moved most asm simple utils to utils.?pp. Also fixed invlpg usage
---

diff --git a/kernel/src/boot.S b/kernel/src/boot.S
index f9ad954..3becb43 100644
--- a/kernel/src/boot.S
+++ b/kernel/src/boot.S
@@ -117,8 +117,7 @@ PML4T: .quad PDPT_low - KERNEL_VMA + 3
        .skip 0x1000 - 16
        .quad PDPT_high - KERNEL_VMA + 3
 PDPT_low:  .quad 0x83
-           .quad 0x83 + 1024 * 1024 * 1024
-           .skip 0x1000 - 16
+           .skip 0x1000 - 8
 PDPT_high: .skip 0x1000 - 16
            .quad 0x83
            .quad 0x83 + 1024 * 1024 * 1024
diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp
index c7bb94d..1d22bdb 100644
--- a/kernel/src/interrupts.cpp
+++ b/kernel/src/interrupts.cpp
@@ -11,16 +11,9 @@
 // You should have received a copy of the GNU General Public License along with this program. If
 // not, see <https://www.gnu.org/licenses/>.
 
-#include "interrupts.hpp"
-#include "utils.hpp"
 #include <cpuid.h>
+#include "interrupts.hpp"
 
-void os::cli() {
-	asm volatile("cli");
-}
-void os::sti() {
-	asm volatile("sti");
-}
 void os::lidt(idtr idtr) {
 	asm volatile("lidt %0" : : "m"(idtr));
 }
diff --git a/kernel/src/interrupts.hpp b/kernel/src/interrupts.hpp
index 2ab8701..93fae7f 100644
--- a/kernel/src/interrupts.hpp
+++ b/kernel/src/interrupts.hpp
@@ -16,6 +16,7 @@
 #include <cstdint>
 #include "lib/phys_ptr.hpp"
 #include "serial.hpp"
+#include "utils.hpp"
 
 namespace os {
 
@@ -41,8 +42,6 @@ struct __attribute__((packed)) idtr {
 	std::uint64_t offset;
 };
 
-void cli();
-void sti();
 void lidt(idtr idtr);
 bool is_APIC_builtin();
 void disable_PIC();
diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp
index 7db816d..e0fff26 100644
--- a/kernel/src/kernel.cpp
+++ b/kernel/src/kernel.cpp
@@ -177,6 +177,8 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
 	// Unmap low RAM, and free corresponding page.
 	PML4T.contents[0].P = false;
 	os::paging::page_allocator.deallocate({.ptr = os::phys_ptr<os::paging::page>(get_base_address(PML4T.contents[0]).get_phys_addr()), .size = 1});
+	os::invlpg((void*)0x0);
+
 	// Load test-module elf file:
 	const os::elf::header elf_header = *os::phys_ptr<os::elf::header>(test_module.start_address.get_phys_addr());
 
@@ -225,8 +227,6 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
 		os::paging::setup_page(PML4T, stack + i * 0x1000, 1, 1, true);
 	}
 
-	asm volatile("invlpg (%0)" ::"r" (0x1000) : "memory");
-
 	os::print("Loading ring 3 interrupts stack.\n");
 	os::set_ring0_stack(TSS, std::uint64_t(&interrupt_stack_top));
 	os::print("Loading TSS.\n");
diff --git a/kernel/src/paging.cpp b/kernel/src/paging.cpp
index d3dc1cb..5996b25 100644
--- a/kernel/src/paging.cpp
+++ b/kernel/src/paging.cpp
@@ -38,6 +38,7 @@ void os::paging::setup_page(os::paging::PML4T& PML4T, const void* vaddr, bool R_
 		PT.contents[indices.pe] = {.P = 1, .R_W = R_W, .U_S = U_S, .PWT = 0, .PCD = 0, .PAT = 0, .G = 0, .base_address = 0, .NX = 0};
 		const auto page_alloc = os::paging::page_allocator.allocate(1);
 		set_page_base_address(PT.contents[indices.pe], os::phys_ptr<os::paging::page>(page_alloc.ptr.get_phys_addr()));
+		invlpg(vaddr);
 	} else {
 		os::assert(!must_be_unmapped, "Memory at address 0x{} has already been mapped.", std::uintptr_t(vaddr));
 	}
diff --git a/kernel/src/utils.cpp b/kernel/src/utils.cpp
index 4b29077..326de3b 100644
--- a/kernel/src/utils.cpp
+++ b/kernel/src/utils.cpp
@@ -15,8 +15,17 @@
 #include "interrupts.hpp"
 #include <cpuid.h>
 
+void os::invlpg(const void* vaddr) {
+	asm volatile("invlpg (%0)" :: "r" (vaddr) : "memory");
+}
+void os::cli() {
+	asm volatile("cli" :);
+}
+void os::sti() {
+	asm volatile("sti" :);
+}
 void os::hlt() {
-	asm volatile("hlt");
+	asm volatile("hlt" :);
 }
 
 void os::outb(std::uint16_t port, std::uint8_t data) {
diff --git a/kernel/src/utils.hpp b/kernel/src/utils.hpp
index 49ab21d..df3f7db 100644
--- a/kernel/src/utils.hpp
+++ b/kernel/src/utils.hpp
@@ -17,6 +17,9 @@
 
 namespace os {
 
+void invlpg(const void* vaddr);
+void cli();
+void sti();
 void hlt();
 void outb(std::uint16_t port, std::uint8_t data);
 std::uint8_t inb(std::uint16_t port);