|
@@ -2,7 +2,6 @@
|
|
|
// Licensed under GPLv2 or any later version
|
|
// Licensed under GPLv2 or any later version
|
|
|
// Refer to the license.txt file included.
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
-#include "common/debug_interface.h"
|
|
|
|
|
#include "common/break_points.h"
|
|
#include "common/break_points.h"
|
|
|
#include "common/logging/log.h"
|
|
#include "common/logging/log.h"
|
|
|
|
|
|
|
@@ -101,92 +100,3 @@ void BreakPoints::Clear()
|
|
|
|
|
|
|
|
m_BreakPoints.clear();
|
|
m_BreakPoints.clear();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-MemChecks::TMemChecksStr MemChecks::GetStrings() const
|
|
|
|
|
-{
|
|
|
|
|
- TMemChecksStr mcs;
|
|
|
|
|
- for (auto memcheck : m_MemChecks)
|
|
|
|
|
- {
|
|
|
|
|
- std::stringstream mc;
|
|
|
|
|
- mc << std::hex << memcheck.StartAddress;
|
|
|
|
|
- mc << " " << (memcheck.bRange ? memcheck.EndAddress : memcheck.StartAddress) << " "
|
|
|
|
|
- << (memcheck.bRange ? "n" : "")
|
|
|
|
|
- << (memcheck.OnRead ? "r" : "")
|
|
|
|
|
- << (memcheck.OnWrite ? "w" : "")
|
|
|
|
|
- << (memcheck.Log ? "l" : "")
|
|
|
|
|
- << (memcheck.Break ? "p" : "");
|
|
|
|
|
- mcs.push_back(mc.str());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return mcs;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void MemChecks::AddFromStrings(const TMemChecksStr& mcs)
|
|
|
|
|
-{
|
|
|
|
|
- for (auto mcs_item : mcs)
|
|
|
|
|
- {
|
|
|
|
|
- TMemCheck mc;
|
|
|
|
|
- std::stringstream mcstr;
|
|
|
|
|
- mcstr << std::hex << mcs_item;
|
|
|
|
|
- mcstr >> mc.StartAddress;
|
|
|
|
|
- mc.bRange = mcs_item.find("n") != mcs_item.npos;
|
|
|
|
|
- mc.OnRead = mcs_item.find("r") != mcs_item.npos;
|
|
|
|
|
- mc.OnWrite = mcs_item.find("w") != mcs_item.npos;
|
|
|
|
|
- mc.Log = mcs_item.find("l") != mcs_item.npos;
|
|
|
|
|
- mc.Break = mcs_item.find("p") != mcs_item.npos;
|
|
|
|
|
- if (mc.bRange)
|
|
|
|
|
- mcstr >> mc.EndAddress;
|
|
|
|
|
- else
|
|
|
|
|
- mc.EndAddress = mc.StartAddress;
|
|
|
|
|
- Add(mc);
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void MemChecks::Add(const TMemCheck& rMemoryCheck)
|
|
|
|
|
-{
|
|
|
|
|
- if (GetMemCheck(rMemoryCheck.StartAddress) == 0)
|
|
|
|
|
- m_MemChecks.push_back(rMemoryCheck);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void MemChecks::Remove(u32 Address)
|
|
|
|
|
-{
|
|
|
|
|
- auto cond = [&Address](const TMemCheck& mc) { return mc.StartAddress == Address; };
|
|
|
|
|
- auto it = std::find_if(m_MemChecks.begin(), m_MemChecks.end(), cond);
|
|
|
|
|
- if (it != m_MemChecks.end())
|
|
|
|
|
- m_MemChecks.erase(it);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-TMemCheck *MemChecks::GetMemCheck(u32 address)
|
|
|
|
|
-{
|
|
|
|
|
- for (auto i = m_MemChecks.begin(); i != m_MemChecks.end(); ++i)
|
|
|
|
|
- {
|
|
|
|
|
- if (i->bRange)
|
|
|
|
|
- {
|
|
|
|
|
- if (address >= i->StartAddress && address <= i->EndAddress)
|
|
|
|
|
- return &(*i);
|
|
|
|
|
- }
|
|
|
|
|
- else if (i->StartAddress == address)
|
|
|
|
|
- return &(*i);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // none found
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void TMemCheck::Action(DebugInterface *debug_interface, u32 iValue, u32 addr,
|
|
|
|
|
- bool write, int size, u32 pc)
|
|
|
|
|
-{
|
|
|
|
|
- if ((write && OnWrite) || (!write && OnRead))
|
|
|
|
|
- {
|
|
|
|
|
- if (Log)
|
|
|
|
|
- {
|
|
|
|
|
- LOG_DEBUG(Debug_Breakpoint, "CHK %08x (%s) %s%i %0*x at %08x (%s)",
|
|
|
|
|
- pc, debug_interface->getDescription(pc).c_str(),
|
|
|
|
|
- write ? "Write" : "Read", size*8, size*2, iValue, addr,
|
|
|
|
|
- debug_interface->getDescription(addr).c_str()
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- if (Break)
|
|
|
|
|
- debug_interface->breakNow();
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|