From 53159a81cf512362d09a10c61fe72acf1e9b4e47 Mon Sep 17 00:00:00 2001 From: Kingcom Date: Wed, 16 Jul 2014 00:51:53 +0200 Subject: [PATCH] -Add lq/sq preview -fix potential memory access exceptions -prevent the disassembly from changing positions when a breakpoint is toggled -only use the status bar text from the current cpu --- pcsx2/DebugTools/DebugInterface.cpp | 73 ++++++++++++++++++---- pcsx2/DebugTools/DebugInterface.h | 2 + pcsx2/DebugTools/MIPSAnalyst.cpp | 3 + pcsx2/gui/AppMain.cpp | 4 +- pcsx2/gui/Debugger/CtrlDisassemblyView.cpp | 2 +- pcsx2/gui/Debugger/DisassemblyDialog.cpp | 22 +++++-- pcsx2/gui/Debugger/DisassemblyDialog.h | 3 +- 7 files changed, 88 insertions(+), 21 deletions(-) diff --git a/pcsx2/DebugTools/DebugInterface.cpp b/pcsx2/DebugTools/DebugInterface.cpp index 16d28cedf5..286441a61a 100644 --- a/pcsx2/DebugTools/DebugInterface.cpp +++ b/pcsx2/DebugTools/DebugInterface.cpp @@ -27,6 +27,10 @@ #include "../IopMem.h" #include "SymbolMap.h" +#ifdef _WIN32 +#include +#endif + extern AppCoreThread CoreThread; R5900DebugInterface r5900Debug; @@ -204,25 +208,48 @@ bool DebugInterface::parseExpression(PostfixExpression& exp, u64& dest) // R5900DebugInterface // -u32 R5900DebugInterface::read8(u32 address) +u32 R5900DebugInterface::readMemory(u32 address, u32 size) { if (!isValidAddress(address)) return -1; - return memRead8(address); + + // TODO: Add linux variant of the following __try/__except +#if defined(_MSC_VER) + __try + { +#endif + switch (size) + { + case 1: + return memRead8(address); + case 2: + return memRead16(address); + case 4: + return memRead32(address); + default: + return -1; + } +#if defined(_MSC_VER) + } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) + { + return -1; + } +#endif +} + +u32 R5900DebugInterface::read8(u32 address) +{ + return readMemory(address,1); } u32 R5900DebugInterface::read16(u32 address) { - if (!isValidAddress(address)) - return -1; - return memRead16(address); + return readMemory(address,2); } u32 R5900DebugInterface::read32(u32 address) { - if (!isValidAddress(address)) - return -1; - return memRead32(address); + return readMemory(address,4); } u64 R5900DebugInterface::read64(u32 address) @@ -231,7 +258,19 @@ u64 R5900DebugInterface::read64(u32 address) return -1; u64 result; - memRead64(address,result); + + // TODO: Add linux variant of the following __try/__except +#if defined(_MSC_VER) + __try { +#endif + memRead64(address,result); +#if defined(_MSC_VER) + } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) + { + result = -1; + } +#endif + return result; } @@ -240,8 +279,20 @@ u128 R5900DebugInterface::read128(u32 address) if (!isValidAddress(address)) return u128::From32(-1); - u128 result; - memRead128(address,result); + __aligned16 u128 result; + + // TODO: Add linux variant of the following __try/__except +#if defined(_MSC_VER) + __try { +#endif + memRead128(address,result); +#if defined(_MSC_VER) + } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) + { + result.hi = result.lo = -1; + } +#endif + return result; } diff --git a/pcsx2/DebugTools/DebugInterface.h b/pcsx2/DebugTools/DebugInterface.h index b3b2677683..c3ca61fc56 100644 --- a/pcsx2/DebugTools/DebugInterface.h +++ b/pcsx2/DebugTools/DebugInterface.h @@ -84,6 +84,8 @@ public: virtual std::string disasm(u32 address); virtual bool isValidAddress(u32 address); virtual u32 getCycles(); +private: + u32 readMemory(u32 address, u32 size); }; diff --git a/pcsx2/DebugTools/MIPSAnalyst.cpp b/pcsx2/DebugTools/MIPSAnalyst.cpp index 7f221e5d94..964b2edc61 100644 --- a/pcsx2/DebugTools/MIPSAnalyst.cpp +++ b/pcsx2/DebugTools/MIPSAnalyst.cpp @@ -337,6 +337,9 @@ namespace MIPSAnalyst case 0x2C: // sdl size = 8; off = -7; + case 0x1E: // lq + case 0x1F: // sq + size = 16; break; } diff --git a/pcsx2/gui/AppMain.cpp b/pcsx2/gui/AppMain.cpp index 3214c1e6d5..f860c0e275 100644 --- a/pcsx2/gui/AppMain.cpp +++ b/pcsx2/gui/AppMain.cpp @@ -757,14 +757,14 @@ void Pcsx2App::enterDebugMode() { DisassemblyDialog* dlg = GetDisassemblyPtr(); if (dlg) - dlg->setDebugMode(true); + dlg->setDebugMode(true,false); } void Pcsx2App::leaveDebugMode() { DisassemblyDialog* dlg = GetDisassemblyPtr(); if (dlg) - dlg->setDebugMode(false); + dlg->setDebugMode(false,false); } void Pcsx2App::resetDebugger() diff --git a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp index e954dc49ac..9af9e05253 100644 --- a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp +++ b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp @@ -811,7 +811,7 @@ void CtrlDisassemblyView::updateStatusBarText() } case 16: { - u128 data = cpu->read128(line.info.dataAddress); + __aligned16 u128 data = cpu->read128(line.info.dataAddress); sprintf(text,"[%08X] = %016llX%016llX",line.info.dataAddress,data._u64[1],data._u64[0]); break; } diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.cpp b/pcsx2/gui/Debugger/DisassemblyDialog.cpp index 5fff576d8c..f1a2ccf635 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.cpp +++ b/pcsx2/gui/Debugger/DisassemblyDialog.cpp @@ -170,7 +170,7 @@ DisassemblyDialog::DisassemblyDialog(wxWindow* parent): SetMinSize(wxSize(1000,600)); panel->GetSizer()->Fit(this); - setDebugMode(true); + setDebugMode(true,true); } #ifdef WIN32 @@ -212,8 +212,10 @@ void DisassemblyDialog::onBreakRunClicked(wxCommandEvent& evt) // If the current PC is on a breakpoint, the user doesn't want to do nothing. CBreakPoints::SetSkipFirst(r5900Debug.getPC()); r5900Debug.resumeCpu(); - } else + } else { r5900Debug.pauseCpu(); + gotoPc(); + } } void DisassemblyDialog::onStepOverClicked(wxCommandEvent& evt) @@ -352,7 +354,9 @@ void DisassemblyDialog::onDebuggerEvent(wxCommandEvent& evt) wxEventType type = evt.GetEventType(); if (type == debEVT_SETSTATUSBARTEXT) { - GetStatusBar()->SetLabel(evt.GetString()); + CtrlDisassemblyView* view = reinterpret_cast(evt.GetEventObject()); + if (view != NULL && view == currentCpu->getDisassembly()) + GetStatusBar()->SetLabel(evt.GetString()); } else if (type == debEVT_UPDATELAYOUT) { if (currentCpu != NULL) @@ -420,7 +424,13 @@ void DisassemblyDialog::reset() iopTab->getDisassembly()->clearFunctions(); }; -void DisassemblyDialog::setDebugMode(bool debugMode) +void DisassemblyDialog::gotoPc() +{ + eeTab->getDisassembly()->gotoPc(); + iopTab->getDisassembly()->gotoPc(); +} + +void DisassemblyDialog::setDebugMode(bool debugMode, bool switchPC) { bool running = r5900Debug.isAlive(); @@ -437,8 +447,8 @@ void DisassemblyDialog::setDebugMode(bool debugMode) stepOverButton->Enable(true); stepIntoButton->Enable(true); - eeTab->getDisassembly()->gotoPc(); - iopTab->getDisassembly()->gotoPc(); + if (switchPC || CBreakPoints::GetBreakpointTriggered()) + gotoPc(); if (CBreakPoints::GetBreakpointTriggered()) { diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.h b/pcsx2/gui/Debugger/DisassemblyDialog.h index 898f8e2d0f..f6c81e112c 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.h +++ b/pcsx2/gui/Debugger/DisassemblyDialog.h @@ -62,7 +62,7 @@ public: void update(); void reset(); - void setDebugMode(bool debugMode); + void setDebugMode(bool debugMode, bool switchPC); #ifdef WIN32 WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); @@ -79,6 +79,7 @@ protected: void onClose(wxCloseEvent& evt); void stepOver(); void stepInto(); + void gotoPc(); private: CpuTabPage* eeTab; CpuTabPage* iopTab;