OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / error.c
1 \r
2 #include "core.h"\r
3 \r
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
7 \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
12 \r
13 uchar *cpu_exceptions[0x20] = {\r
14         "Divided by zero.",\r
15         "Debug.",\r
16         "Nonmaskable interrupt.",\r
17         "Breakpoint.",\r
18         "Overflow.",\r
19         "Outside BOUND.",\r
20         "Invalid opcode.",\r
21         "Disable Device.",\r
22         "Double fault.",\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
28         "Page fault.",\r
29         "Reserved.",\r
30         "Floating point error.",\r
31         "Alignment Check.",\r
32         "Machine Check.",\r
33         "SIMD floating-point exception.",\r
34         "Reserved.",\r
35         "Reserved.",\r
36         "Reserved.",\r
37         "Reserved.",\r
38         "Reserved.",\r
39         "Reserved.",\r
40         "Reserved.",\r
41         "Reserved.",\r
42         "Reserved.",\r
43         "Reserved.",\r
44         "Reserved.",\r
45         "Reserved."\r
46 };\r
47 \r
48 uchar *cpu_exception_infos[16] = {\r
49         "EDI      ",\r
50         "ESI      ",\r
51         "EBP      ",\r
52         "ESP      ",\r
53         "EBX      ",\r
54         "EDX      ",\r
55         "ECX      ",\r
56         "EAX      ",\r
57         "DS       ",\r
58         "ES       ",\r
59         "ERRORCODE",\r
60         "EIP      ",\r
61         "CS       ",\r
62         "EFLAGS   ",\r
63         "User ESP ",\r
64         "User SS  "\r
65 };\r
66 \r
67 uint Error_Report(uint error_no, ...)\r
68 {\r
69         uint *retaddr, *va_args;\r
70 \r
71         retaddr = &error_no - 1;\r
72         va_args = &error_no + 1;\r
73 \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
78                                 return 0;\r
79                         }\r
80                 #endif\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
146                 }\r
147                 Error_Abort();\r
148         } else{\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
152                         Error_Abort();\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
163                 } else{\r
164                         Error_Put_String("Unknown Error Number.");\r
165                         Error_Abort();\r
166                 }\r
167         }\r
168         Error_Put_String("Continue.");\r
169         Error_Output_Display_GraphicMode_UsedLines = 0;\r
170         return 0;\r
171 }\r
172 \r
173 void Error_Abort(void)\r
174 {\r
175         Error_Put_String("Abort.");\r
176         IO_CLI();\r
177         for(;;){\r
178                 IO_HLT();\r
179         }\r
180 }\r
181 \r
182 void Error_Set_Enable_SerialPort(bool serial)\r
183 {\r
184         Error_Output_Enable_SerialPort = serial;\r
185         return;\r
186 }\r
187 \r
188 void Error_Set_Enable_Display_TextMode(bool tdisp)\r
189 {\r
190         Error_Output_Enable_Display_TextMode = tdisp;\r
191         return;\r
192 }\r
193 \r
194 void Error_Set_Enable_Display_GraphicMode(bool gdisp, void *vram, uint xsize, uint lines)\r
195 {\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
201         return;\r
202 }\r
203 \r
204 int Error_Put_String(const uchar format[], ...)\r
205 {\r
206         int i;\r
207         uchar s[256];\r
208 \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
215                 }\r
216         }\r
217         if(Error_Output_Enable_SerialPort){\r
218                 SerialPort_Send(s);\r
219                 SerialPort_Send("\n");\r
220         }\r
221         if(Error_Output_Enable_Display_TextMode){\r
222                 TextMode_Put_String(s, white);\r
223                 TextMode_Put_String("\n", white);\r
224         }\r
225         return i;\r
226 }\r
227 \r
228 void Error_CPU_Exception_Put_Registers_With_ErrorCode(uint *esp)\r
229 {\r
230         uint i;\r
231 \r
232         IO_SegmentDescriptor *gdt;\r
233 \r
234         gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
235 \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
239         }\r
240 \r
241         Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");\r
242         for(; i < 5; i++){\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
244         }\r
245 \r
246         Error_Put_String("#PUSH by CPU");\r
247         for(; i < 8; i++){\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
249         }\r
250 \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
256 \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
258         return;\r
259 }\r
260 \r
261 void Error_CPU_Exception_Put_Registers_Without_ErrorCode(uint *esp)\r
262 {\r
263         uint i;\r
264 \r
265         IO_SegmentDescriptor *gdt;\r
266 \r
267         gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
268 \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
272         }\r
273 \r
274         Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");\r
275         for(; i < 5; i++){\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
277         }\r
278 \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
281         i++;\r
282         for(; i < 8; i++){\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
284         }\r
285 \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
290 \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
292         return;\r
293 }\r