4 bool Error_Output_Enable_SerialPort = False;
\r
5 bool Error_Output_Enable_Display_TextMode = False;
\r
6 uint Error_Output_Enable_Display_GraphicMode = False;
\r
8 void *Error_Output_Display_GraphicMode_VRAM = 0;
\r
9 uint Error_Output_Display_GraphicMode_Lines = 0;
\r
10 uint Error_Output_Display_GraphicMode_ResolutionX = 0;
\r
11 uint Error_Output_Display_GraphicMode_UsedLines = 0;
\r
13 uchar *cpu_exceptions[0x20] = {
\r
16 "Nonmaskable interrupt.",
\r
23 "Coprocessor Segment Overrun.",
\r
24 "Invalid task status segment.",
\r
25 "Segment not present.",
\r
26 "Stack Segment Fault.",
\r
27 "General Protection Exception.",
\r
30 "Floating point error.",
\r
33 "SIMD floating-point exception.",
\r
48 uchar *cpu_exception_infos[16] = {
\r
67 uint Error_Report(uint error_no, ...)
\r
69 uint *retaddr, *va_args;
\r
71 retaddr = &error_no - 1;
\r
72 va_args = &error_no + 1;
\r
74 if(error_no <= ERROR_CPU_EXCEPTIONS){
\r
75 #ifdef CHNOSPROJECT_DEBUG
\r
76 if(error_no == ERROR_CPU_EXCEPTION_01){
\r
77 Debug_ExceptionHandler((uint *)*va_args);
\r
81 Error_Put_String("Exception 0x%02X:%s", error_no, cpu_exceptions[error_no]);
\r
82 if(error_no == ERROR_CPU_EXCEPTION_00){
\r
83 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
84 } else if(error_no == ERROR_CPU_EXCEPTION_01){
\r
85 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
86 } else if(error_no == ERROR_CPU_EXCEPTION_02){
\r
87 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
88 } else if(error_no == ERROR_CPU_EXCEPTION_03){
\r
89 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
90 } else if(error_no == ERROR_CPU_EXCEPTION_04){
\r
91 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
92 } else if(error_no == ERROR_CPU_EXCEPTION_05){
\r
93 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
94 } else if(error_no == ERROR_CPU_EXCEPTION_06){
\r
95 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
96 } else if(error_no == ERROR_CPU_EXCEPTION_07){
\r
97 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
98 } else if(error_no == ERROR_CPU_EXCEPTION_08){
\r
99 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
100 } else if(error_no == ERROR_CPU_EXCEPTION_09){
\r
101 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
102 } else if(error_no == ERROR_CPU_EXCEPTION_0A){
\r
103 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
104 } else if(error_no == ERROR_CPU_EXCEPTION_0B){
\r
105 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
106 } else if(error_no == ERROR_CPU_EXCEPTION_0C){
\r
107 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
108 } else if(error_no == ERROR_CPU_EXCEPTION_0D){
\r
109 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
110 } else if(error_no == ERROR_CPU_EXCEPTION_0E){
\r
111 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
112 } else if(error_no == ERROR_CPU_EXCEPTION_0F){
\r
113 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
114 } else if(error_no == ERROR_CPU_EXCEPTION_10){
\r
115 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
116 } else if(error_no == ERROR_CPU_EXCEPTION_11){
\r
117 Error_CPU_Exception_Put_Registers_With_ErrorCode((uint *)*va_args);
\r
118 } else if(error_no == ERROR_CPU_EXCEPTION_12){
\r
119 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
120 } else if(error_no == ERROR_CPU_EXCEPTION_13){
\r
121 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
122 } else if(error_no == ERROR_CPU_EXCEPTION_14){
\r
123 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
124 } else if(error_no == ERROR_CPU_EXCEPTION_15){
\r
125 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
126 } else if(error_no == ERROR_CPU_EXCEPTION_16){
\r
127 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
128 } else if(error_no == ERROR_CPU_EXCEPTION_17){
\r
129 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
130 } else if(error_no == ERROR_CPU_EXCEPTION_18){
\r
131 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
132 } else if(error_no == ERROR_CPU_EXCEPTION_19){
\r
133 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
134 } else if(error_no == ERROR_CPU_EXCEPTION_1A){
\r
135 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
136 } else if(error_no == ERROR_CPU_EXCEPTION_1B){
\r
137 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
138 } else if(error_no == ERROR_CPU_EXCEPTION_1C){
\r
139 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
140 } else if(error_no == ERROR_CPU_EXCEPTION_1D){
\r
141 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
142 } else if(error_no == ERROR_CPU_EXCEPTION_1E){
\r
143 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
144 } else if(error_no == ERROR_CPU_EXCEPTION_1F){
\r
145 Error_CPU_Exception_Put_Registers_Without_ErrorCode((uint *)*va_args);
\r
149 Error_Put_String("[0x%08X]Error:0x%08X ", *retaddr, error_no);
\r
150 if(error_no == ERROR_NO_MORE_SEGMENT){
\r
151 Error_Put_String("No More Segment Descriptor(requested at 0x%08X).", *va_args);
\r
153 } else if(error_no == ERROR_NOT_ENOUGH_FREE_MEMORY){
\r
154 Error_Put_String("No More Free Memory(Control:0x%08X Request Size:0x%08X).", *va_args, *(va_args + 1));
\r
155 } else if(error_no == ERROR_MEMORY_FREE_RANGE_OVERLAPPED){
\r
156 Error_Put_String("Memory Free Range Overlapped(Control:0x%08X TagIndex:%u).", *va_args, *(va_args + 1));
\r
157 } else if(error_no == ERROR_NO_MORE_FREE_TAG){
\r
158 Error_Put_String("No More Free Tag(Control:0x%08X).", *va_args);
\r
159 } else if(error_no == ERROR_INVALID_FREE_MEMORY_INDEX){
\r
160 Error_Put_String("Invalid Free Memory Index(Control:0x%08X TagIndex:%u).", *va_args, *(va_args + 1));
\r
161 } else if(error_no == ERROR_FIFO_BUFFER_OVERFLOW){
\r
162 Error_Put_String("FIFO Buffer Overflow(FIFO:0x%08X).", *va_args);
\r
164 Error_Put_String("Unknown Error Number.");
\r
168 Error_Put_String("Continue.");
\r
169 Error_Output_Display_GraphicMode_UsedLines = 0;
\r
173 void Error_Abort(void)
\r
175 Error_Put_String("Abort.");
\r
182 void Error_Set_Enable_SerialPort(bool serial)
\r
184 Error_Output_Enable_SerialPort = serial;
\r
188 void Error_Set_Enable_Display_TextMode(bool tdisp)
\r
190 Error_Output_Enable_Display_TextMode = tdisp;
\r
194 void Error_Set_Enable_Display_GraphicMode(bool gdisp, void *vram, uint xsize, uint lines)
\r
196 Error_Output_Enable_Display_GraphicMode = gdisp;
\r
197 Error_Output_Display_GraphicMode_VRAM = vram;
\r
198 Error_Output_Display_GraphicMode_ResolutionX = xsize;
\r
199 Error_Output_Display_GraphicMode_Lines = lines;
\r
200 Error_Output_Display_GraphicMode_UsedLines = 0;
\r
204 int Error_Put_String(const uchar format[], ...)
\r
209 i = vsnprintf(s, sizeof(s), format, (uint *)(&format + 1));
\r
210 if(Error_Output_Enable_Display_GraphicMode){
\r
211 if(Error_Output_Display_GraphicMode_Lines > Error_Output_Display_GraphicMode_UsedLines){
\r
212 Drawing_Fill_Rectangle(Error_Output_Display_GraphicMode_VRAM, Error_Output_Display_GraphicMode_ResolutionX, 0xc6c6c6, 0, Error_Output_Display_GraphicMode_UsedLines << 4, Error_Output_Display_GraphicMode_ResolutionX - 1, (Error_Output_Display_GraphicMode_UsedLines << 4) + 16 - 1);
\r
213 Drawing_Put_String(Error_Output_Display_GraphicMode_VRAM, Error_Output_Display_GraphicMode_ResolutionX, 0, Error_Output_Display_GraphicMode_UsedLines << 4, 0xffffff, s);
\r
214 Error_Output_Display_GraphicMode_UsedLines++;
\r
217 if(Error_Output_Enable_SerialPort){
\r
218 SerialPort_Send(s);
\r
219 SerialPort_Send("\n");
\r
221 if(Error_Output_Enable_Display_TextMode){
\r
222 TextMode_Put_String(s, white);
\r
223 TextMode_Put_String("\n", white);
\r
228 void Error_CPU_Exception_Put_Registers_With_ErrorCode(uint *esp)
\r
232 IO_SegmentDescriptor *gdt;
\r
234 gdt = (IO_SegmentDescriptor *)ADR_GDT;
\r
236 Error_Put_String("#PUSHAD by _asm_CPU_ExceptionHandler");
\r
237 for(i = 0; i < 4; i++){
\r
238 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);
\r
241 Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");
\r
243 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);
\r
246 Error_Put_String("#PUSH by CPU");
\r
248 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);
\r
251 Error_Put_String("#Control Registers");
\r
252 Error_Put_String("CR0 = 0x%08X", Load_CR0());
\r
253 Error_Put_String("CR2 = 0x%08X", Load_CR2());
\r
254 Error_Put_String("CR3 = 0x%08X", Load_CR3());
\r
255 Error_Put_String("CR4 = 0x%08X", Load_CR4());
\r
257 Error_Put_String("Opcode[0x%X:0x%X]:0x%X", SegmentDescriptor_Get_Base(&gdt[esp[0x0c] >> 3]), esp[0x0b], ((uchar *)(SegmentDescriptor_Get_Base(&gdt[esp[0x0c] >> 3])))[esp[0x0b]]);
\r
261 void Error_CPU_Exception_Put_Registers_Without_ErrorCode(uint *esp)
\r
265 IO_SegmentDescriptor *gdt;
\r
267 gdt = (IO_SegmentDescriptor *)ADR_GDT;
\r
269 Error_Put_String("#PUSHAD by _asm_CPU_ExceptionHandler");
\r
270 for(i = 0; i < 4; i++){
\r
271 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);
\r
274 Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");
\r
276 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);
\r
279 Error_Put_String("#PUSH by CPU");
\r
280 Error_Put_String("%s:0x%08X", cpu_exception_infos[(i << 1) + 1], esp[i << 1]);
\r
283 Error_Put_String("%s:0x%08X %s:0x%08X", cpu_exception_infos[i << 1], esp[(i << 1) - 1], cpu_exception_infos[(i << 1) + 1], esp[i << 1]);
\r
286 Error_Put_String("#Control Registers");
\r
287 Error_Put_String("CR0 = 0x%08X", Load_CR0());
\r
288 Error_Put_String("CR2 = 0x%08X", Load_CR2());
\r
289 Error_Put_String("CR3 = 0x%08X", Load_CR3());
\r
291 Error_Put_String("Opcode[0x%X:0x%X]:0x%X", SegmentDescriptor_Get_Base(&gdt[esp[0x0b] >> 3]), esp[0x0a], ((uchar *)(SegmentDescriptor_Get_Base(&gdt[esp[0x0b] >> 3])))[esp[0x0a]]);
\r