Wrote mmap overload with physical address argument

This commit is contained in:
2020-11-19 10:05:27 -06:00
parent c601aed9f2
commit d3eab67473
2 changed files with 38 additions and 0 deletions

View File

@@ -12,6 +12,8 @@ namespace kernel
int mmap(void* start, size_t length, int flags);
int mmap(void* start, physaddr_t p_start, size_t length, int flags);
int munmap(void* start, size_t length);
bool isMapped(void* addr);

View File

@@ -185,6 +185,42 @@ int kernel::mmap(void* start, size_t length, int flags)
return 0;
}
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;
PageTableEntry* pageTables = (PageTableEntry*) 0xFFC00000;
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())
{
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;
}
return 0;
}
int kernel::munmap(void* start, size_t length)
{
if((size_t) start % 4096 != 0)