From b23062c54a75eb88d58f7df537c4b543229db1f7 Mon Sep 17 00:00:00 2001 From: Kingcom Date: Sat, 19 Jul 2014 01:05:41 +0200 Subject: [PATCH] Check for alignment when accessing memory with the debugger --- pcsx2/DebugTools/DebugInterface.cpp | 20 +++++++++++++---- pcsx2/DebugTools/MIPSAnalyst.cpp | 13 +++++++++-- pcsx2/DebugTools/MIPSAnalyst.h | 3 +++ pcsx2/gui/Debugger/CtrlDisassemblyView.cpp | 25 ++++++++++++++++++++-- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/pcsx2/DebugTools/DebugInterface.cpp b/pcsx2/DebugTools/DebugInterface.cpp index 8ff13655a1..d139aca6f3 100644 --- a/pcsx2/DebugTools/DebugInterface.cpp +++ b/pcsx2/DebugTools/DebugInterface.cpp @@ -206,22 +206,31 @@ bool DebugInterface::parseExpression(PostfixExpression& exp, u64& dest) u32 R5900DebugInterface::read8(u32 address) { + if (!isValidAddress(address)) + return -1; + return memRead8(address); } u32 R5900DebugInterface::read16(u32 address) { + if (!isValidAddress(address) || address % 2) + return -1; + return memRead16(address); } u32 R5900DebugInterface::read32(u32 address) { + if (!isValidAddress(address) || address % 4) + return -1; + return memRead32(address); } u64 R5900DebugInterface::read64(u32 address) { - if (!isValidAddress(address)) + if (!isValidAddress(address) || address % 8) return -1; u64 result; @@ -231,10 +240,13 @@ u64 R5900DebugInterface::read64(u32 address) u128 R5900DebugInterface::read128(u32 address) { - if (!isValidAddress(address)) - return u128::From32(-1); - __aligned16 u128 result; + if (!isValidAddress(address) || address % 16) + { + result.hi = result.lo = -1; + return result; + } + memRead128(address,result); return result; } diff --git a/pcsx2/DebugTools/MIPSAnalyst.cpp b/pcsx2/DebugTools/MIPSAnalyst.cpp index 964b2edc61..2da49cee1f 100644 --- a/pcsx2/DebugTools/MIPSAnalyst.cpp +++ b/pcsx2/DebugTools/MIPSAnalyst.cpp @@ -317,26 +317,35 @@ namespace MIPSAnalyst size = 2; break; case 0x23: // lw - case 0x26: // lwr case 0x2B: // sw + size = 4; + break; + case 0x26: // lwr case 0x2E: // swr size = 4; + info.lrType = LOADSTORE_RIGHT; break; case 0x22: // lwl case 0x2A: // swl size = 4; off = -3; + info.lrType = LOADSTORE_LEFT; break; case 0x37: // ld - case 0x1B: // ldr case 0x3F: // sd + size = 8; + break; + case 0x1B: // ldr case 0x2D: // sdr size = 8; + info.lrType = LOADSTORE_RIGHT; break; case 0x1A: // ldl case 0x2C: // sdl size = 8; off = -7; + info.lrType = LOADSTORE_LEFT; + break; case 0x1E: // lq case 0x1F: // sq size = 16; diff --git a/pcsx2/DebugTools/MIPSAnalyst.h b/pcsx2/DebugTools/MIPSAnalyst.h index 5176872e57..65fab05509 100644 --- a/pcsx2/DebugTools/MIPSAnalyst.h +++ b/pcsx2/DebugTools/MIPSAnalyst.h @@ -41,6 +41,8 @@ namespace MIPSAnalyst void ScanForFunctions(u32 startAddr, u32 endAddr, bool insertSymbols); + enum LoadStoreLRType { LOADSTORE_NORMAL, LOADSTORE_LEFT, LOADSTORE_RIGHT }; + typedef struct { DebugInterface* cpu; u32 opcodeAddress; @@ -61,6 +63,7 @@ namespace MIPSAnalyst // data access bool isDataAccess; + LoadStoreLRType lrType; int dataSize; u32 dataAddress; diff --git a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp index d722e5b0c0..ec67f64f7f 100644 --- a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp +++ b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp @@ -847,6 +847,9 @@ void CtrlDisassemblyView::updateStatusBarText() if (!cpu->isValidAddress(line.info.dataAddress)) { sprintf(text,"Invalid address %08X",line.info.dataAddress); + } else if (line.info.lrType == MIPSAnalyst::LOADSTORE_NORMAL && line.info.dataAddress % line.info.dataSize) + { + sprintf(text,"Unaligned address %08X",line.info.dataAddress); } else { switch (line.info.dataSize) { @@ -858,7 +861,16 @@ void CtrlDisassemblyView::updateStatusBarText() break; case 4: { - u32 data = cpu->read32(line.info.dataAddress); + u32 data; + if (line.info.lrType != MIPSAnalyst::LOADSTORE_NORMAL) + { + u32 address = line.info.dataAddress; + data = cpu->read32(address & ~3) >> (address & 3) * 8; + data |= cpu->read32((address + 3) & ~3) << (4 - (address & 3)) * 8; + } else { + data = cpu->read32(line.info.dataAddress); + } + const std::string addressSymbol = symbolMap.GetLabelString(data); if (!addressSymbol.empty()) { @@ -870,7 +882,16 @@ void CtrlDisassemblyView::updateStatusBarText() } case 8: { - u64 data = cpu->read64(line.info.dataAddress); + u64 data; + if (line.info.lrType != MIPSAnalyst::LOADSTORE_NORMAL) + { + u32 address = line.info.dataAddress; + data = cpu->read64(address & ~7) >> (address & 7) * 8; + data |= cpu->read64((address + 7) & ~7) << (8 - (address & 7)) * 8; + } else { + data = cpu->read64(line.info.dataAddress); + } + sprintf(text,"[%08X] = %016llX",line.info.dataAddress,data); break; }