From: Amelia Coutard 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 . -#include "interrupts.hpp" -#include "utils.hpp" #include +#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 #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(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(test_module.start_address.get_phys_addr()); @@ -225,8 +227,6 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr(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 +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);