3 //DR7:RWn Breakpoint Condition
\r
5 // 00:Execute Instruction
\r
10 // 00:Execute Operation
\r
15 //DR7:LENn Address Location Size
\r
16 // 00:Byte(or Instruction)
\r
21 #ifdef CHNOSPROJECT_DEBUG
\r
23 extern uchar *cpu_exception_infos[16]; //error.c
\r
24 extern uint Error_Output_Display_GraphicMode_UsedLines; //error.c
\r
26 uint debug_exception_last_addr;
\r
28 void debug(const uchar format[], ...)
\r
32 vsnprintf(s, sizeof(s), format, (uint *)(&format + 1));
\r
37 void Debug_PhysicalMemoryDump(void *addr, uint bytes)
\r
43 bytes += (uint)addr - ((uint)addr & 0xfffffff0);
\r
44 (uint)addr &= 0xfffffff0;
\r
46 j = (bytes + 0x0f) >> 4;
\r
48 eflags = IO_Load_EFlags();
\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
58 debug("***PhysicalMemoryDump End***\n");
\r
60 IO_Store_EFlags(eflags);
\r
65 void Debug_Set_Breakpoint(uint reg, void *addr, uint rw, uint len)
\r
67 CPU_DebugRegister7 dr7;
\r
69 dr7.dr7 = Load_DR7();
\r
76 Store_DR0((uint)addr);
\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
90 void Debug_ExceptionHandler(uint *esp)
\r
93 IO_SegmentDescriptor *gdt;
\r
95 gdt = (IO_SegmentDescriptor *)ADR_GDT;
\r
97 if(esp[0x0a] == debug_exception_last_addr){
\r
98 debug("Debug_ExceptionHandler:Ignore debug exception(same eip.)\n");
\r
102 Error_Put_String("Exception 0x01 Debug. CHNOSProject is running in debug mode.");
\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
109 Error_Put_String("#PUSH by _asm_CPU_ExceptionHandler");
\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
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
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
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
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
137 debug_exception_last_addr = esp[0x0a];
\r
139 //Microsot VirtualPC2007 Only
\r
141 if(((uchar *)(SegmentDescriptor_Get_Base(&gdt[esp[0x0b] >> 3])))[esp[0x0a]] == 0x89){
\r
146 Debug_PhysicalMemoryDump((void *)(Load_DR0() - 16), 32);
\r
148 //Wait press any key.
\r
150 if((IO_In8(PORT_KEYSTA) & 0x01) != 0){
\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
161 Error_Output_Display_GraphicMode_UsedLines = 0;
\r