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);