From 9b5e5ccd6297919fdc25a51e16cde76a5620d3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Tue, 9 Aug 2005 09:49:06 +0000 Subject: [PATCH] updates to the debugger Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2264 --- src/debug/debug.cpp | 286 +++++++++++++++++++++++++++++-------- src/debug/debug_disasm.cpp | 26 ++-- src/debug/debug_gui.cpp | 2 + 3 files changed, 247 insertions(+), 67 deletions(-) diff --git a/src/debug/debug.cpp b/src/debug/debug.cpp index 0d4ea81d..620d17e6 100644 --- a/src/debug/debug.cpp +++ b/src/debug/debug.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: debug.cpp,v 1.65 2005-07-30 10:13:24 qbix79 Exp $ */ +/* $Id: debug.cpp,v 1.66 2005-08-09 09:49:06 c2woody Exp $ */ #include #include @@ -40,6 +40,7 @@ #include "shell.h" #include "programs.h" #include "debug_inc.h" +#include "../cpu/lazyflags.h" #ifdef WIN32 void WIN32_Console(); @@ -58,6 +59,8 @@ static void SaveMemory(Bitu seg, Bitu ofs1, Bit32s num); static void LogGDT(void); static void LogLDT(void); static void LogIDT(void); +static void LogPages(char* selname); +static void LogCPUInfo(void); static void OutputVecTable(char* filename); static void DrawVariables(void); @@ -78,6 +81,7 @@ bool logHeavy = false; static FILE* cpuLogFile = 0; static bool cpuLog = false; static int cpuLogCounter = 0; +static int cpuLogType = 1; // log detail #endif @@ -89,7 +93,7 @@ static struct { static char curSelectorName[3] = { 0,0,0 }; static Segment oldsegs[6]; -static Bitu oldflags; +static Bitu oldflags,oldcpucpl; DBGBlock dbg; static Bitu input_count; Bitu cycle_count; @@ -135,7 +139,7 @@ Bit32u PhysMakeProt(Bit16u selector, Bit32u offset) Bit32u GetAddress(Bit16u seg, Bit32u offset) { if (seg==SegValue(cs)) return SegPhys(cs)+offset; - if (cpu.pmode) { + if (cpu.pmode && !(reg_flags & FLAG_VM)) { Descriptor desc; if (cpu.gdt.GetDescriptor(seg,desc)) return PhysMakeProt(seg,offset); } @@ -148,15 +152,43 @@ bool GetDescriptorInfo(char* selname, char* out1, char* out2) Bitu sel; Descriptor desc; - if (strstr(selname,"cs") || strstr(selname,"CS")) sel = SegValue(cs); else - if (strstr(selname,"ds") || strstr(selname,"DS")) sel = SegValue(ds); else - if (strstr(selname,"es") || strstr(selname,"ES")) sel = SegValue(es); else - if (strstr(selname,"fs") || strstr(selname,"FS")) sel = SegValue(fs); else - if (strstr(selname,"gs") || strstr(selname,"GS")) sel = SegValue(gs); else - if (strstr(selname,"ss") || strstr(selname,"SS")) sel = SegValue(ss); else - sel = GetHexValue(selname,selname); - // FIXME: Call Gate Descriptors + if (strstr(selname,"cs") || strstr(selname,"CS")) sel = SegValue(cs); + else if (strstr(selname,"ds") || strstr(selname,"DS")) sel = SegValue(ds); + else if (strstr(selname,"es") || strstr(selname,"ES")) sel = SegValue(es); + else if (strstr(selname,"fs") || strstr(selname,"FS")) sel = SegValue(fs); + else if (strstr(selname,"gs") || strstr(selname,"GS")) sel = SegValue(gs); + else if (strstr(selname,"ss") || strstr(selname,"SS")) sel = SegValue(ss); + else { + sel = GetHexValue(selname,selname); + if (*selname==0) selname=" "; + } if (cpu.gdt.GetDescriptor(sel,desc)) { + switch (desc.Type()) { + case DESC_TASK_GATE: + sprintf(out1,"%s: s:%08X type:%02X p",selname,desc.GetSelector(),desc.saved.gate.type); + sprintf(out2," TaskGate dpl : %01X %1X",desc.saved.gate.dpl,desc.saved.gate.p); + return true; + case DESC_LDT: + case DESC_286_TSS_A: + case DESC_286_TSS_B: + case DESC_386_TSS_A: + case DESC_386_TSS_B: + sprintf(out1,"%s: b:%08X type:%02X pag",selname,desc.GetBase(),desc.saved.seg.type); + sprintf(out2," l:%08X dpl : %01X %1X%1X%1X",desc.GetLimit(),desc.saved.seg.dpl,desc.saved.seg.p,desc.saved.seg.avl,desc.saved.seg.g); + return true; + case DESC_286_CALL_GATE: + case DESC_386_CALL_GATE: + sprintf(out1,"%s: s:%08X type:%02X p params: %02X",selname,desc.GetSelector(),desc.saved.gate.type,desc.saved.gate.paramcount); + sprintf(out2," o:%08X dpl : %01X %1X",desc.GetOffset(),desc.saved.gate.dpl,desc.saved.gate.p); + return true; + case DESC_286_INT_GATE: + case DESC_286_TRAP_GATE: + case DESC_386_INT_GATE: + case DESC_386_TRAP_GATE: + sprintf(out1,"%s: s:%08X type:%02X p",selname,desc.GetSelector(),desc.saved.gate.type); + sprintf(out2," o:%08X dpl : %01X %1X",desc.GetOffset(),desc.saved.gate.dpl,desc.saved.gate.p); + return true; + } sprintf(out1,"%s: b:%08X type:%02X parbg",selname,desc.GetBase(),desc.saved.seg.type); sprintf(out2," l:%08X dpl : %01X %1X%1X%1X%1X%1X",desc.GetLimit(),desc.saved.seg.dpl,desc.saved.seg.p,desc.saved.seg.avl,desc.saved.seg.r,desc.saved.seg.big,desc.saved.seg.g); return true; @@ -164,7 +196,6 @@ bool GetDescriptorInfo(char* selname, char* out1, char* out2) strcpy(out1," "); strcpy(out2," "); } - //out1[0] = out2[0] = 0; return false; }; @@ -607,15 +638,16 @@ static void DrawData(void) { /* Data win */ for (int y=0; y<8; y++) { // Adress - mvwprintw (dbg.win_data,1+y,0,"%04X:%04X ",dataSeg,add); + if (add<0x10000) mvwprintw (dbg.win_data,1+y,0,"%04X:%04X ",dataSeg,add); + else mvwprintw (dbg.win_data,1+y,0,"%04X:%08X ",dataSeg,add); for (int x=0; x<16; x++) { address = GetAddress(dataSeg,add); if (!(paging.tlb.handler[address >> 12]->flags & PFLAG_INIT)) { ch = mem_readb(address); } else ch = 0; - mvwprintw (dbg.win_data,1+y,11+3*x,"%02X",ch); + mvwprintw (dbg.win_data,1+y,14+3*x,"%02X",ch); if (ch<32 || !isprint(*reinterpret_cast(&ch))) ch='.'; - mvwprintw (dbg.win_data,1+y,60+x,"%c",ch); + mvwprintw (dbg.win_data,1+y,63+x,"%c",ch); add++; }; } @@ -665,8 +697,14 @@ static void DrawRegisters(void) { SetColor((reg_flags ^ oldflags)&FLAG_TF); mvwprintw (dbg.win_reg,1,77,"%01X",GETFLAG(TF) ? 1:0); + SetColor((reg_flags ^ oldflags)&FLAG_IOPL); + mvwprintw (dbg.win_reg,2,72,"%01X",GETFLAG(IOPL)>>12); oldflags=reg_flags; + SetColor(cpu.cpl ^ oldcpucpl); + mvwprintw (dbg.win_reg,2,78,"%01X",cpu.cpl); + oldcpucpl=cpu.cpl; + if (cpu.pmode) { if (reg_flags & FLAG_VM) mvwprintw(dbg.win_reg,0,76,"VM86"); else if (cpu.code.big) mvwprintw(dbg.win_reg,0,76,"Pr32"); @@ -847,12 +885,13 @@ bool ChangeRegister(char* str) if (strstr(hex,"SS")==hex) { hex+=2; SegSet16(ss,(Bit16u)GetHexValue(hex,hex)); } else if (strstr(hex,"AF")==hex) { hex+=2; SETFLAGBIT(AF,GetHexValue(hex,hex)); } else if (strstr(hex,"CF")==hex) { hex+=2; SETFLAGBIT(CF,GetHexValue(hex,hex)); } else - if (strstr(hex,"DF")==hex) { hex+=2; SETFLAGBIT(PF,GetHexValue(hex,hex)); } else + if (strstr(hex,"DF")==hex) { hex+=2; SETFLAGBIT(DF,GetHexValue(hex,hex)); } else if (strstr(hex,"IF")==hex) { hex+=2; SETFLAGBIT(IF,GetHexValue(hex,hex)); } else if (strstr(hex,"OF")==hex) { hex+=3; SETFLAGBIT(OF,GetHexValue(hex,hex)); } else if (strstr(hex,"ZF")==hex) { hex+=3; SETFLAGBIT(ZF,GetHexValue(hex,hex)); } else if (strstr(hex,"PF")==hex) { hex+=3; SETFLAGBIT(PF,GetHexValue(hex,hex)); } else - { return false; }; + if (strstr(hex,"SF")==hex) { hex+=3; SETFLAGBIT(SF,GetHexValue(hex,hex)); } else + { return false; }; return true; }; @@ -1046,10 +1085,51 @@ bool ParseCommand(char* str) // DEBUG_Log_Loop(GetHexValue(found,found)); cpuLogFile = fopen("LOGCPU.TXT","wt"); if (!cpuLogFile) { - DEBUG_ShowMsg("DEBUG: Logfile couldnt be created.\n"); + DEBUG_ShowMsg("DEBUG: Logfile couldn't be created.\n"); return false; } cpuLog = true; + cpuLogType = 1; + cpuLogCounter = GetHexValue(found,found); + + debugging=false; + CBreakpoint::ActivateBreakpoints(SegPhys(cs)+reg_eip,true); + ignoreAddressOnce = SegPhys(cs)+reg_eip; + DOSBOX_SetNormalLoop(); + return true; + } + + found = strstr(str,"LOGS "); + if (found) { // Create Cpu log file + found+=4; + DEBUG_ShowMsg("DEBUG: Starting log\n"); + cpuLogFile = fopen("LOGCPU.TXT","wt"); + if (!cpuLogFile) { + DEBUG_ShowMsg("DEBUG: Logfile couldn't be created.\n"); + return false; + } + cpuLog = true; + cpuLogType = 0; + cpuLogCounter = GetHexValue(found,found); + + debugging=false; + CBreakpoint::ActivateBreakpoints(SegPhys(cs)+reg_eip,true); + ignoreAddressOnce = SegPhys(cs)+reg_eip; + DOSBOX_SetNormalLoop(); + return true; + } + + found = strstr(str,"LOGL "); + if (found) { // Create Cpu log file + found+=4; + DEBUG_ShowMsg("DEBUG: Starting log\n"); + cpuLogFile = fopen("LOGCPU.TXT","wt"); + if (!cpuLogFile) { + DEBUG_ShowMsg("DEBUG: Logfile couldn't be created.\n"); + return false; + } + cpuLog = true; + cpuLogType = 2; cpuLogCounter = GetHexValue(found,found); debugging=false; @@ -1107,6 +1187,18 @@ bool ParseCommand(char* str) LogIDT(); } + found = strstr(str,"PAGING"); + if (found) { + found += 6; + while (found[0]==' ') found++; + LogPages(found); + } + + found = strstr(str,"CPU"); + if (found) { + LogCPUInfo(); + } + found = strstr(str,"INTVEC "); if (found) { @@ -1131,15 +1223,6 @@ bool ParseCommand(char* str) } } - /* found = strstr(str,"EXCEPTION "); - if (found) { - found += 9; - Bit8u num = GetHexValue(found,found); - DPMI_CreateException(num,0xDD); - DEBUG_ShowMsg("Exception %04X\n",num); - }; -*/ - #if C_HEAVY_DEBUG found = strstr(str,"HEAVYLOG"); if (found) { // Create Cpu log file @@ -1176,6 +1259,7 @@ bool ParseCommand(char* str) DEBUG_ShowMsg("INT [nr] / INTT [nr] - Execute / Trace into interrupt.\n"); #if C_HEAVY_DEBUG DEBUG_ShowMsg("LOG [num] - Write cpu log file.\n"); + DEBUG_ShowMsg("LOGS/LOGL [num] - Write short/long cpu log file.\n"); DEBUG_ShowMsg("HEAVYLOG - Enable/Disable automatic cpu when dosbox exits.\n"); #endif DEBUG_ShowMsg("SR [reg] [value] - Set register value.\n"); @@ -1191,6 +1275,12 @@ bool ParseCommand(char* str) DEBUG_ShowMsg("INTVEC [filename] - Writes interrupt vector table to file.\n"); DEBUG_ShowMsg("INTHAND [intNum] - Set code view to interrupt handler.\n"); + DEBUG_ShowMsg("CPU - Display CPU status information.\n"); + DEBUG_ShowMsg("GDT - Lists descriptors of the GDT.\n"); + DEBUG_ShowMsg("LDT - Lists descriptors of the LDT.\n"); + DEBUG_ShowMsg("IDT - Lists descriptors of the IDT.\n"); + DEBUG_ShowMsg("PAGING [page] - Display content of page table.\n"); + DEBUG_ShowMsg("H - Help\n"); return TRUE; @@ -1295,65 +1385,65 @@ char* AnalyzeInstruction(char* inst, bool saveSelector) // Must be a jump if (instu[0] == 'J') { - bool jmp = 0; + bool jmp = false; switch (instu[1]) { - case 'A' : { jmp = !GETFLAGBOOL(CF) && !GETFLAGBOOL(ZF); // JA + case 'A' : { jmp = (get_CF()?false:true) && (get_ZF()?false:true); // JA } break; case 'B' : { if (instu[2] == 'E') { - jmp = GETFLAGBOOL(CF) && GETFLAGBOOL(ZF); // JBE + jmp = (get_CF()?true:false) && (get_ZF()?true:false); // JBE } else { - jmp = GETFLAGBOOL(CF); // JB + jmp = get_CF()?true:false; // JB } } break; case 'C' : { if (instu[2] == 'X') { jmp = reg_cx == 0; // JCXZ } else { - jmp = GETFLAGBOOL(CF); // JC + jmp = get_CF()?true:false; // JC } } break; - case 'E' : { jmp = GETFLAGBOOL(ZF); // JE + case 'E' : { jmp = get_ZF()?true:false; // JE } break; case 'G' : { if (instu[2] == 'E') { - jmp = !GETFLAGBOOL(SF); // JGE + jmp = get_SF()?false:true; // JGE } else { - jmp = !GETFLAGBOOL(SF) && !GETFLAGBOOL(ZF); // JG + jmp = (get_SF()?false:true) && (get_ZF()?false:true); // JG } } break; case 'L' : { if (instu[2] == 'E') { - jmp = GETFLAGBOOL(SF) || GETFLAGBOOL(ZF); // JLE + jmp = (get_SF()?true:false) || (get_ZF()?true:false) ; // JLE } else { - jmp = GETFLAGBOOL(SF); // JL + jmp = get_SF()?true:false; // JL } } break; case 'M' : { jmp = true; // JMP } break; case 'N' : { switch (instu[2]) { case 'B' : - case 'C' : { jmp = !GETFLAGBOOL(CF); // JNB / JNC + case 'C' : { jmp = get_CF()?false:true; // JNB / JNC } break; - case 'E' : { jmp = !GETFLAGBOOL(ZF); // JNE + case 'E' : { jmp = get_ZF()?false:true; // JNE } break; - case 'O' : { jmp = !GETFLAGBOOL(OF); // JNO + case 'O' : { jmp = get_OF()?false:true; // JNO } break; - case 'P' : { jmp = !GETFLAGBOOL(PF); // JNP + case 'P' : { jmp = get_PF()?false:true; // JNP } break; - case 'S' : { jmp = !GETFLAGBOOL(SF); // JNS + case 'S' : { jmp = get_SF()?false:true; // JNS } break; - case 'Z' : { jmp = !GETFLAGBOOL(ZF); // JNZ + case 'Z' : { jmp = get_ZF()?false:true; // JNZ } break; } } break; - case 'O' : { jmp = GETFLAGBOOL(OF); // JMP + case 'O' : { jmp = get_OF()?true:false; // JMP } break; case 'P' : { if (instu[2] == 'O') { - jmp = !GETFLAGBOOL(PF); // JPO + jmp = get_PF()?false:true; // JPO } else { - jmp = GETFLAGBOOL(SF); // JP / JPE + jmp = get_SF()?true:false; // JP / JPE } } break; - case 'S' : { jmp = GETFLAGBOOL(SF); // JS + case 'S' : { jmp = get_SF()?true:false; // JS } break; - case 'Z' : { jmp = GETFLAGBOOL(ZF); // JZ + case 'Z' : { jmp = get_ZF()?true:false; // JZ } break; } if (jmp) { @@ -1426,19 +1516,24 @@ Bit32u DEBUG_CheckKeys(void) { ret=(*cpudecoder)(); break; case 'D': dataSeg = SegValue(ds); - dataOfs = reg_si; + if (cpu.pmode && !(reg_flags & FLAG_VM)) dataOfs = reg_esi; + else dataOfs = reg_si; break; case 'E': dataSeg = SegValue(es); - dataOfs = reg_di; + if (cpu.pmode && !(reg_flags & FLAG_VM)) dataOfs = reg_edi; + else dataOfs = reg_di; break; case 'X': dataSeg = SegValue(ds); - dataOfs = reg_dx; + if (cpu.pmode && !(reg_flags & FLAG_VM)) dataOfs = reg_edx; + else dataOfs = reg_dx; break; case 'B': dataSeg = SegValue(es); - dataOfs = reg_bx; + if (cpu.pmode && !(reg_flags & FLAG_VM)) dataOfs = reg_ebx; + else dataOfs = reg_bx; break; case 'S': dataSeg = SegValue(ss); - dataOfs = reg_sp; + if (cpu.pmode && !(reg_flags & FLAG_VM)) dataOfs = reg_esp; + else dataOfs = reg_sp; break; case 'R' : dataOfs -= 16; break; @@ -1611,6 +1706,68 @@ static void LogIDT(void) }; }; +void LogPages(char* selname) +{ + char out1[512]; + if (paging.enabled) { + Bitu sel = GetHexValue(selname,selname); + if ((sel==0x00) && ((*selname==0) || (*selname=='*'))) { + for (int i=0; i<0xfffff; i++) { + Bitu table_addr=(paging.base.page<<12)+(i >> 10)*4; + X86PageEntry table; + table.load=phys_readd(table_addr); + if (table.block.p) { + X86PageEntry entry; + Bitu entry_addr=(table.block.base<<12)+(i & 0x3ff)*4; + entry.load=phys_readd(entry_addr); + if (entry.block.p) { + sprintf(out1,"page %05Xxxx -> %04Xxxx flags [uw] %x:%x::%x:%x",i,entry.block.base,entry.block.us,table.block.us,entry.block.wr,table.block.wr); + LOG(LOG_MISC,LOG_ERROR)(out1); + } + } + } + } else { + Bitu table_addr=(paging.base.page<<12)+(sel >> 10)*4; + X86PageEntry table; + table.load=phys_readd(table_addr); + if (table.block.p) { + X86PageEntry entry; + Bitu entry_addr=(table.block.base<<12)+(sel & 0x3ff)*4; + entry.load=phys_readd(entry_addr); + sprintf(out1,"page %05Xxxx -> %04Xxxx flags [puw] %x:%x::%x:%x::%x:%x",sel,entry.block.base,entry.block.p,table.block.p,entry.block.us,table.block.us,entry.block.wr,table.block.wr); + LOG(LOG_MISC,LOG_ERROR)(out1); + } else { + sprintf(out1,"pagetable %03X not present, flags [puw] %x::%x::%x",(sel >> 10),table.block.p,table.block.us,table.block.wr); + LOG(LOG_MISC,LOG_ERROR)(out1); + } + } + } +}; + +static void LogCPUInfo(void) +{ + char out1[512]; + sprintf(out1,"cr0:%08X cr2:%08X cr3:%08X cpl=%x",cpu.cr0,paging.cr2,paging.cr3,cpu.cpl); + LOG(LOG_MISC,LOG_ERROR)(out1); + sprintf(out1,"eflags:%08X [vm=%x iopl=%x nt=%x]",reg_flags,GETFLAG(VM)>>17,GETFLAG(IOPL)>>12,GETFLAG(NT)>>14); + LOG(LOG_MISC,LOG_ERROR)(out1); + sprintf(out1,"GDT base=%08X limit=%08X",cpu.gdt.GetBase(),cpu.gdt.GetLimit()); + LOG(LOG_MISC,LOG_ERROR)(out1); + sprintf(out1,"IDT base=%08X limit=%08X",cpu.idt.GetBase(),cpu.idt.GetLimit()); + LOG(LOG_MISC,LOG_ERROR)(out1); + + Bitu sel; + Descriptor desc; + CPU_STR(sel); + cpu.gdt.GetDescriptor(sel,desc); + sprintf(out1,"TR selector=%04X, base=%08X limit=%08X*%X",sel,desc.GetBase(),desc.GetLimit(),desc.saved.seg.g?0x4000:1); + LOG(LOG_MISC,LOG_ERROR)(out1); + sel=cpu.gdt.SLDT(); + cpu.gdt.GetDescriptor(sel,desc); + sprintf(out1,"LDT selector=%04X, base=%08X limit=%08X*%X",sel,desc.GetBase(),desc.GetLimit(),desc.saved.seg.g?0x4000:1); + LOG(LOG_MISC,LOG_ERROR)(out1); +}; + static void LogInstruction(Bit16u segValue, Bit32u eipValue, char* buffer) { static char empty[15] = { 32,32,32,32,32,32,32,32,32,32,32,32,32,32,0 }; @@ -1622,13 +1779,28 @@ static void LogInstruction(Bit16u segValue, Bit32u eipValue, char* buffer) char* res = empty; if (showExtend) { res = AnalyzeInstruction(dline,false); - if (!res || (strlen(res)==0)) res = empty; + len = strlen(dline); + if (cpuLogType>=2) { + Bitu reslen=strlen(res); + if (reslen<24) for (Bitu i=0; i<24-reslen; i++) strcat(res," "); + } else if (!res || (strlen(res)==0)) res = empty; }; - if (len<30) for (Bitu i=0; i<30-len; i++) strcat(dline," "); // Get register values - sprintf(buffer,"%04X:%08X %s %s EAX:%08X EBX:%08X ECX:%08X EDX:%08X ESI:%08X EDI:%08X EBP:%08X ESP:%08X DS:%04X ES:%04X FS:%04X GS:%04X SS:%04X CF:%01X ZF:%01X SF:%01X OF:%01X AF:%01X PF:%01X IF:%01X\n",segValue,eipValue,dline,res,reg_eax,reg_ebx,reg_ecx,reg_edx,reg_esi,reg_edi,reg_ebp,reg_esp,SegValue(ds),SegValue(es),SegValue(fs),SegValue(gs),SegValue(ss), - GETFLAGBOOL(CF),GETFLAGBOOL(ZF),GETFLAGBOOL(SF),GETFLAGBOOL(OF),GETFLAGBOOL(AF),GETFLAGBOOL(PF),GETFLAGBOOL(IF)); + if (cpuLogType==1) { + if (len<30) for (Bitu i=0; i<30-len; i++) strcat(dline," "); + sprintf(buffer,"%04X:%08X %s %s EAX:%08X EBX:%08X ECX:%08X EDX:%08X ESI:%08X EDI:%08X EBP:%08X ESP:%08X DS:%04X ES:%04X FS:%04X GS:%04X SS:%04X CF:%01X ZF:%01X SF:%01X OF:%01X AF:%01X PF:%01X IF:%01X\n",segValue,eipValue,dline,res,reg_eax,reg_ebx,reg_ecx,reg_edx,reg_esi,reg_edi,reg_ebp,reg_esp,SegValue(ds),SegValue(es),SegValue(fs),SegValue(gs),SegValue(ss), + get_CF()?1:0,get_ZF()?1:0,get_SF()?1:0,get_OF()?1:0,get_AF()?1:0,get_PF()?1:0,GETFLAGBOOL(IF)); + } else if (cpuLogType==0) { + if (len<27) for (Bitu i=0; i<27-len; i++) strcat(dline," "); + sprintf(buffer,"%04X:%04X %s EAX:%08X EBX:%08X ECX:%08X EDX:%08X ESI:%08X EDI:%08X EBP:%08X ESP:%08X DS:%04X ES:%04X SS:%04X C%01X Z%01X S%01X O%01X I%01X\n",segValue,eipValue,dline,reg_eax,reg_ebx,reg_ecx,reg_edx,reg_esi,reg_edi,reg_ebp,reg_esp,SegValue(ds),SegValue(es),SegValue(ss), + get_CF()?1:0,get_ZF()?1:0,get_SF()?1:0,get_OF()?1:0,GETFLAGBOOL(IF)); + } else { + if (len<34) for (Bitu i=0; i<34-len; i++) strcat(dline," "); + res[0]='x'; + sprintf(buffer,"%04X:%08X %s %s EAX:%08X EBX:%08X ECX:%08X EDX:%08X ESI:%08X EDI:%08X EBP:%08X ESP:%08X DS:%04X ES:%04X FS:%04X GS:%04X SS:%04X CF:%01X ZF:%01X SF:%01X OF:%01X AF:%01X PF:%01X IF:%01X TF:%01X VM:%01X FLG:%08X CR0:%08X\n",segValue,eipValue,dline,res,reg_eax,reg_ebx,reg_ecx,reg_edx,reg_esi,reg_edi,reg_ebp,reg_esp,SegValue(ds),SegValue(es),SegValue(fs),SegValue(gs),SegValue(ss), + get_CF()?1:0,get_ZF()?1:0,get_SF()?1:0,get_OF()?1:0,get_AF()?1:0,get_PF()?1:0,GETFLAGBOOL(IF),GETFLAGBOOL(TF),GETFLAGBOOL(VM),reg_flags,cpu.cr0); + } }; static bool DEBUG_Log_Loop(int count) { diff --git a/src/debug/debug_disasm.cpp b/src/debug/debug_disasm.cpp index f0c0460e..3ccbded5 100644 --- a/src/debug/debug_disasm.cpp +++ b/src/debug/debug_disasm.cpp @@ -260,7 +260,7 @@ static char *op386map1[256] = { "call %Jv", "jmp %Jv", "jmp %Ap", "jmp %Ks%Jb", "in al,dx", "in %eax,dx", "out dx,al", "out dx,%eax", /* f */ - "lock %p ", 0, "repne %p ", "repe %p ", + "lock %p ", "icebp", "repne %p ", "repe %p ", "hlt", "cmc", "%g2", "%g2", "clc", "stc", "cli", "sti", "cld", "std", "%g3", "%g4" @@ -269,8 +269,8 @@ static char *op386map1[256] = { static char *second[] = { /* 0 */ "%g5", "%g6", "lar %Gv,%Ew", "lsl %Gv,%Ew", - 0, "loadall", "clts", "loadall", - "invd", "wbinvd", 0, 0, + 0, "[loadall]", "clts", "[loadall]", + "invd", "wbinvd", 0, "UD2", 0, 0, 0, 0, /* 1 */ "mov %Eb,%Gb", "mov %Ev,%Gv", "mov %Gb,%Eb", "mov %Gv,%Ev", @@ -308,7 +308,7 @@ static char *second[] = { "sets %Eb", "setns %Eb", "setp %Eb", "setnp %Eb", "setl %Eb", "setge %Eb", "setle %Eb", "setg %Eb", /* a */ - "push fs", "pop fs", 0, "bt %Ev,%Gv", + "push fs", "pop fs", "cpuid", "bt %Ev,%Gv", "shld %Ev,%Gv,%Ib", "shld %Ev,%Gv,cl", 0, 0, "push gs", "pop gs", 0, "bts %Ev,%Gv", "shrd %Ev,%Gv,%Ib", "shrd %Ev,%Gv,cl", 0, "imul %Gv,%Ev", @@ -354,7 +354,7 @@ static char *groups[][8] = { /* group 0 is group 3 for %Ev set */ "verr %Ew", "verw %Ew", 0, 0 }, /* 6 */ { "sgdt %Ms", "sidt %Ms", "lgdt %Ms", "lidt %Ms", - "smsw %Ew", 0, "lmsw %Ew", 0 }, + "smsw %Ew", 0, "lmsw %Ew", "invlpg" }, /* 7 */ { 0, 0, 0, 0, "bt", "bts", "btr", "btc" } @@ -363,8 +363,10 @@ static char *groups[][8] = { /* group 0 is group 3 for %Ev set */ /* zero here means invalid. If first entry starts with '*', use st(i) */ /* no assumed %EFs here. Indexed by RM(modrm()) */ static char *f0[] = { 0, 0, 0, 0, 0, 0, 0, 0}; +static char *fop_8[] = { "*fld st,%GF" }; static char *fop_9[] = { "*fxch st,%GF" }; static char *fop_10[] = { "fnop", 0, 0, 0, 0, 0, 0, 0 }; +static char *fop_11[] = { "*fst st,%GF" }; static char *fop_12[] = { "fchs", "fabs", 0, 0, "ftst", "fxam", 0, 0 }; static char *fop_13[] = { "fld1", "fldl2t", "fldl2e", "fldpi", "fldlg2", "fldln2", "fldz", 0 }; @@ -373,20 +375,24 @@ static char *fop_14[] = { "f2xm1", "fyl2x", "fptan", "fpatan", static char *fop_15[] = { "fprem", "fyl2xp1", "fsqrt", "fsincos", "frndint", "fscale", "fsin", "fcos" }; static char *fop_21[] = { 0, "fucompp", 0, 0, 0, 0, 0, 0 }; -static char *fop_28[] = { 0, 0, "fclex", "finit", 0, 0, 0, 0 }; +static char *fop_28[] = { "[fneni]", "[fndis]", "fclex", "finit", "[fnsetpm]", "[frstpm]", 0, 0 }; static char *fop_32[] = { "*fadd %GF,st" }; static char *fop_33[] = { "*fmul %GF,st" }; +static char *fop_34[] = { "*fcom %GF,st" }; +static char *fop_35[] = { "*fcomp %GF,st" }; static char *fop_36[] = { "*fsubr %GF,st" }; static char *fop_37[] = { "*fsub %GF,st" }; static char *fop_38[] = { "*fdivr %GF,st" }; static char *fop_39[] = { "*fdiv %GF,st" }; static char *fop_40[] = { "*ffree %GF" }; +static char *fop_41[] = { "*fxch %GF" }; static char *fop_42[] = { "*fst %GF" }; static char *fop_43[] = { "*fstp %GF" }; static char *fop_44[] = { "*fucom %GF" }; static char *fop_45[] = { "*fucomp %GF" }; static char *fop_48[] = { "*faddp %GF,st" }; static char *fop_49[] = { "*fmulp %GF,st" }; +static char *fop_50[] = { "*fcomp %GF,st" }; static char *fop_51[] = { 0, "fcompp", 0, 0, 0, 0, 0, 0 }; static char *fop_52[] = { "*fsubrp %GF,st" }; static char *fop_53[] = { "*fsubp %GF,st" }; @@ -396,12 +402,12 @@ static char *fop_60[] = { "fstsw ax", 0, 0, 0, 0, 0, 0, 0 }; static char **fspecial[] = { /* 0=use st(i), 1=undefined 0 in fop_* means undefined */ 0, 0, 0, 0, 0, 0, 0, 0, - 0, fop_9, fop_10, 0, fop_12, fop_13, fop_14, fop_15, + fop_8, fop_9, fop_10, fop_11, fop_12, fop_13, fop_14, fop_15, f0, f0, f0, f0, f0, fop_21, f0, f0, f0, f0, f0, f0, fop_28, f0, f0, f0, - fop_32, fop_33, f0, f0, fop_36, fop_37, fop_38, fop_39, - fop_40, f0, fop_42, fop_43, fop_44, fop_45, f0, f0, - fop_48, fop_49, f0, fop_51, fop_52, fop_53, fop_54, fop_55, + fop_32, fop_33, fop_34, fop_35, fop_36, fop_37, fop_38, fop_39, + fop_40, fop_41, fop_42, fop_43, fop_44, fop_45, f0, f0, + fop_48, fop_49, fop_50, fop_51, fop_52, fop_53, fop_54, fop_55, f0, f0, f0, f0, fop_60, f0, f0, f0, }; diff --git a/src/debug/debug_gui.cpp b/src/debug/debug_gui.cpp index bfa64dc2..95c42d7c 100644 --- a/src/debug/debug_gui.cpp +++ b/src/debug/debug_gui.cpp @@ -127,6 +127,8 @@ static void Draw_RegisterLayout(void) { mvwaddstr(dbg.win_reg,1,28,"CS="); mvwaddstr(dbg.win_reg,1,38,"EIP="); + mvwaddstr(dbg.win_reg,2,75,"CPL"); + mvwaddstr(dbg.win_reg,2,68,"IOPL"); mvwaddstr(dbg.win_reg,1,52,"C Z S O A P D I T "); }