From d6c56fb5124707cffa8bbe978249c07b062c25be Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 13 Nov 2022 16:31:32 +0100 Subject: [PATCH] Mapping finally works!! --- kernel/src/arch/x86_64/MMU.cpp | 19 ++++++++++++------- kernel/src/main.cpp | 21 +++++++++++++++------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/kernel/src/arch/x86_64/MMU.cpp b/kernel/src/arch/x86_64/MMU.cpp index 1ccc1c08..d79a995a 100644 --- a/kernel/src/arch/x86_64/MMU.cpp +++ b/kernel/src/arch/x86_64/MMU.cpp @@ -1,5 +1,6 @@ #include "arch/MMU.h" #include "MemoryManager.h" +#include "arch/Serial.h" #include #define PAGE_SIZE 4096 @@ -23,21 +24,21 @@ struct [[gnu::packed]] PageTableEntry u8 available2 : 3; bool no_execute : 1; - void set_address(uint64_t addr); - uint64_t get_address(); + void set_address(u64 addr); + u64 get_address(); }; #pragma GCC push_options #pragma GCC diagnostic ignored "-Wconversion" -void PageTableEntry::set_address(uint64_t addr) +void PageTableEntry::set_address(u64 addr) { this->address = (addr >> 12); } -uint64_t PageTableEntry::get_address() +u64 PageTableEntry::get_address() { - return (uint64_t)this->address << 12; + return (u64)this->address << 12; } #pragma GCC pop_options @@ -170,6 +171,7 @@ namespace MMU l4.present = true; l4.set_address(addr.release_value()); memset(l3_table(virt), 0, PAGE_SIZE); + l4.ignore0 = l4.ignore1 = 0; } if (flags & Flags::ReadWrite) l4.read_write = true; if (flags & Flags::User) l4.user = true; @@ -182,6 +184,7 @@ namespace MMU l3.present = true; l3.set_address(addr.release_value()); memset(l2_table(virt), 0, PAGE_SIZE); + l3.ignore0 = l3.ignore1 = 0; } if (flags & Flags::ReadWrite) l3.read_write = true; if (flags & Flags::User) l3.user = true; @@ -196,6 +199,7 @@ namespace MMU l2.present = true; l2.set_address(addr.release_value()); memset(l1_table(virt), 0, PAGE_SIZE); + l2.ignore0 = l2.ignore1 = 0; } if (flags & Flags::ReadWrite) l2.read_write = true; if (flags & Flags::User) l2.user = true; @@ -203,15 +207,16 @@ namespace MMU if (l2.larger_pages) return err; // FIXME: Replacing larger pages is not supported ATM auto& l1 = l1_entry(virt); - bool was_present = l1.present; + if (l1.present) return err; // Please explicitly unmap the page before mapping it again. + l1.ignore0 = l1.ignore1 = false; l1.present = true; if (flags & Flags::ReadWrite) l1.read_write = true; if (flags & Flags::User) l1.user = true; if (flags & Flags::WriteThrough) l1.write_through = true; if (flags & Flags::CacheDisable) l1.cache_disabled = true; if (flags & Flags::NoExecute) l1.no_execute = true; + if (l1.ignore0 || l1.ignore1) return {1}; l1.set_address(phys); - if (was_present) flush_page(virt); return {}; } diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp index 2731e861..4d47e607 100644 --- a/kernel/src/main.cpp +++ b/kernel/src/main.cpp @@ -21,30 +21,39 @@ extern "C" void _start() u64 physical = MemoryManager::alloc_physical_page().release_value(); - bool success = !MMU::map(address, physical, MMU::ReadWrite | MMU::NoExecute).has_error(); + auto rc = MMU::map(address, physical, MMU::ReadWrite); + bool success = !rc.has_error(); + + int flags; + u8* ptr; if (success) Serial::println("Mapped page :)"); else + { Serial::println("Failed to map page"); + goto failure; + } if (MMU::get_physical(address).release_value() == physical) Serial::println("Mapping is active ;)"); else + { Serial::println("Mapping is not active"); + goto failure; + } - int flags = MMU::get_flags(address).release_value(); + flags = MMU::get_flags(address).release_value(); if (flags & MMU::ReadWrite) Serial::println("Mapping is writable"); if (flags & MMU::NoExecute) Serial::println("Mapping is not executable"); - u32* ptr = (u32*)address; - (void)*ptr; - - Serial::println("Can read from pointer"); + ptr = (u8*)address; *ptr = 8; Serial::println("Can write to pointer"); +failure: + for (;;) ; } \ No newline at end of file