diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 2d490ba..37e6e2a 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -21,22 +21,6 @@ NewLock(UserInputLock); -#define TRACE_PAGE_TABLE(x, itr, depth) \ - EHPrint("\e888888#%s\eAABBCC%03d\e4500F5: P:%s RW:%s US:%s PWT:%s PCB:%s A:%s D:%s PS:%s G:%s Address:\e888888%#lx\n", \ - depth, \ - itr, \ - x.Present ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.ReadWrite ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.UserSupervisor ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.WriteThrough ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.CacheDisable ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.Accessed ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.Dirty ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.PageSize ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.Global ? "\e00AA00Yes\e4500F5" : "\eAA0000No \e4500F5", \ - x.GetAddress() << 12); \ - Display->SetBuffer(SBIdx); - namespace CrashHandler { void *EHIntFrames[INT_FRAMES_MAX]; @@ -312,54 +296,93 @@ namespace CrashHandler debug("Converted %s to %#lx", arg, Address); Memory::PageTable4 *BasePageTable = (Memory::PageTable4 *)Address; if (Memory::Virtual().Check(BasePageTable)) - for (int Index = 0; Index < 512; Index++) + { + for (int PMLIndex = 0; PMLIndex < 512; PMLIndex++) { - if (BasePageTable->Entries[Index].raw == 0) - continue; - - // TRACE_PAGE_TABLE(BasePageTable->Entries[Index], Index, ""); - // for (int i = 0; i < 10000; i++) - // inb(0x80); - - // if (BasePageTable->Entries[Index].GetFlag(Memory::PTFlag::P)) - // { - // Memory::PageTable4 *PDP = (Memory::PageTable4 *)((uint64_t)BasePageTable->Entries[Index].GetAddress() << 12); - // for (int PMLIndex = 0; PMLIndex < 512; PMLIndex++) - // { - // if (PDP->Entries[PMLIndex].raw == 0) - // continue; - // TRACE_PAGE_TABLE(PDP->Entries[PMLIndex], PMLIndex, " "); - // for (int i = 0; i < 10000; i++) - // inb(0x80); - - // if (PDP->Entries[PMLIndex].GetFlag(Memory::PTFlag::P)) - // { - // Memory::PageTable4 *PD = (Memory::PageTable4 *)((uint64_t)PDP->Entries[PMLIndex].GetAddress() << 12); - // for (int PDPTEIndex = 0; PDPTEIndex < 512; PDPTEIndex++) - // { - // if (PD->Entries[PDPTEIndex].raw == 0) - // continue; - // TRACE_PAGE_TABLE(PD->Entries[PDPTEIndex], PDPTEIndex, " "); - // for (int i = 0; i < 10000; i++) - // inb(0x80); - - // if (PD->Entries[PDPTEIndex].GetFlag(Memory::PTFlag::P)) - // { - // Memory::PageTable4 *PT = (Memory::PageTable4 *)((uint64_t)PD->Entries[PDPTEIndex].GetAddress() << 12); - // for (int PTEIndex = 0; PTEIndex < 512; PTEIndex++) - // { - // if (PT->Entries[PTEIndex].raw == 0) - // continue; - // TRACE_PAGE_TABLE(PT->Entries[PTEIndex], PTEIndex, " "); - // for (int i = 0; i < 10000; i++) - // inb(0x80); - // } - // } - // } - // } - // } - // } + Memory::PageMapLevel4 PML4 = BasePageTable->Entries[PMLIndex]; + EHPrint("\e888888# \eAABBCC%03d-%03d-%03d-%03d\e4500F5: P:%s RW:%s US:%s PWT:%s PCB:%s A:%s NX:%s Address:\e888888%#lx\n", + PMLIndex, 0, 0, 0, + PML4.Present ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.ReadWrite ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.UserSupervisor ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.WriteThrough ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.CacheDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.Accessed ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.ExecuteDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PML4.GetAddress()); + Display->SetBuffer(SBIdx); + if (PML4.Present) + { + Memory::PageDirectoryPointerTableEntryPtr *PDPTE = (Memory::PageDirectoryPointerTableEntryPtr *)((uint64_t)PML4.GetAddress() << 12); + if (PDPTE) + { + for (int PDPTEIndex = 0; PDPTEIndex < 512; PDPTEIndex++) + { + EHPrint("\e888888# \eAABBCC%03d-%03d-%03d-%03d\e4500F5: P:%s RW:%s US:%s PWT:%s PCB:%s A:%s NX:%s Address:\e888888%#lx\n", + PMLIndex, PDPTEIndex, 0, 0, + PDPTE->Entries[PDPTEIndex].Present ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].ReadWrite ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].UserSupervisor ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].WriteThrough ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].CacheDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].Accessed ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].ExecuteDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDPTE->Entries[PDPTEIndex].GetAddress()); + Display->SetBuffer(SBIdx); + if ((PDPTE->Entries[PDPTEIndex].Present)) + { + Memory::PageDirectoryEntryPtr *PDE = (Memory::PageDirectoryEntryPtr *)((uint64_t)PDPTE->Entries[PDPTEIndex].GetAddress() << 12); + if (PDE) + { + for (int PDEIndex = 0; PDEIndex < 512; PDEIndex++) + { + EHPrint("\e888888# \eAABBCC%03d-%03d-%03d-%03d\e4500F5: P:%s RW:%s US:%s PWT:%s PCB:%s A:%s NX:%s Address:\e888888%#lx\n", + PMLIndex, PDPTEIndex, PDEIndex, 0, + PDE->Entries[PDEIndex].Present ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].ReadWrite ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].UserSupervisor ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].WriteThrough ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].CacheDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].Accessed ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].ExecuteDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PDE->Entries[PDEIndex].GetAddress()); + Display->SetBuffer(SBIdx); + if ((PDE->Entries[PDEIndex].Present)) + { + Memory::PageTableEntryPtr *PTE = (Memory::PageTableEntryPtr *)((uint64_t)PDE->Entries[PDEIndex].GetAddress() << 12); + if (PTE) + { + for (int PTEIndex = 0; PTEIndex < 512; PTEIndex++) + { + EHPrint("\e888888# \eAABBCC%03d-%03d-%03d-%03d\e4500F5: P:%s RW:%s US:%s PWT:%s PCB:%s A:%s D:%s PAT:%s G:%s PK:%d NX:%s Address:\e888888%#lx\n", + PMLIndex, PDPTEIndex, PDEIndex, PTEIndex, + PTE->Entries[PTEIndex].Present ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].ReadWrite ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].UserSupervisor ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].WriteThrough ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].CacheDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].Accessed ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].Dirty ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].PageAttributeTable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].Global ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].ProtectionKey, + PTE->Entries[PTEIndex].ExecuteDisable ? "\e00FF001\e4500F5" : "\eFF00000\e4500F5", + PTE->Entries[PTEIndex].GetAddress()); + Display->SetBuffer(SBIdx); + if ((PTE->Entries[PTEIndex].Present)) + { + } + } + } + } + } + } + } + } + } + } } + } } else if (strncmp(Input, "bitmap", 6) == 0) { diff --git a/Core/Memory/VirtualMemoryManager.cpp b/Core/Memory/VirtualMemoryManager.cpp index 2d6922e..873e45d 100644 --- a/Core/Memory/VirtualMemoryManager.cpp +++ b/Core/Memory/VirtualMemoryManager.cpp @@ -127,10 +127,7 @@ namespace Memory (byte & 0x01 ? '1' : '0') if (!this->Check(VirtualAddress, (PTFlag)Flags)) // quick workaround just to see where it fails - { - this->Check(VirtualAddress, (PTFlag)Flags); warn("Failed to map %#lx - %#lx with flags: " BYTE_TO_BINARY_PATTERN, VirtualAddress, PhysicalAddress, BYTE_TO_BINARY(Flags)); - } #endif } diff --git a/include/memory.hpp b/include/memory.hpp index cd77039..88ba1f8 100644 --- a/include/memory.hpp +++ b/include/memory.hpp @@ -169,8 +169,8 @@ namespace Memory bool Global : 1; // 8 uint8_t Available0 : 3; // 9-11 uint64_t Address : 40; // 12-51 - uint32_t Available1 : 7; // 52-58 - bool ProtectionKey : 4; // 59-62 + uint32_t Available1 : 7; // 52-58 + uint8_t ProtectionKey : 4; // 59-62 bool ExecuteDisable : 1; // 63 }; uint64_t raw; @@ -215,15 +215,15 @@ namespace Memory { struct { - bool Present : 1; // 0 - bool ReadWrite : 1; // 1 - bool UserSupervisor : 1; // 2 - bool WriteThrough : 1; // 3 - bool CacheDisable : 1; // 4 - bool Accessed : 1; // 5 - bool Available0 : 1; // 6 - bool PageSize : 1; // 7 - uint8_t Available1 : 4; // 8-11 + bool Present : 1; // 0 + bool ReadWrite : 1; // 1 + bool UserSupervisor : 1; // 2 + bool WriteThrough : 1; // 3 + bool CacheDisable : 1; // 4 + bool Accessed : 1; // 5 + bool Available0 : 1; // 6 + bool PageSize : 1; // 7 + uint8_t Available1 : 4; // 8-11 uint64_t Address : 40; // 12-51 uint32_t Available2 : 11; // 52-62 bool ExecuteDisable : 1; // 63 @@ -270,15 +270,15 @@ namespace Memory { struct { - bool Present : 1; // 0 - bool ReadWrite : 1; // 1 - bool UserSupervisor : 1; // 2 - bool WriteThrough : 1; // 3 - bool CacheDisable : 1; // 4 - bool Accessed : 1; // 5 - bool Available0 : 1; // 6 - bool PageSize : 1; // 7 - uint8_t Available1 : 4; // 8-11 + bool Present : 1; // 0 + bool ReadWrite : 1; // 1 + bool UserSupervisor : 1; // 2 + bool WriteThrough : 1; // 3 + bool CacheDisable : 1; // 4 + bool Accessed : 1; // 5 + bool Available0 : 1; // 6 + bool PageSize : 1; // 7 + uint8_t Available1 : 4; // 8-11 uint64_t Address : 40; // 12-51 uint32_t Available2 : 11; // 52-62 bool ExecuteDisable : 1; // 63 @@ -325,15 +325,15 @@ namespace Memory { struct { - bool Present : 1; // 0 - bool ReadWrite : 1; // 1 - bool UserSupervisor : 1; // 2 - bool WriteThrough : 1; // 3 - bool CacheDisable : 1; // 4 - bool Accessed : 1; // 5 - bool Available0 : 1; // 6 - bool Reserved0 : 1; // 7 - uint8_t Available1 : 4; // 8-11 + bool Present : 1; // 0 + bool ReadWrite : 1; // 1 + bool UserSupervisor : 1; // 2 + bool WriteThrough : 1; // 3 + bool CacheDisable : 1; // 4 + bool Accessed : 1; // 5 + bool Available0 : 1; // 6 + bool Reserved0 : 1; // 7 + uint8_t Available1 : 4; // 8-11 uint64_t Address : 40; // 12-51 uint32_t Available2 : 11; // 52-62 bool ExecuteDisable : 1; // 63