From 621c38faff56b1b1d3af353e562aef667e6620e9 Mon Sep 17 00:00:00 2001 From: Nathan Giddings Date: Fri, 17 Jul 2020 12:31:54 -0500 Subject: [PATCH] Imlemented munmap and added some error checking --- src/mmgr/addressspace.cpp | 25 +++++++++++++++++++++---- src/mmgr/addressspace.hpp | 4 ++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/mmgr/addressspace.cpp b/src/mmgr/addressspace.cpp index 8056e8a..b325093 100644 --- a/src/mmgr/addressspace.cpp +++ b/src/mmgr/addressspace.cpp @@ -7,7 +7,7 @@ kernel::AddressSpace::AddressSpace(MemoryAllocator& malloc) this->pageDirectory = (PageTableEntry*) 0xFFFFF000; } -void* kernel::AddressSpace::mmap(void* start, size_t length) +int kernel::AddressSpace::mmap(void* start, size_t length) { size_t tableIndex = (size_t) start / 4096; for(int i = (int) length; i > 0; i -= 4096) @@ -16,6 +16,8 @@ void* kernel::AddressSpace::mmap(void* start, size_t length) if(!pageDirectory[directoryIndex].getPresent()) { physaddr_t newPT = malloc.allocate(4096); + if(newPT == 0) + return -1; pageDirectory[directoryIndex] = newPT; pageDirectory[directoryIndex].setPresent(true); pageDirectory[directoryIndex].setUsermode(false); @@ -31,12 +33,27 @@ void* kernel::AddressSpace::mmap(void* start, size_t length) } tableIndex++; } - return start; + return 0; } -void kernel::AddressSpace::munmap(void* start, size_t length) +int kernel::AddressSpace::munmap(void* start, size_t length) { - + if((size_t) start % 4096 != 0) + return -1; + size_t tableIndex = (size_t) start / 4096; + for(int i = (int) length; i > 0; i -= 4096) + { + size_t directoryIndex = tableIndex / 1024; + if(pageDirectory[directoryIndex].getPresent()) + { + pageDirectory[directoryIndex] = 0; + pageDirectory[directoryIndex].setPresent(false); + pageDirectory[directoryIndex].setUsermode(false); + pageDirectory[directoryIndex].setRw(false); + } + tableIndex++; + } + return 0; } physaddr_t kernel::AddressSpace::getPhysicalAddress(void* virtualAddress) diff --git a/src/mmgr/addressspace.hpp b/src/mmgr/addressspace.hpp index eaba986..26073e0 100755 --- a/src/mmgr/addressspace.hpp +++ b/src/mmgr/addressspace.hpp @@ -14,9 +14,9 @@ public: AddressSpace(MemoryAllocator& malloc); - void* mmap(void* start, size_t length); + int mmap(void* start, size_t length); - void munmap(void* start, size_t length); + int munmap(void* start, size_t length); physaddr_t getPhysicalAddress(void* virtualAddress) const;