Kernel - x86 Fixed a couple of bugs
[tpg/acess2.git] / Kernel / arch / x86 / kpanic.c
index 1972fd3..ccb1073 100644 (file)
@@ -6,11 +6,16 @@
 
 #include <acess.h>
 
+
+
 #define        FB      ((Uint16 *)(KERNEL_BASE|0xB8000))
 #define BGC    0x4F00  // White on Red
 //#define BGC  0xC000  // Black on Bright Red
 //#define BGC  0x1F00  // White on Blue (BSOD!)
 
+extern Uint32  GetEIP(void);
+extern void    Error_Backtrace(Uint32 eip, Uint32 ebp);
+
  int   giKP_Pos = 0;
 
 const struct {
@@ -52,14 +57,21 @@ const struct {
 };
 #define        NUM_REGVALUES   (sizeof(caRegValues)/sizeof(caRegValues[0]))
 
+// === PROTOTYPES ===
+void   KernelPanic_SetMode(void);
+void   KernelPanic_PutChar(char Ch);
+
+// === CODE ===
 /**
  * \brief Sets the screen mode for a kernel panic
  */
-void KernelPanic_SetMode()
+void KernelPanic_SetMode(void)
 {
         int    i;
        
-       // Some routines call this function twice, let's avoid that, shall we?
+       // This function is called by Panic(), but MM_PageFault and the
+       // CPU exception handers also call it, so let's not clear the screen
+       // twice
        if( giKP_Pos )  return ;
        
        // Restore VGA 0xB8000 text mode
@@ -83,6 +95,13 @@ void KernelPanic_SetMode()
        {
                FB[i] = BGC;
        }
+       
+       {
+               Uint32  eip = GetEIP();
+               Uint32  ebp;
+               __asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp));
+               Error_Backtrace(eip, ebp);
+       }
 }
 
 void KernelPanic_PutChar(char Ch)

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