--- /dev/null
+\r
+#include "core.h"\r
+\r
+/*CPU Exceptions*/\r
+uchar *cpu_exceptions[0x20] = {\r
+ "Divided by zero.",\r
+ "Reserved.",\r
+ "Nonmaskable interrupt.",\r
+ "Breakpoint.",\r
+ "Overflow.",\r
+ "Outside BOUND.",\r
+ "Invalid opcode.",\r
+ "Disable Device.",\r
+ "Double fault.",\r
+ "Coprocessor Segment Overrun.",\r
+ "Invalid task status segment.",\r
+ "Segment not present.",\r
+ "Stack Segment Fault.",\r
+ "General Protection Exception.",\r
+ "Page fault.",\r
+ "Reserved.",\r
+ "Floating point error.",\r
+ "Alignment Check.",\r
+ "Machine Check.",\r
+ "SIMD floating-point exception.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved.",\r
+ "Reserved."\r
+};\r
+\r
+uchar *cpu_exception_infos[16] = {\r
+ "EDI ",\r
+ "ESI ",\r
+ "EBP ",\r
+ "ESP ",\r
+ "EBX ",\r
+ "EDX ",\r
+ "ECX ",\r
+ "EAX ",\r
+ "DS ",\r
+ "ES ",\r
+ "ERRORCODE",\r
+ "EIP ",\r
+ "CS ",\r
+ "EFLAGS ",\r
+ "APP's ESP",\r
+ "APP's SS "\r
+};\r
+\r
+void CPU_Exception_Abort(int exception, int *esp)\r
+{\r
+ int i;\r
+\r
+Emergency_Out_Reset();\r
+Emergency_Out("Exception 0x%02X:%s", exception, cpu_exceptions[exception]);\r
+for(i = 0; i < 8; i++){\r
+ Emergency_Out("%s0x%08X %s0x%08X", cpu_exception_infos[i << 1], esp[i << 1], cpu_exception_infos[(i << 1) + 1], esp[(i << 1) + 1]);\r
+}\r
+Emergency_Out("CR0 = 0x%08X", Load_CR0());\r
+Emergency_Out("CR2 = 0x%08X", Load_CR2());\r
+Emergency_Out("CR3 = 0x%08X", Load_CR3());\r
+\r
+ debug("Exception 0x%02X:\n%s\n", exception, cpu_exceptions[exception]);\r
+\r
+ debug("#PUSHAD by _asm_CPU_ExceptionHandler\n");\r
+ for(i = 0; i <= 7; i++){\r
+ debug("%s:0x%08X\n", cpu_exception_infos[i], esp[i]);\r
+ }\r
+\r
+ debug("#PUSH by _asm_CPU_ExceptionHandler\n");\r
+ for(i = 8; i <= 9; i++){\r
+ debug("%s:0x%08X\n", cpu_exception_infos[i], esp[i]);\r
+ }\r
+\r
+ debug("#PUSH by CPU\n");\r
+ for(i = 10; i <= 15; i++){\r
+ debug("%s:0x%08X\n", cpu_exception_infos[i], esp[i]);\r
+ }\r
+\r
+ debug("#Control Registers\n");\r
+ debug("CR0 = 0x%08X\n", Load_CR0());\r
+ debug("CR2 = 0x%08X\n", Load_CR2());\r
+ debug("CR3 = 0x%08X\n", Load_CR3());\r
+\r
+ for(;;){\r
+ IO_HLT();\r
+ }\r
+}\r
+\r
+uint *CPU_Exception_Fault(int exception, int *esp)\r
+{\r
+ UI_Task *nowtask;\r
+ uchar s[128];\r
+\r
+ nowtask = MultiTask_Get_NowTask();\r
+ if(nowtask->cons != 0 && nowtask->cons->app_cs != 0){\r
+ sprintf(s, "\nException 0x%02X:\n\t%s\n", exception, (uchar *)cpu_exceptions[exception]);\r
+ InputBox_Put_String(nowtask->cons->input, s);\r
+ sprintf(s, "\t%s:0x%08X\n", cpu_exception_infos[11], esp[11]); //EIP\r
+ InputBox_Put_String(nowtask->cons->input, s);\r
+ } else{\r
+ CPU_Exception_Abort(exception, esp);\r
+ }\r
+ return &nowtask->tss.esp0;\r
+}\r
+\r
+void CPU_ExceptionHandler00(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x00, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler01(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x01, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler02(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x02, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler03(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x03, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler04(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x04, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler05(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x05, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler06(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x06, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler07(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x07, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler08(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x08, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler09(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x09, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler0a(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x0a, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler0b(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x0b, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler0c(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x0c, esp);\r
+}\r
+\r
+uint *CPU_ExceptionHandler0d(int *esp)\r
+{\r
+ return CPU_Exception_Fault(0x0d, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler0e(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x0e, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler0f(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x0f, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler10(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x10, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler11(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x11, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler12(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x12, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler13(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x13, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler14(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x14, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler15(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x15, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler16(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x16, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler17(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x17, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler18(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x18, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler19(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x19, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1a(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1a, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1b(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1b, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1c(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1c, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1d(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1d, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1e(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1e, esp);\r
+}\r
+\r
+void CPU_ExceptionHandler1f(int *esp)\r
+{\r
+ CPU_Exception_Abort(0x1f, esp);\r
+}\r