mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Crash screen: Frames tab should get physical address of rbp on usermode threads
This commit is contained in:
parent
eae6006d25
commit
3f89b6d863
@ -23,29 +23,11 @@ namespace CrashHandler
|
|||||||
uintptr_t rip;
|
uintptr_t rip;
|
||||||
};
|
};
|
||||||
|
|
||||||
SafeFunction void TraceFrames(CHArchTrapFrame *Frame, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel)
|
SafeFunction void TraceFrames(CRData data, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel)
|
||||||
{
|
{
|
||||||
if (!Memory::Virtual().Check(Frame))
|
if (!Memory::Virtual().Check(data.Frame))
|
||||||
{
|
{
|
||||||
EHPrint("Invalid frame pointer: %p\n", Frame);
|
EHPrint("Invalid frame pointer: %p\n", data.Frame);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(a64)
|
|
||||||
struct StackFrame *frames = (struct StackFrame *)Frame->rbp; // (struct StackFrame *)__builtin_frame_address(0);
|
|
||||||
if (!Memory::Virtual().Check((void *)Frame->rbp))
|
|
||||||
#elif defined(a32)
|
|
||||||
struct StackFrame *frames = (struct StackFrame *)Frame->ebp; // (struct StackFrame *)__builtin_frame_address(0);
|
|
||||||
if (!Memory::Virtual().Check((void *)Frame->ebp))
|
|
||||||
#elif defined(aa64)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#if defined(a64)
|
|
||||||
EHPrint("Invalid rbp pointer: %p\n", Frame->rbp);
|
|
||||||
#elif defined(a32)
|
|
||||||
EHPrint("Invalid ebp pointer: %p\n", Frame->ebp);
|
|
||||||
#elif defined(aa64)
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,21 +37,49 @@ namespace CrashHandler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("\nStack tracing... %p %d %p %d", Frame, Count, frames, Kernel);
|
bool TriedRetryBP = false;
|
||||||
|
struct StackFrame *frames = nullptr;
|
||||||
|
RetryBP:
|
||||||
|
#if defined(a64)
|
||||||
|
if (TriedRetryBP == false)
|
||||||
|
frames = (struct StackFrame *)data.Frame->rbp;
|
||||||
|
#elif defined(a32)
|
||||||
|
if (TriedRetryBP == false)
|
||||||
|
frames = (struct StackFrame *)data.Frame->ebp;
|
||||||
|
#elif defined(aa64)
|
||||||
|
#endif
|
||||||
|
if (!Memory::Virtual().Check((void *)frames))
|
||||||
|
{
|
||||||
|
if (TriedRetryBP == false)
|
||||||
|
{
|
||||||
|
frames = (struct StackFrame *)Memory::Virtual(data.Process->PageTable).GetPhysical((void *)frames);
|
||||||
|
TriedRetryBP = true;
|
||||||
|
goto RetryBP;
|
||||||
|
}
|
||||||
|
#if defined(a64)
|
||||||
|
EHPrint("Invalid rbp pointer: %p\n", data.Frame->rbp);
|
||||||
|
#elif defined(a32)
|
||||||
|
EHPrint("Invalid ebp pointer: %p\n", data.Frame->ebp);
|
||||||
|
#elif defined(aa64)
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("\nStack tracing... %p %d %p %d", data.Frame, Count, frames, Kernel);
|
||||||
EHPrint("\e7981FC\nStack Trace:\n");
|
EHPrint("\e7981FC\nStack Trace:\n");
|
||||||
if (!frames || !frames->rip || !frames->rbp)
|
if (!frames || !frames->rip || !frames->rbp)
|
||||||
{
|
{
|
||||||
#if defined(a64)
|
#if defined(a64)
|
||||||
EHPrint("\e2565CC%p", (void *)Frame->rip);
|
EHPrint("\e2565CC%p", (void *)data.Frame->rip);
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
EHPrint("\e2565CC%p", (void *)Frame->eip);
|
EHPrint("\e2565CC%p", (void *)data.Frame->eip);
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
EHPrint("\e7925CC-");
|
EHPrint("\e7925CC-");
|
||||||
#if defined(a64)
|
#if defined(a64)
|
||||||
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip));
|
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(data.Frame->rip));
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip));
|
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(data.Frame->eip));
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
EHPrint("\e7981FC <- Exception");
|
EHPrint("\e7981FC <- Exception");
|
||||||
@ -78,17 +88,17 @@ namespace CrashHandler
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(a64)
|
#if defined(a64)
|
||||||
EHPrint("\e2565CC%p", (void *)Frame->rip);
|
EHPrint("\e2565CC%p", (void *)data.Frame->rip);
|
||||||
EHPrint("\e7925CC-");
|
EHPrint("\e7925CC-");
|
||||||
if ((Frame->rip >= 0xFFFFFFFF80000000 && Frame->rip <= (uintptr_t)&_kernel_end) || !Kernel)
|
if ((data.Frame->rip >= 0xFFFFFFFF80000000 && data.Frame->rip <= (uintptr_t)&_kernel_end) || !Kernel)
|
||||||
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->rip));
|
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(data.Frame->rip));
|
||||||
else
|
else
|
||||||
EHPrint("Outside Kernel");
|
EHPrint("Outside Kernel");
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
EHPrint("\e2565CC%p", (void *)Frame->eip);
|
EHPrint("\e2565CC%p", (void *)data.Frame->eip);
|
||||||
EHPrint("\e7925CC-");
|
EHPrint("\e7925CC-");
|
||||||
if ((Frame->eip >= 0xC0000000 && Frame->eip <= (uintptr_t)&_kernel_end) || !Kernel)
|
if ((data.Frame->eip >= 0xC0000000 && data.Frame->eip <= (uintptr_t)&_kernel_end) || !Kernel)
|
||||||
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(Frame->eip));
|
EHPrint("\eAA25CC%s", SymHandle->GetSymbolFromAddress(data.Frame->eip));
|
||||||
else
|
else
|
||||||
EHPrint("Outside Kernel");
|
EHPrint("Outside Kernel");
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
|
@ -21,7 +21,7 @@ namespace CrashHandler
|
|||||||
SafeFunction void DisplayStackFrameScreen(CRData data)
|
SafeFunction void DisplayStackFrameScreen(CRData data)
|
||||||
{
|
{
|
||||||
EHPrint("\eFAFAFATracing 10 frames...");
|
EHPrint("\eFAFAFATracing 10 frames...");
|
||||||
TraceFrames(data.Frame, 10, KernelSymbolTable, true);
|
TraceFrames(data, 10, KernelSymbolTable, true);
|
||||||
if (data.Process)
|
if (data.Process)
|
||||||
{
|
{
|
||||||
EHPrint("\n\eFAFAFATracing 10 process frames...");
|
EHPrint("\n\eFAFAFATracing 10 process frames...");
|
||||||
@ -29,7 +29,7 @@ namespace CrashHandler
|
|||||||
if (!sh)
|
if (!sh)
|
||||||
EHPrint("\n\eFF0000< No symbol table available. >\n");
|
EHPrint("\n\eFF0000< No symbol table available. >\n");
|
||||||
else
|
else
|
||||||
TraceFrames(data.Frame, 10, sh, false);
|
TraceFrames(data, 10, sh, false);
|
||||||
}
|
}
|
||||||
EHPrint("\n\eFAFAFATracing interrupt frames...");
|
EHPrint("\n\eFAFAFATracing interrupt frames...");
|
||||||
for (short i = 0; i < 8; i++)
|
for (short i = 0; i < 8; i++)
|
||||||
|
@ -256,7 +256,7 @@ namespace CrashHandler
|
|||||||
~CrashKeyboardDriver();
|
~CrashKeyboardDriver();
|
||||||
};
|
};
|
||||||
|
|
||||||
void TraceFrames(CHArchTrapFrame *Frame, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel);
|
void TraceFrames(CRData data, int Count, SymbolResolver::Symbols *SymHandle, bool Kernel);
|
||||||
|
|
||||||
void ArrowInput(uint8_t key);
|
void ArrowInput(uint8_t key);
|
||||||
void UserInput(char *Input);
|
void UserInput(char *Input);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user