]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Moved most asm simple utils to utils.?pp. Also fixed invlpg usage
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 5 Mar 2023 17:58:08 +0000 (18:58 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 5 Mar 2023 17:58:58 +0000 (18:58 +0100)
kernel/src/boot.S
kernel/src/interrupts.cpp
kernel/src/interrupts.hpp
kernel/src/kernel.cpp
kernel/src/paging.cpp
kernel/src/utils.cpp
kernel/src/utils.hpp

index f9ad954045f856d249bee41b0009d28c433c6de7..3becb43331b950eea55bab900a7ba7a6717c65fd 100644 (file)
@@ -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
index c7bb94d6dc558d8f77b2e004f121f6b309f4f1e2..1d22bdbde2ac87aa1a899e790c191f9a87b20108 100644 (file)
 // 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));
 }
index 2ab8701f9ea2c5feb632b647fc5092ca2fa74e90..93fae7fd6d1bdc6a50ca25d979772e273c6219a0 100644 (file)
@@ -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();
index 7db816dade8ac56d06f39e163e471fd23f392d02..e0fff26186f5cabdb511719fe85f0558d4a6912d 100644 (file)
@@ -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");
index d3dc1cbd40ec75d93e6c83748cbd1f7a23546fe3..5996b2549e39e92c5178209c2046f0124d7d2a42 100644 (file)
@@ -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));
        }
index 4b290779bc578bb1cab88c359ca9b52e7917a6f9..326de3b0a62c360ce2650bf4f410aab049d4f850 100644 (file)
 #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) {
index 49ab21db59da9bcc62efdbcdf2f3db3e8b8f3d51..df3f7db209ab18d0fa79a2df6302b13d51ad2a78 100644 (file)
@@ -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);