Bug fix in munmap: PDEs were mistakenly updated

This commit is contained in:
2020-08-01 16:12:03 -05:00
parent f8a4b0b1e4
commit fec2817883

View File

@@ -48,10 +48,10 @@ int kernel::munmap(MemoryAllocator& allocator, void* start, size_t length)
size_t directoryIndex = tableIndex / 1024; size_t directoryIndex = tableIndex / 1024;
if(pageDirectory[directoryIndex].getPresent()) if(pageDirectory[directoryIndex].getPresent())
{ {
pageDirectory[directoryIndex] = 0; pageTables[tableIndex] = 0;
pageDirectory[directoryIndex].setPresent(false); pageTables[tableIndex].setPresent(false);
pageDirectory[directoryIndex].setUsermode(false); pageTables[tableIndex].setUsermode(false);
pageDirectory[directoryIndex].setRw(false); pageTables[tableIndex].setRw(false);
} }
tableIndex++; tableIndex++;
} }
@@ -75,24 +75,26 @@ physaddr_t kernel::getPhysicalAddress(void* addr)
{ {
PageTableEntry* pageTables = (PageTableEntry*) 0xFFC00000; PageTableEntry* pageTables = (PageTableEntry*) 0xFFC00000;
size_t tableIndex = (size_t) addr / 4096; size_t tableIndex = (size_t) addr / 4096;
return pageTables[tableIndex].getPhysicalAddress() + (size_t) addr & 0xFFF; return pageTables[tableIndex].getPhysicalAddress() + ((size_t) addr & 0xFFF);
} }
int kernel::createAddressSpace(void* table) int kernel::createAddressSpace(void* table)
{ {
if((size_t) table & 0xFFF != 0) if(((size_t) table & 0xFFF) != 0)
return -1; return -1;
PageTableEntry* pageDirectory = (PageTableEntry*) 0xFFFFF000; PageTableEntry* pageDirectory = (PageTableEntry*) 0xFFFFF000;
PageTableEntry* newDirectory = (PageTableEntry*) table; PageTableEntry* newDirectory = (PageTableEntry*) table;
newDirectory[1022] = pageDirectory[1022]; newDirectory[1022] = pageDirectory[1022];
newDirectory[1023] = pageDirectory[1023]; newDirectory[1023] = pageDirectory[1023];
return 0;
} }
int kernel::loadAddressSpace(physaddr_t table) int kernel::loadAddressSpace(physaddr_t table)
{ {
if(table & 0xFFF != 0) if((table & 0xFFF) != 0)
return -1; return -1;
asm("mov %0, %cr3" asm("mov %0, %%cr3"
: :
: "r" (table)); : "r" (table));
return 0;
} }