3 * By John Hodge (thePowersGang)
4 * - x86 Kernel Panic Handler
9 #define FB ((Uint16 *)(KERNEL_BASE|0xB8000))
10 #define BGC 0x4F00 // White on Red
11 //#define BGC 0xC000 // Black on Bright Red
12 //#define BGC 0x1F00 // White on Blue (BSOD!)
22 //{0x3C0, 0x3C0, 0x10, 0x0C}, // Mode Control (Blink Enabled)
23 {0x3C0, 0x3C0, 0x10, 0x04}, // Mode Control (Blink Disabled)
24 {0x3C0, 0x3C0, 0x11, 0x00}, // Overscan Register
25 {0x3C0, 0x3C0, 0x12, 0x0F}, // Color Plane Enable
26 {0x3C0, 0x3C0, 0x13, 0x08}, // Horizontal Panning
27 {0x3C0, 0x3C0, 0x14, 0x00}, // Color Select
28 {0 , 0x3C2, 0 , 0x67}, // Miscellaneous Output Register
29 {0x3C4, 0x3C5, 0x01, 0x00}, // Clock Mode Register
30 {0x3C4, 0x3C5, 0x03, 0x00}, // Character select
31 {0x3C4, 0x3C5, 0x04, 0x07}, // Memory Mode Register
32 {0x3CE, 0x3CF, 0x05, 0x10}, // Mode Register
33 {0x3CE, 0x3CF, 0x06, 0x0E}, // Miscellaneous Register
34 {0x3D4, 0x3D5, 0x00, 0x5F}, // Horizontal Total
35 {0x3D4, 0x3D5, 0x01, 0x4F}, // Horizontal Display Enable End
36 {0x3D4, 0x3D5, 0x02, 0x50}, // Horizontal Blank Start
37 {0x3D4, 0x3D5, 0x03, 0x82}, // Horizontal Blank End
38 {0x3D4, 0x3D5, 0x04, 0x55}, // Horizontal Retrace Start
39 {0x3D4, 0x3D5, 0x05, 0x81}, // Horizontal Retrace End
40 {0x3D4, 0x3D5, 0x06, 0xBF}, // Vertical Total
41 {0x3D4, 0x3D5, 0x07, 0x1F}, // Overflow Register
42 {0x3D4, 0x3D5, 0x08, 0x00}, // Preset row scan
43 {0x3D4, 0x3D5, 0x09, 0x4F}, // Maximum Scan Line
44 {0x3D4, 0x3D5, 0x10, 0x9C}, // Vertical Retrace Start
45 {0x3D4, 0x3D5, 0x11, 0x8E}, // Vertical Retrace End
46 {0x3D4, 0x3D5, 0x12, 0x8F}, // Vertical Display Enable End
47 {0x3D4, 0x3D5, 0x13, 0x28}, // Logical Width
48 {0x3D4, 0x3D5, 0x14, 0x1F}, // Underline Location
49 {0x3D4, 0x3D5, 0x15, 0x96}, // Vertical Blank Start
50 {0x3D4, 0x3D5, 0x16, 0xB9}, // Vertical Blank End
51 {0x3D4, 0x3D5, 0x17, 0xA3} // CRTC Mode Control
53 #define NUM_REGVALUES (sizeof(caRegValues)/sizeof(caRegValues[0]))
56 void KernelPanic_SetMode(void);
57 void KernelPanic_PutChar(char Ch);
61 * \brief Sets the screen mode for a kernel panic
63 void KernelPanic_SetMode(void)
67 // This function is called by Panic(), but MM_PageFault and the
68 // CPU exception handers also call it, so let's not clear the screen
70 if( giKP_Pos ) return ;
72 // Restore VGA 0xB8000 text mode
74 for( i = 0; i < NUM_REGVALUES; i++ )
77 if( caRegValues[i].IdxPort == 0x3C0 ) inb(0x3DA);
79 if( caRegValues[i].IdxPort )
80 outb(caRegValues[i].IdxPort, caRegValues[i].Index);
81 outb(caRegValues[i].DatPort, caRegValues[i].Value);
89 for( i = 0; i < 80*25; i++ )
95 void KernelPanic_PutChar(char Ch)
97 if( giKP_Pos > 80*25 ) return ;
102 FB[giKP_Pos] &= 0xFF00;
103 FB[giKP_Pos++] |= ' ';
104 } while(giKP_Pos & 7);
110 giKP_Pos -= giKP_Pos % 80;
114 if(' ' <= Ch && Ch < 0x7F)
116 FB[giKP_Pos] &= 0xFF00;