Kernel/x86 - Evil hack to do validation of virtual memory
[tpg/acess2.git] / KernelLand / Kernel / arch / x86_64 / errors.c
index f7da7f9..81d6466 100644 (file)
@@ -6,6 +6,7 @@
 #include <proc.h>
 #include <mm_virt.h>
 #include <threads_int.h>       // Needed for SSE handling
+#include <debug_hooks.h>
 
 #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)

UCC git Repository :: git.ucc.asn.au