From e5eaf3eeb5e1c82198162651ef0e92483d6cfcef Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 22 Aug 2011 22:11:28 +0200 Subject: [PATCH] Added the MapRange virtual memory functions. --- sortix/memorymanagement.cpp | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/sortix/memorymanagement.cpp b/sortix/memorymanagement.cpp index e1a6496a..27a2a69c 100644 --- a/sortix/memorymanagement.cpp +++ b/sortix/memorymanagement.cpp @@ -563,6 +563,66 @@ namespace Sortix return result; } + bool MapRangeKernel(addr_t where, size_t bytes) + { + for ( addr_t page = where; page < where + bytes; page += 4096UL ) + { + addr_t physicalpage = Page::Get(); + if ( physicalpage == 0 ) + { + while ( where < page ) + { + page -= 4096UL; + physicalpage = UnmapKernel(page); + Page::Put(physicalpage); + } + return false; + } + + MapKernel(where, physicalpage); + } + + return true; + } + + void UnmapRangeKernel(addr_t where, size_t bytes) + { + for ( addr_t page = where; page < where + bytes; page += 4096UL ) + { + addr_t physicalpage = UnmapKernel(page); + Page::Put(physicalpage); + } + } + + bool MapRangeUser(addr_t where, size_t bytes) + { + for ( addr_t page = where; page < where + bytes; page += 4096UL ) + { + addr_t physicalpage = Page::Get(); + if ( physicalpage == 0 || !MapUser(where, physicalpage) ) + { + while ( where < page ) + { + page -= 4096UL; + physicalpage = UnmapUser(page); + Page::Put(physicalpage); + } + return false; + } + } + + return true; + } + + void UnmapRangeUser(addr_t where, size_t bytes) + { + for ( addr_t page = where; page < where + bytes; page += 4096UL ) + { + addr_t physicalpage = UnmapUser(page); + Page::Put(physicalpage); + } + } + #else #warning "Virtual Memory is not available on this arch"