diff --git a/src/mmap.hpp b/src/mmap.hpp index 54b905d..83f243e 100644 --- a/src/mmap.hpp +++ b/src/mmap.hpp @@ -14,6 +14,8 @@ int mmap(void* start, size_t length, int flags); int mmap(void* start, physaddr_t p_start, size_t length, int flags); +int mapPage(void* start, physaddr_t p_start, int flags); + int munmap(void* start, size_t length); bool isMapped(void* addr); diff --git a/src/x86/mmap.cpp b/src/x86/mmap.cpp index 0aa9e2a..ea0e14f 100644 --- a/src/x86/mmap.cpp +++ b/src/x86/mmap.cpp @@ -178,7 +178,6 @@ int kernel::mmap(void* start, size_t length, int flags) pageTables[tableIndex].setUsermode(false); if(flags & MMAP_RW) pageTables[tableIndex].setRw(true); - } tableIndex++; } @@ -186,6 +185,20 @@ int kernel::mmap(void* start, size_t length, int flags) } int kernel::mmap(void* start, physaddr_t p_start, size_t length, int flags) +{ + if((size_t) start % 4096 != 0 || p_start % 4096 != 0) + return -1; + physaddr_t page = p_start; + for(int i = (int) length; i > 0; i -= 4096) + { + if(mapPage(start, page, flags) != 0) + return -1; + page += 4096; + } + return 0; +} + +int kernel::mapPage(void* start, physaddr_t p_start, int flags) { if((size_t) start % 4096 != 0 || p_start % 4096 != 0) return -1; @@ -193,30 +206,24 @@ int kernel::mmap(void* start, physaddr_t p_start, size_t length, int flags) PageTableEntry* pageDirectory = (PageTableEntry*) 0xFFFFF000; size_t tableIndex = (size_t) start / 4096; physaddr_t page = p_start; - for(int i = (int) length; i > 0; i -= 4096) + size_t directoryIndex = tableIndex / 1024; + if(!pageDirectory[directoryIndex].getPresent()) { - size_t directoryIndex = tableIndex / 1024; - if(!pageDirectory[directoryIndex].getPresent()) - { - physaddr_t newPT = State::pageAllocator.allocate(4096); - if(newPT == 0) - return -1; - pageDirectory[directoryIndex] = newPT; - pageDirectory[directoryIndex].setPresent(true); - pageDirectory[directoryIndex].setUsermode(false); - pageDirectory[directoryIndex].setRw(true); - } - if(!pageTables[tableIndex].getPresent()) - { - pageTables[tableIndex] = page; - pageTables[tableIndex].setPresent(true); - pageTables[tableIndex].setUsermode(false); - if(flags & MMAP_RW) - pageTables[tableIndex].setRw(true); - - } - tableIndex++; - page += 4096; + physaddr_t newPT = State::pageAllocator.allocate(4096); + if(newPT == 0) + return -1; + pageDirectory[directoryIndex] = newPT; + pageDirectory[directoryIndex].setPresent(true); + pageDirectory[directoryIndex].setUsermode(false); + pageDirectory[directoryIndex].setRw(true); + } + if(!pageTables[tableIndex].getPresent()) + { + pageTables[tableIndex] = page; + pageTables[tableIndex].setPresent(true); + pageTables[tableIndex].setUsermode(false); + if(flags & MMAP_RW) + pageTables[tableIndex].setRw(true); } return 0; }