3 * - By John Hodge (thePowersGang)
6 * - x86 Kernel Panic Handler
13 #define FB ((Uint16 *)(KERNEL_BASE|0xB8000))
14 #define BGC 0x4F00 // White on Red
15 //#define BGC 0xC000 // Black on Bright Red
16 //#define BGC 0x1F00 // White on Blue (BSOD!)
19 extern Uint32 GetEIP(void);
20 extern void Error_Backtrace(Uint32 eip, Uint32 ebp);
22 extern void MP_SendIPIVector(int CPU, Uint8 Vector);
24 extern int GetCPUNum(void);
28 void KernelPanic_SetMode(void);
29 void KernelPanic_PutChar(char Ch);
38 //{0x3C0, 0x3C0, 0x10, 0x0C}, // Mode Control (Blink Enabled)
39 {0x3C0, 0x3C0, 0x10, 0x04}, // Mode Control (Blink Disabled)
40 {0x3C0, 0x3C0, 0x11, 0x00}, // Overscan Register
41 {0x3C0, 0x3C0, 0x12, 0x0F}, // Color Plane Enable
42 {0x3C0, 0x3C0, 0x13, 0x08}, // Horizontal Panning
43 {0x3C0, 0x3C0, 0x14, 0x00}, // Color Select
44 {0 , 0x3C2, 0 , 0x67}, // Miscellaneous Output Register
45 {0x3C4, 0x3C5, 0x01, 0x00}, // Clock Mode Register
46 {0x3C4, 0x3C5, 0x03, 0x00}, // Character select
47 {0x3C4, 0x3C5, 0x04, 0x07}, // Memory Mode Register
48 {0x3CE, 0x3CF, 0x05, 0x10}, // Mode Register
49 {0x3CE, 0x3CF, 0x06, 0x0E}, // Miscellaneous Register
50 {0x3D4, 0x3D5, 0x00, 0x5F}, // Horizontal Total
51 {0x3D4, 0x3D5, 0x01, 0x4F}, // Horizontal Display Enable End
52 {0x3D4, 0x3D5, 0x02, 0x50}, // Horizontal Blank Start
53 {0x3D4, 0x3D5, 0x03, 0x82}, // Horizontal Blank End
54 {0x3D4, 0x3D5, 0x04, 0x55}, // Horizontal Retrace Start
55 {0x3D4, 0x3D5, 0x05, 0x81}, // Horizontal Retrace End
56 {0x3D4, 0x3D5, 0x06, 0xBF}, // Vertical Total
57 {0x3D4, 0x3D5, 0x07, 0x1F}, // Overflow Register
58 {0x3D4, 0x3D5, 0x08, 0x00}, // Preset row scan
59 {0x3D4, 0x3D5, 0x09, 0x4F}, // Maximum Scan Line
60 {0x3D4, 0x3D5, 0x10, 0x9C}, // Vertical Retrace Start
61 {0x3D4, 0x3D5, 0x11, 0x8E}, // Vertical Retrace End
62 {0x3D4, 0x3D5, 0x12, 0x8F}, // Vertical Display Enable End
63 {0x3D4, 0x3D5, 0x13, 0x28}, // Logical Width
64 {0x3D4, 0x3D5, 0x14, 0x1F}, // Underline Location
65 {0x3D4, 0x3D5, 0x15, 0x96}, // Vertical Blank Start
66 {0x3D4, 0x3D5, 0x16, 0xB9}, // Vertical Blank End
67 {0x3D4, 0x3D5, 0x17, 0xA3} // CRTC Mode Control
69 #define NUM_REGVALUES (sizeof(caRegValues)/sizeof(caRegValues[0]))
76 * \brief Sets the screen mode for a kernel panic
78 void KernelPanic_SetMode(void)
80 __asm__ __volatile__ ("cli"); // Stop the processor!
82 // This function is called by Panic(), but MM_PageFault and the
83 // CPU exception handers also call it, so let's not clear the screen
85 if( giKP_Pos ) return ;
88 // Send halt to all processors
89 for( int i = 0; i < giNumCPUs; i ++ )
91 if(i == GetCPUNum()) continue ;
93 MP_SendIPIVector(i, 0xED);
97 #if ENABLE_KPANIC_MODE
98 // Restore VGA 0xB8000 text mode
100 for( int i = 0; i < NUM_REGVALUES; i++ )
103 if( caRegValues[i].IdxPort == 0x3C0 ) inb(0x3DA);
105 if( caRegValues[i].IdxPort )
106 outb(caRegValues[i].IdxPort, caRegValues[i].Index);
107 outb(caRegValues[i].DatPort, caRegValues[i].Value);
115 for( int i = 0; i < 80*25; i++ )
121 Uint32 eip = GetEIP();
123 __asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp));
124 Error_Backtrace(eip, ebp);
129 void KernelPanic_PutChar(char Ch)
131 #if ENABLE_KPANIC_MODE
132 if( giKP_Pos > 80*25 ) return ;
137 FB[giKP_Pos] &= 0xFF00;
138 FB[giKP_Pos++] |= ' ';
139 } while(giKP_Pos & 7);
145 giKP_Pos -= giKP_Pos % 80;
149 if(' ' <= Ch && Ch < 0x7F)
151 FB[giKP_Pos] &= 0xFF00;
160 VT_int_PutString(gpVT_CurTerm, s);
163 #endif // ENABLE_KPANIC_MODE