X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86_64%2Ferrors.c;h=81d6466ba10f2b52e565592414f06de92c246e11;hb=8b72370eae1a3cfa8916136fd8ffc1460e9291ba;hp=f7da7f9f8d5a9362f7a8d1b0becc0e9fc9c0da00;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86_64/errors.c b/KernelLand/Kernel/arch/x86_64/errors.c index f7da7f9f..81d6466b 100644 --- a/KernelLand/Kernel/arch/x86_64/errors.c +++ b/KernelLand/Kernel/arch/x86_64/errors.c @@ -6,6 +6,7 @@ #include #include #include // Needed for SSE handling +#include #define MAX_BACKTRACE 6 @@ -98,6 +99,9 @@ void Error_Handler(tRegs *Regs) *(Uint8*)(Regs->RIP+2), *(Uint8*)(Regs->RIP+3) ); break; + case 2: // NMI + Threads_Dump(); + break; } __asm__ __volatile__ ("cli"); @@ -105,6 +109,13 @@ void Error_Handler(tRegs *Regs) __asm__ __volatile__ ("hlt"); } +void Proc_PrintBacktrace(void) +{ + Uint64 *rbp; + __asm__ __volatile__ ("mov %%rbp, %0" : "=r" (rbp)); + Error_Backtrace( rbp[1], rbp[0] ); +} + /** * \fn void Error_Backtrace(Uint eip, Uint ebp) * \brief Unrolls the stack to trace execution @@ -134,14 +145,14 @@ void Error_Backtrace(Uint IP, Uint BP) LogF("Backtrace: %p", IP); //else // LogF("Backtrace: %s+0x%x", str, delta); - if( !MM_GetPhysAddr(BP) ) + if( !MM_GetPhysAddr( (void*)BP ) ) { LogF("\nBacktrace: Invalid BP, stopping\n"); return; } - while( MM_GetPhysAddr(BP) && MM_GetPhysAddr(BP+8+7) && i < MAX_BACKTRACE ) + while( MM_GetPhysAddr( (void*)BP) && MM_GetPhysAddr((void*)(BP+8+7)) && i < MAX_BACKTRACE ) { //str = Debug_GetSymbol(*(Uint*)(ebp+4), &delta); //if(str == NULL)