From 11221b205a3f9327a20aed71d64bfb58418a0441 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Sun, 4 Feb 2024 04:29:17 +0200 Subject: [PATCH] Refactor code to improve performance and readability --- core/crash/crash_handler.cpp | 158 ++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 77 deletions(-) diff --git a/core/crash/crash_handler.cpp b/core/crash/crash_handler.cpp index eb1aa26..94b321c 100644 --- a/core/crash/crash_handler.cpp +++ b/core/crash/crash_handler.cpp @@ -446,92 +446,95 @@ namespace CrashHandler Address = strtol(arg, NULL, 16); debug("Converted %s to %#lx", arg, Address); Memory::PageTable *BasePageTable = (Memory::PageTable *)Address; - if (Memory::Virtual().Check(BasePageTable)) + if (!Memory::Virtual().Check(BasePageTable)) + { + EHPrint("\eFF4400Address %#lx is not valid!\eFAFAFA\n", Address); + goto DrawBottom; + } + + for (int PMLIndex = 0; PMLIndex < 512; PMLIndex++) { - for (int PMLIndex = 0; PMLIndex < 512; PMLIndex++) - { #if defined(a64) - Memory::PageMapLevel4 PML4 = BasePageTable->Entries[PMLIndex]; + 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() << 12); + Display->SetBuffer(SBIdx); + if (!PML4.Present) + continue; + + Memory::PageDirectoryPointerTableEntryPtr *PDPTE = (Memory::PageDirectoryPointerTableEntryPtr *)((uintptr_t)PML4.GetAddress() << 12); + if (!PDPTE) + continue; + + 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, 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() << 12); + 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() << 12); Display->SetBuffer(SBIdx); - if (PML4.Present) + if (!PDPTE->Entries[PDPTEIndex].Present) + continue; + + Memory::PageDirectoryEntryPtr *PDE = (Memory::PageDirectoryEntryPtr *)((uintptr_t)PDPTE->Entries[PDPTEIndex].GetAddress() << 12); + if (!PDE) + continue; + + for (int PDEIndex = 0; PDEIndex < 512; PDEIndex++) { - Memory::PageDirectoryPointerTableEntryPtr *PDPTE = (Memory::PageDirectoryPointerTableEntryPtr *)((uintptr_t)PML4.GetAddress() << 12); - if (PDPTE) + 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() << 12); + Display->SetBuffer(SBIdx); + if (!PDE->Entries[PDEIndex].Present) + continue; + + Memory::PageTableEntryPtr *PTE = (Memory::PageTableEntryPtr *)((uintptr_t)PDE->Entries[PDEIndex].GetAddress() << 12); + if (!PTE) + continue; + + for (int PTEIndex = 0; PTEIndex < 512; PTEIndex++) { - 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() << 12); - Display->SetBuffer(SBIdx); - if ((PDPTE->Entries[PDPTEIndex].Present)) - { - Memory::PageDirectoryEntryPtr *PDE = (Memory::PageDirectoryEntryPtr *)((uintptr_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() << 12); - Display->SetBuffer(SBIdx); - if ((PDE->Entries[PDEIndex].Present)) - { - Memory::PageTableEntryPtr *PTE = (Memory::PageTableEntryPtr *)((uintptr_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() << 12); - Display->SetBuffer(SBIdx); - } - } - } - } - } - } - } + 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() << 12); + Display->SetBuffer(SBIdx); } } -#endif } +#endif } } else if (strncmp(Input, "bitmap", 6) == 0) @@ -808,6 +811,7 @@ namespace CrashHandler else if (strlen(Input) > 0) EHPrint("Unknown command: %s", Input); + DrawBottom: DisplayBottomOverlay(); Display->SetBuffer(SBIdx); }