OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / debug.c
1 #include "core.h"\r
2 \r
3 //DR7:RWn Breakpoint Condition\r
4 //      CR4.DE==1\r
5 //              00:Execute Instruction\r
6 //              01:Write Data\r
7 //              10:I/O R/W\r
8 //              11:Data R/W\r
9 //      CR4.DE==0\r
10 //              00:Execute Operation\r
11 //              01:Write Data\r
12 //              10:(Undefined)\r
13 //              11:Data R/W\r
14 \r
15 //DR7:LENn Address Location Size\r
16 //      00:Byte(or Instruction)\r
17 //      01:Word\r
18 //      10:(Undefined)\r
19 //      11:Double Word\r
20 \r
21 #ifdef CHNOSPROJECT_DEBUG\r
22 \r
23 extern uchar *cpu_exception_infos[16];  //error.c\r
24 extern uint Error_Output_Display_GraphicMode_UsedLines; //error.c\r
25 \r
26 uint debug_exception_last_addr;\r
27 \r
28 void debug(const uchar format[], ...)\r
29 {\r
30         uchar s[256];\r
31 \r
32         vsnprintf(s, sizeof(s), format, (uint *)(&format + 1));\r
33         SerialPort_Send(s);\r
34         return;\r
35 }\r
36 \r
37 void Debug_PhysicalMemoryDump(void *addr, uint bytes)\r
38 {\r
39         uchar *p;\r
40         uint i, j;\r
41         uint eflags;\r
42 \r
43         bytes += (uint)addr - ((uint)addr & 0xfffffff0);\r
44         (uint)addr &= 0xfffffff0; \r
45 \r
46         j = (bytes + 0x0f) >> 4;\r
47 \r
48         eflags = IO_Load_EFlags();\r
49         IO_CLI();\r
50 \r
51         debug("\n***PhysicalMemoryDump Start***\n");\r
52         debug("Dump from[0x%08X] for 0x%X bytes.\n", addr, j << 4);\r
53         debug("Address+|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|\n");\r
54         for(i = 0; i < j; i++){\r
55                 p = (uchar *)((uint)addr + (i << 4));\r
56                 debug("%08X:%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X|\n", p, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);\r
57         }\r
58         debug("***PhysicalMemoryDump End***\n");\r
59 \r
60         IO_Store_EFlags(eflags);\r
61 \r
62         return;\r
63 }\r
64 \r
65 void Debug_Set_Breakpoint(uint reg, void *addr, uint rw, uint len)\r
66 {\r
67         CPU_DebugRegister7 dr7;\r
68 \r
69         dr7.dr7 = Load_DR7();\r
70 \r
71         dr7.bit.LE = True;\r
72         dr7.bit.GE = True;\r
73 \r
74         switch(reg){\r
75                 case 0:\r
76                         Store_DR0((uint)addr);\r
77                         dr7.bit.L0 = True;\r
78                         dr7.bit.G0 = True;\r
79                         dr7.bit.RW0 = rw;\r
80                         dr7.bit.LEN0 = len;\r
81                         debug("Debug_Set_Breakpoint:Breakpoint%d Enabled(target:[0x%08X] rw:%d len:%d).\n", reg, addr, dr7.bit.RW0, dr7.bit.LEN0);\r
82                         break;\r
83         }\r
84 \r
85         Store_DR7(dr7.dr7);\r
86 \r
87         return;\r
88 }\r
89 \r
90 void Debug_ExceptionHandler(uint *esp)\r
91 {\r
92         uint i, j;\r
93         IO_SegmentDescriptor *gdt;\r
94 \r
95         gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
96 \r
97         if(esp[0x0a] == debug_exception_last_addr){\r
98                 debug("Debug_ExceptionHandler:Ignore debug exception(same eip.)\n");\r
99                 return;\r
100         }\r
101 \r
102         Error_Put_String("Exception 0x01 Debug. CHNOSProject is running in debug mode.");\r
103 \r
104         Error_Put_String("#PUSHAD by _asm_CPU_ExceptionHandler");\r
105         for(i = 0; i < 4; i++){\r
106                 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
107         }\r
108 \r
109         Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");\r
110         for(; i < 5; i++){\r
111                 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
112         }\r
113 \r
114         Error_Put_String("#PUSH by CPU");\r
115         Error_Put_String("%s:0x%08X", cpu_exception_infos[(i << 1) + 1], esp[i << 1]);\r
116         i++;\r
117         for(; i < 8; i++){\r
118                 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
119         }\r
120 \r
121         Error_Put_String("#Control Registers");\r
122         Error_Put_String("CR0 = 0x%08X", Load_CR0());\r
123         Error_Put_String("CR2 = 0x%08X", Load_CR2());\r
124         Error_Put_String("CR3 = 0x%08X", Load_CR3());\r
125         Error_Put_String("#Debug Registers");\r
126         Error_Put_String("DR0 = 0x%08X", Load_DR0());\r
127         Error_Put_String("DR1 = 0x%08X", Load_DR1());\r
128         Error_Put_String("DR2 = 0x%08X", Load_DR2());\r
129         Error_Put_String("DR3 = 0x%08X", Load_DR3());\r
130         Error_Put_String("DR6 = 0x%08X", Load_DR6());\r
131         Error_Put_String("DR7 = 0x%08X", Load_DR7());\r
132 \r
133 \r
134         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
135         Error_Put_String("Press any key to continue.");\r
136 \r
137         debug_exception_last_addr = esp[0x0a];\r
138 \r
139 //Microsot VirtualPC2007 Only\r
140 /*\r
141         if(((uchar *)(SegmentDescriptor_Get_Base(&gdt[esp[0x0b] >> 3])))[esp[0x0a]] == 0x89){\r
142                 esp[0x0a] += 3;\r
143         }\r
144 */\r
145 \r
146 Debug_PhysicalMemoryDump((void *)(Load_DR0() - 16), 32);\r
147 \r
148 //Wait press any key.\r
149         for(;;){\r
150                 if((IO_In8(PORT_KEYSTA) & 0x01) != 0){\r
151                         break;\r
152                 }\r
153         }\r
154 \r
155 //Clear Display.\r
156         j = Error_Output_Display_GraphicMode_UsedLines;\r
157         Error_Output_Display_GraphicMode_UsedLines = 0;\r
158         for(i = 0; i < j; i++){\r
159                 Error_Put_String("");\r
160         }\r
161         Error_Output_Display_GraphicMode_UsedLines = 0;\r
162 \r
163         return;\r
164 }\r
165 \r
166 #endif\r