]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Edited os::paging::setup_pages a bit. Notably, the global bit is now set for all...
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 5 Mar 2023 23:40:35 +0000 (00:40 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 5 Mar 2023 23:40:35 +0000 (00:40 +0100)
kernel/src/kernel.cpp
kernel/src/paging.cpp
kernel/src/paging.hpp

index e0fff26186f5cabdb511719fe85f0558d4a6912d..9757d4cb60a5a31c0756765ca55e92c7f5f92cec 100644 (file)
@@ -209,7 +209,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
                // Allocate memory for segment:
                std::size_t nb_pages = (std::uint64_t(program_header.p_vaddr) % 0x1000 + program_header.p_memsz + 0x1000 - 1) / 0x1000;
                for (std::size_t i = 0; i < nb_pages; i++) {
-                       os::paging::setup_page(PML4T, program_header.p_vaddr + i * 0x1000, (program_header.flags & 2) >> 1, 1, true);
+                       os::paging::setup_page(PML4T, program_header.p_vaddr + i * 0x1000, (program_header.flags & 2) >> 1, 1);
                }
                // Initialise memory for segment:
                for (std::size_t i = 0; i < program_header.p_filesz; i++) {
@@ -224,7 +224,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr<const multiboot2::info_s
        constexpr std::size_t stack_size = 16 * 0x1000 /* 64KiB */;
        std::byte * const stack = (std::byte*)0x0000'8000'0000'0000 - stack_size;
        for (std::size_t i = 0; i < stack_size / 0x1000 /* 64KiB */; i++) {
-               os::paging::setup_page(PML4T, stack + i * 0x1000, 1, 1, true);
+               os::paging::setup_page(PML4T, stack + i * 0x1000, 1, 1);
        }
 
        os::print("Loading ring 3 interrupts stack.\n");
index 5996b2549e39e92c5178209c2046f0124d7d2a42..dc9ec73b83e0571f5d149cc5b2d25d8df663d468 100644 (file)
@@ -14,7 +14,7 @@
 #include "paging.hpp"
 #include "serial.hpp"
 
-void os::paging::setup_page(os::paging::PML4T& PML4T, const void* vaddr, bool R_W, bool U_S, bool must_be_unmapped) {
+void 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].P == 0) {
                PML4T.contents[indices.pml4e] = {.P = 1, .R_W = 1, .U_S = U_S, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0};
@@ -26,22 +26,26 @@ void os::paging::setup_page(os::paging::PML4T& PML4T, const void* vaddr, bool R_
                PDPT.contents[indices.pdpe] = {.non_page = {.P = 1, .R_W = 1, .U_S = U_S, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
                const auto PDT_alloc = os::paging::page_allocator.allocate(1);
                set_base_address(PDPT.contents[indices.pdpe], os::phys_ptr<os::paging::PDT>(PDT_alloc.ptr.get_phys_addr()));
+       } else {
+               assert(PDPT.contents[indices.pdpe].non_page.zero == 0,
+                       "Cannot map memory address 0x{} because it is inside a 1GiB page", std::uintptr_t(vaddr));
        }
        os::paging::PDT& PDT = *get_base_address(PDPT.contents[indices.pdpe]);
        if (PDT.contents[indices.pde].non_page.P == 0) {
                PDT.contents[indices.pde] = {.non_page = {.P = 1, .R_W = 1, .U_S = U_S, .PWT = 0, .PCD = 0, .base_address = 0, .NX = 0}};
                const auto PT_alloc = os::paging::page_allocator.allocate(1);
                set_base_address(PDT.contents[indices.pde], os::phys_ptr<os::paging::PT>(PT_alloc.ptr.get_phys_addr()));
-       }
-       os::paging::PT& PT = *get_base_address(PDT.contents[indices.pde]);
-       if (PT.contents[indices.pe].P == 0) {
-               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));
+               assert(PDT.contents[indices.pde].non_page.zero == 0,
+                       "Cannot map memory address 0x{} because it is inside a 2MiB page", std::uintptr_t(vaddr));
        }
+       os::paging::PT& PT = *get_base_address(PDT.contents[indices.pde]);
+       os::assert(PT.contents[indices.pe].P == 0, "Memory at address 0x{} has already been mapped.", std::uintptr_t(vaddr));
+       PT.contents[indices.pe] =
+               {.P = 1, .R_W = R_W, .U_S = U_S, .PWT = 0, .PCD = 0, .PAT = 0, .G = (indices.pml4e < 128) ? 0ul : 1ul, .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);
 }
 
 namespace {
index a9a194692b1c9c4e35f2353cbb72778350042346..9fcb6ee6d95c6b39996740918339797dc448b841 100644 (file)
@@ -235,7 +235,7 @@ constexpr page_table_indices calc_page_table_indices(const void* ptr) {
        };
 }
 
-void setup_page(PML4T& PML4T, const void* vaddr, bool R_W, bool U_S, bool must_be_unmapped);
+void setup_page(PML4T& PML4T, const void* vaddr, bool R_W, bool U_S);
 
 // For all present page mappings, calls f(virtual address, physical address, page size in bytes (4KiB, 2MiB or 1GiB)).
 void on_all_pages(const PML4T& PML4T, void f(page*, phys_ptr<page>, std::size_t));