X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Ferrors.c;h=711846c81ecb8ce2cca237b5cc97bf49acea4520;hb=5255c9f07cb2e0e43cf283e256c964eaa7970c8e;hp=66ba4434051e135e76ff3ea35c1651eb084fa304;hpb=9e5348670e92edab24c034bd69793200eeb21847;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/errors.c b/Kernel/arch/x86_64/errors.c index 66ba4434..711846c8 100644 --- a/Kernel/arch/x86_64/errors.c +++ b/Kernel/arch/x86_64/errors.c @@ -4,9 +4,13 @@ */ #include #include +#include + +#define MAX_BACKTRACE 6 // === IMPORTS === void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); +void Error_Backtrace(Uint IP, Uint BP); // === PROTOTYPES === void Error_Handler(tRegs *Regs); @@ -77,3 +81,53 @@ void Error_Handler(tRegs *Regs) for(;;) __asm__ __volatile__ ("hlt"); } + +/** + * \fn void Error_Backtrace(Uint eip, Uint ebp) + * \brief Unrolls the stack to trace execution + * \param eip Current Instruction Pointer + * \param ebp Current Base Pointer (Stack Frame) + */ +void Error_Backtrace(Uint IP, Uint BP) +{ + int i = 0; + + //if(eip < 0xC0000000 && eip > 0x1000) + //{ + // LogF("Backtrace: User - 0x%x\n", eip); + // return; + //} + + if( IP > MM_USER_MAX + && IP < MM_KERNEL_CODE + && (MM_MODULE_MIN > IP || IP > MM_MODULE_MAX) + ) + { + LogF("Backtrace: Data Area - %p\n", IP); + return; + } + + //str = Debug_GetSymbol(eip, &delta); + //if(str == NULL) + LogF("Backtrace: %p", IP); + //else + // LogF("Backtrace: %s+0x%x", str, delta); + if( !MM_GetPhysAddr(BP) ) + { + LogF("\nBacktrace: Invalid BP, stopping\n"); + return; + } + + + while( MM_GetPhysAddr(BP) && i < MAX_BACKTRACE ) + { + //str = Debug_GetSymbol(*(Uint*)(ebp+4), &delta); + //if(str == NULL) + LogF(" >> 0x%llx", ((Uint*)BP)[1]); + //else + // LogF(" >> %s+0x%x", str, delta); + BP = ((Uint*)BP)[0]; + i++; + } + LogF("\n"); +}