diff --git a/Core/Crash/SFrame.cpp b/Core/Crash/SFrame.cpp index ad0b51a..a7ec519 100644 --- a/Core/Crash/SFrame.cpp +++ b/Core/Crash/SFrame.cpp @@ -23,7 +23,7 @@ namespace CrashHandler uint64_t rip; }; - SafeFunction void TraceFrames(CHArchTrapFrame *Frame, int Count) + SafeFunction void TraceFrames(CHArchTrapFrame *Frame, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel) { #if defined(__amd64__) @@ -44,9 +44,9 @@ namespace CrashHandler #endif EHPrint("\e7925CC-"); #if defined(__amd64__) - EHPrint("\eAA25CC%s", KernelSymbolTable->GetSymbolFromAddress(Frame->rip)); + EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip)); #elif defined(__i386__) - EHPrint("\eAA25CC%s", KernelSymbolTable->GetSymbolFromAddress(Frame->eip)); + EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip)); #elif defined(__aarch64__) #endif EHPrint("\e7981FC <- Exception"); @@ -57,15 +57,15 @@ namespace CrashHandler #if defined(__amd64__) EHPrint("\e2565CC%p", (void *)Frame->rip); EHPrint("\e7925CC-"); - if (Frame->rip >= 0xFFFFFFFF80000000 && Frame->rip <= (uint64_t)&_kernel_end) - EHPrint("\eAA25CC%s", KernelSymbolTable->GetSymbolFromAddress(Frame->rip)); + if ((Frame->rip >= 0xFFFFFFFF80000000 && Frame->rip <= (uint64_t)&_kernel_end) || !Kernel) + EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip)); else EHPrint("Outside Kernel"); #elif defined(__i386__) EHPrint("\e2565CC%p", (void *)Frame->eip); EHPrint("\e7925CC-"); - if (Frame->eip >= 0xC0000000 && Frame->eip <= (uint64_t)&_kernel_end) - EHPrint("\eAA25CC%s", KernelSymbolTable->GetSymbolFromAddress(Frame->eip)); + if ((Frame->eip >= 0xC0000000 && Frame->eip <= (uint64_t)&_kernel_end) || !Kernel) + EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip)); else EHPrint("Outside Kernel"); #elif defined(__aarch64__) @@ -78,12 +78,12 @@ namespace CrashHandler EHPrint("\n\e2565CC%p", (void *)frames->rip); EHPrint("\e7925CC-"); #if defined(__amd64__) - if (frames->rip >= 0xFFFFFFFF80000000 && frames->rip <= (uint64_t)&_kernel_end) + if ((frames->rip >= 0xFFFFFFFF80000000 && frames->rip <= (uint64_t)&_kernel_end) || !Kernel) #elif defined(__i386__) - if (frames->rip >= 0xC0000000 && frames->rip <= (uint64_t)&_kernel_end) + if ((frames->rip >= 0xC0000000 && frames->rip <= (uint64_t)&_kernel_end) || !Kernel) #elif defined(__aarch64__) #endif - EHPrint("\e25CCC9%s", KernelSymbolTable->GetSymbolFromAddress(frames->rip)); + EHPrint("\e25CCC9%s", SymHandle->GetSymbolFromAddress(frames->rip)); else EHPrint("\eFF4CA9Outside Kernel"); @@ -92,5 +92,6 @@ namespace CrashHandler frames = frames->rbp; } } + EHPrint("\n"); } } diff --git a/Core/Crash/Screens/StackFrame.cpp b/Core/Crash/Screens/StackFrame.cpp index 23c0a8e..6a93cfe 100644 --- a/Core/Crash/Screens/StackFrame.cpp +++ b/Core/Crash/Screens/StackFrame.cpp @@ -20,9 +20,20 @@ namespace CrashHandler { SafeFunction void DisplayStackFrameScreen(CRData data) { - EHPrint("\eFAFAFATracing 40 frames...\n"); - TraceFrames(data.Frame, 40); - EHPrint("\n\n\eFAFAFATracing interrupt frames...\n"); + EHPrint("\eFAFAFATracing 40 frames..."); + TraceFrames(data.Frame, 40, KernelSymbolTable, true); + if (data.Process) + { + EHPrint("\n\eFAFAFATracing 40 process frames..."); + SymbolResolver::Symbols *sh = data.Process->ELFSymbolTable; + if (!sh) + { + EHPrint("\eFF0000< No symbol table available. >\n"); + return; + } + TraceFrames(data.Frame, 40, sh, false); + } + EHPrint("\n\eFAFAFATracing interrupt frames..."); for (uint64_t i = 0; i < 8; i++) { if (EHIntFrames[i]) diff --git a/Core/Crash/chfcts.hpp b/Core/Crash/chfcts.hpp index d398861..20efb55 100644 --- a/Core/Crash/chfcts.hpp +++ b/Core/Crash/chfcts.hpp @@ -256,7 +256,7 @@ namespace CrashHandler ~CrashKeyboardDriver(); }; - void TraceFrames(CHArchTrapFrame *Frame, int Count); + void TraceFrames(CHArchTrapFrame *Frame, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel); void ArrowInput(uint8_t key); void UserInput(char *Input); diff --git a/Core/Symbols.cpp b/Core/Symbols.cpp index 526ee48..4f581df 100644 --- a/Core/Symbols.cpp +++ b/Core/Symbols.cpp @@ -52,13 +52,10 @@ typedef struct namespace SymbolResolver { - Symbols::SymbolTable SymTable[0x10000]; - uint64_t TotalEntries = 0; - - Symbols::Symbols(uint64_t Address) + Symbols::Symbols(uint64_t ImageAddress) { - debug("Solving symbols for address: %#llx", Address); - Elf64_Ehdr *Header = (Elf64_Ehdr *)Address; + debug("Solving symbols for address: %#llx", ImageAddress); + Elf64_Ehdr *Header = (Elf64_Ehdr *)ImageAddress; if (Header->e_ident[0] != 0x7F && Header->e_ident[1] != 'E' && Header->e_ident[2] != 'L' && @@ -67,7 +64,7 @@ namespace SymbolResolver error("Invalid ELF header"); return; } - Elf64_Shdr *ElfSections = (Elf64_Shdr *)(Address + Header->e_shoff); + Elf64_Shdr *ElfSections = (Elf64_Shdr *)(ImageAddress + Header->e_shoff); Elf64_Sym *ElfSymbols = nullptr; char *strtab = nullptr; @@ -75,9 +72,9 @@ namespace SymbolResolver switch (ElfSections[i].sh_type) { case SHT_SYMTAB: - ElfSymbols = (Elf64_Sym *)(Address + ElfSections[i].sh_offset); - TotalEntries = ElfSections[i].sh_size / sizeof(Elf64_Sym); - debug("Symbol table found, %d entries", TotalEntries); + ElfSymbols = (Elf64_Sym *)(ImageAddress + ElfSections[i].sh_offset); + this->TotalEntries = ElfSections[i].sh_size / sizeof(Elf64_Sym); + debug("Symbol table found, %d entries", this->TotalEntries); break; case SHT_STRTAB: if (Header->e_shstrndx == i) @@ -86,7 +83,7 @@ namespace SymbolResolver } else { - strtab = (char *)Address + ElfSections[i].sh_offset; + strtab = (char *)(uint64_t)ImageAddress + ElfSections[i].sh_offset; debug("String table found, %d entries", ElfSections[i].sh_size); } break; @@ -95,10 +92,10 @@ namespace SymbolResolver if (ElfSymbols != nullptr && strtab != nullptr) { size_t Index, MinimumIndex; - for (size_t i = 0; i < TotalEntries - 1; i++) + for (size_t i = 0; i < this->TotalEntries - 1; i++) { MinimumIndex = i; - for (Index = i + 1; Index < TotalEntries; Index++) + for (Index = i + 1; Index < this->TotalEntries; Index++) if (ElfSymbols[Index].st_value < ElfSymbols[MinimumIndex].st_value) MinimumIndex = Index; Elf64_Sym tmp = ElfSymbols[MinimumIndex]; @@ -109,15 +106,28 @@ namespace SymbolResolver while (ElfSymbols[0].st_value == 0) { ElfSymbols++; - TotalEntries--; + this->TotalEntries--; } - trace("Symbol table loaded, %d entries (%ldKB)", TotalEntries, TO_KB(TotalEntries * sizeof(SymbolTable))); - for (size_t i = 0, g = TotalEntries; i < g; i++) +#ifdef DEBUG + static int once = 0; +#endif + + trace("Symbol table loaded, %d entries (%ldKB)", this->TotalEntries, TO_KB(this->TotalEntries * sizeof(SymbolTable))); + for (size_t i = 0, g = this->TotalEntries; i < g; i++) { - SymTable[i].Address = ElfSymbols[i].st_value; - SymTable[i].FunctionName = &strtab[ElfSymbols[i].st_name]; + this->SymTable[i].Address = ElfSymbols[i].st_value; + this->SymTable[i].FunctionName = &strtab[ElfSymbols[i].st_name]; +#ifdef DEBUG + if (once) + debug("Symbol %d: %#llx %s", i, this->SymTable[i].Address, this->SymTable[i].FunctionName); +#endif } + +#ifdef DEBUG + if (!once) + once++; +#endif } } @@ -126,9 +136,9 @@ namespace SymbolResolver const __no_instrument_function char *Symbols::GetSymbolFromAddress(uint64_t Address) { Symbols::SymbolTable Result{0, (char *)""}; - for (size_t i = 0; i < TotalEntries; i++) - if (SymTable[i].Address <= Address && SymTable[i].Address > Result.Address) - Result = SymTable[i]; + for (size_t i = 0; i < this->TotalEntries; i++) + if (this->SymTable[i].Address <= Address && this->SymTable[i].Address > Result.Address) + Result = this->SymTable[i]; return Result.FunctionName; } } diff --git a/include/symbols.hpp b/include/symbols.hpp index bb203f7..a11f81e 100644 --- a/include/symbols.hpp +++ b/include/symbols.hpp @@ -5,14 +5,18 @@ namespace SymbolResolver { class Symbols { - public: + private: struct SymbolTable { uint64_t Address; char *FunctionName; }; - Symbols(uint64_t Address); + SymbolTable SymTable[0x10000]; + uint64_t TotalEntries = 0; + + public: + Symbols(uint64_t ImageAddress); ~Symbols(); const char *GetSymbolFromAddress(uint64_t Address); }; diff --git a/include/task.hpp b/include/task.hpp index 7a0b699..2068fb7 100644 --- a/include/task.hpp +++ b/include/task.hpp @@ -4,9 +4,10 @@ #include #include +#include +#include #include #include -#include #include #include #include @@ -141,7 +142,7 @@ namespace Tasking Security.IsDebugEnabled = Enable; } - void SetKernelDebugMode(bool Enable) + void SetKernelDebugMode(bool Enable) { CriticalSection cs; trace("Setting kernel debug mode of thread %s to %s", Name, Enable ? "true" : "false"); @@ -162,6 +163,7 @@ namespace Tasking Vector Children; HashMap *IPCHandles; Memory::PageTable4 *PageTable; + SymbolResolver::Symbols *ELFSymbolTable; }; enum TokenTrustLevel @@ -273,7 +275,7 @@ namespace Tasking PCB *CreateProcess(PCB *Parent, const char *Name, - TaskTrustLevel TrustLevel); + TaskTrustLevel TrustLevel, void *Image = nullptr); TCB *CreateThread(PCB *Parent, IP EntryPoint,