]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Added basic structure to get ready for making a new, clean, PML4T right after boot
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Sat, 9 Dec 2023 01:22:12 +0000 (02:22 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Sat, 9 Dec 2023 01:22:12 +0000 (02:22 +0100)
kernel/linker.ld
kernel/src/boot.S
kernel/src/interrupts.cpp
kernel/src/kernel.cpp
kernel/src/paging.cpp
kernel/src/paging.hpp

index b99ff7049b821b668525e094b16066211cdf5a75..b3fa2b6ff9db70ca67d7661fca2c08efd5275ffb 100644 (file)
@@ -44,6 +44,8 @@ SECTIONS {
        .eh_frame ALIGN(4K) : AT(ADDR(.eh_frame) - KERNEL_VMA) {
                *(.eh_frame)
        }
+       . = ALIGN(4K);
+       _kernel_rw_start = . - KERNEL_VMA;
        .data ALIGN(4K) : AT(ADDR(.data) - KERNEL_VMA) {
                *(.data)
                *(.data*)
index 11a650a3b78887bb3cdf211e153b8864906f1903..f9adf20dd68d2dbc87c075571bba6aca9a3774b2 100644 (file)
@@ -111,7 +111,8 @@ IO_MAP:
 IO_MAP_END:
 
 .align 0x1000
-.globl PML4T
+.globl old_PML4T
+old_PML4T:
 PML4T: .quad PDPT_low - KERNEL_VMA + 3
        .skip 0x1000 - 16
        .quad PDPT_high - KERNEL_VMA + 3
index 4e584fb24312cde366cda4148d5ce077b0a57051..477431f10631a6b5360e31bf6327e849a4753770 100644 (file)
@@ -106,13 +106,12 @@ 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" 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'1000'0000) // process/port info
        ) { // Kernel memory
                os::print("Allocating (Ring 0): {}\n", (void*)vaddr);
-               os::paging::setup_page(PML4T, (void*)vaddr, true, false);
+               os::paging::setup_page(os::paging::global_PML4T, (void*)vaddr, true, false);
                return;
        } else if (
                (0x0000'7FFF'FFFF'0000 <= vaddr && vaddr < 0x0000'8000'0000'0000) // stack
index beddfac353403298519bb3d52cebd3b4b3492fee..5093a0d9d16db175399de04a97f3c2d60b4aeec6 100644 (file)
 os::idt<32> idt;
 extern "C" os::tss TSS;
 extern "C" char interrupt_stack_top;
-extern "C" os::paging::PML4T PML4T;
+extern "C" os::paging::PML4T old_PML4T;
 
 os::paging::page<0> bootstrap_pages_for_memory[32]; // 32 pages = 128 KiB
 
 extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_start> info) {
        os::assert(magic == 0x36D76289, "Incorrect magic number: wasn't booted with multiboot2.");
        os::assert(os::cpu_has_msr(), "MSRs aren't supported.");
+       // TODO: Initialise new PML4T
+       os::paging::global_PML4T = old_PML4T;
+       // /TODO
+       os::print("a\n");
+       os::paging::load_pml4t(os::phys_ptr<os::paging::PML4T>{std::uintptr_t(&os::paging::global_PML4T) - 0xFFFF'FFFF'8000'0000});
+       os::print("b\n");
 
        if (!os::init_serial_port()) {
                while (true) {
@@ -86,10 +92,10 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
        static_assert(sizeof(os::processes) <= 1024 * 1024 * 1024, "Error: processes array too big.");
        {
                const auto index = os::paging::calc_page_table_indices(&os::processes).pml4e;
-               PML4T.contents[index] = {.non_page = {.P = 1, .R_W = 1, .U_S = 0, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
+               os::paging::global_PML4T.contents[index] = {.non_page = {.P = 1, .R_W = 1, .U_S = 0, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
                const auto PDPT_alloc = os::paging::page_allocator.allocate(1);
                os::memset((void*)PDPT_alloc.ptr, 0, 0x1000);
-               set_base_address(PML4T.contents[index], os::phys_ptr<os::paging::PDPT>(PDPT_alloc.ptr.get_phys_addr()));
+               set_base_address(os::paging::global_PML4T.contents[index], os::phys_ptr<os::paging::PDPT>(PDPT_alloc.ptr.get_phys_addr()));
        }
 
        {
@@ -109,6 +115,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
                                );
                                break;
                        case multiboot2::info::type_t::memory_map:
+                               os::print("RAM:\n");
                                for (std::size_t i = 0; i < multiboot2::memory_map_number_of_entries(it); i++) {
                                        if (multiboot2::memory_map_type(it, i) == 1) {
                                                // Rounded up, to avoid including non-ram.
@@ -120,9 +127,11 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
                                                if (s <= e) { // In the case where no full page is included in the ram section, don't add it.
                                                        os::assert(available_ram_length < 50, "Too much available RAM sections to initialise correctly. Will fix eventually, probably.");
                                                        available_ram[available_ram_length++] = {.start_address = s, .end_address = e};
+                                                       os::print("{} -> {} ({})\n", s, e + 1, (unsigned long)(e + 1 - s));
                                                }
                                        }
                                }
+                               os::print("RAM END\n");
                                break;
                        case multiboot2::info::type_t::modules:
                                os::print("{}->{}: {}\n", multiboot2::modules_mod_start(it), multiboot2::modules_mod_end(it), multiboot2::modules_string(it));
@@ -130,7 +139,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
                                os::elf::load_elf(os::get_process(os::processes.create()),
                                                  (std::byte*)multiboot2::modules_mod_start(it),
                                                  multiboot2::modules_mod_end(it) - multiboot2::modules_mod_start(it),
-                                                 PML4T);
+                                                 os::paging::global_PML4T);
                                break;
                        default: break;
                        }
@@ -184,11 +193,6 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
        os::paging::page_allocator.print_all();
        os::print("RAM END\n");
 
-       // Unmap low RAM, and free corresponding page.
-       PML4T.contents[0].non_page.P = false;
-       os::paging::page_allocator.deallocate({.ptr = os::phys_ptr<os::paging::page<0>>(get_base_address(PML4T.contents[0]).get_phys_addr()), .size = 1});
-       os::invlpg((void*)0x0);
-
        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 532b3062cf80daee499957224ed322db2b3a75ad..2d4473536fc4de91787a708b49b8b5686f78280b 100644 (file)
@@ -14,6 +14,8 @@
 #include "paging.hpp"
 #include "serial.hpp"
 
+os::paging::PML4T os::paging::global_PML4T;
+
 std::byte* os::paging::setup_page(os::paging::PML4T& PML4T, const void* vaddr, bool R_W, bool U_S) {
        const auto indices = os::paging::calc_page_table_indices(vaddr);
        if (PML4T.contents[indices.pml4e].non_page.P == 0) {
@@ -105,7 +107,7 @@ void os::paging::on_all_pages(const os::paging::PML4T& PML4T, void f(page<0>*, p
 }
 
 void os::paging::load_pml4t(phys_ptr<PML4T> PML4T) {
-       asm volatile("mov %0, %%cr3" :: "r" (PML4T.get_phys_addr() | 0x10) : "memory"); // 0x10 disables the cache.
+       asm volatile("mov %0, %%cr3" :: "r" (PML4T.get_phys_addr()) : "memory");
 }
 
 os::paging::page_allocator_t os::paging::page_allocator{};
index 6955a7bbe3ab4ea701e56202735c1028e1ab7c3f..eb1696f65fa1d5891fe76b4f4492eb5ba60f99d9 100644 (file)
@@ -41,6 +41,8 @@ static_assert(sizeof(page<0>) == 0x1000);
 static_assert(sizeof(page<1>) == 0x1000 * 512);
 static_assert(sizeof(page<2>) == 0x1000ull * 512 * 512);
 
+extern PML4T global_PML4T;
+
 template<> struct paging_entry<3> {
        struct {
                std::uint64_t P : 1 = 0;