mirror of https://github.com/PCSX2/pcsx2.git
Merge branch 'Mirrors' of git://github.com/Kingcom/pcsx2
This commit is contained in:
commit
460ee7f5de
|
@ -28,7 +28,22 @@ std::vector<MemCheck> CBreakPoints::memChecks_;
|
||||||
std::vector<MemCheck *> CBreakPoints::cleanupMemChecks_;
|
std::vector<MemCheck *> CBreakPoints::cleanupMemChecks_;
|
||||||
bool CBreakPoints::breakpointTriggered_ = false;
|
bool CBreakPoints::breakpointTriggered_ = false;
|
||||||
|
|
||||||
int addressMask = 0x1FFFFFFF;
|
// called from the dynarec
|
||||||
|
u32 __fastcall standardizeBreakpointAddress(u32 addr)
|
||||||
|
{
|
||||||
|
if (addr >= 0xFFFF8000)
|
||||||
|
return addr;
|
||||||
|
|
||||||
|
if (addr >= 0xBFC00000 && addr <= 0xBFFFFFFF)
|
||||||
|
addr &= 0x1FFFFFFF;
|
||||||
|
|
||||||
|
addr &= 0x7FFFFFFF;
|
||||||
|
|
||||||
|
if ((addr >> 28) == 2 || (addr >> 28) == 3)
|
||||||
|
addr &= ~(0xF << 28);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
MemCheck::MemCheck()
|
MemCheck::MemCheck()
|
||||||
{
|
{
|
||||||
|
@ -100,11 +115,12 @@ void MemCheck::JitCleanup()
|
||||||
|
|
||||||
size_t CBreakPoints::FindBreakpoint(u32 addr, bool matchTemp, bool temp)
|
size_t CBreakPoints::FindBreakpoint(u32 addr, bool matchTemp, bool temp)
|
||||||
{
|
{
|
||||||
addr &= addressMask;
|
addr = standardizeBreakpointAddress(addr);
|
||||||
|
|
||||||
for (size_t i = 0; i < breakPoints_.size(); ++i)
|
for (size_t i = 0; i < breakPoints_.size(); ++i)
|
||||||
{
|
{
|
||||||
if ((breakPoints_[i].addr & addressMask) == addr && (!matchTemp || breakPoints_[i].temporary == temp))
|
u32 cmp = standardizeBreakpointAddress(breakPoints_[i].addr);
|
||||||
|
if (cmp == addr && (!matchTemp || breakPoints_[i].temporary == temp))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,11 +129,14 @@ size_t CBreakPoints::FindBreakpoint(u32 addr, bool matchTemp, bool temp)
|
||||||
|
|
||||||
size_t CBreakPoints::FindMemCheck(u32 start, u32 end)
|
size_t CBreakPoints::FindMemCheck(u32 start, u32 end)
|
||||||
{
|
{
|
||||||
start &= addressMask;
|
start = standardizeBreakpointAddress(start);
|
||||||
end &= addressMask;
|
end = standardizeBreakpointAddress(end);
|
||||||
|
|
||||||
for (size_t i = 0; i < memChecks_.size(); ++i)
|
for (size_t i = 0; i < memChecks_.size(); ++i)
|
||||||
{
|
{
|
||||||
if ((memChecks_[i].start & addressMask) == start && (memChecks_[i].end & addressMask) == end)
|
u32 cmpStart = standardizeBreakpointAddress(memChecks_[i].start);
|
||||||
|
int cmpEnd = standardizeBreakpointAddress(memChecks_[i].end);
|
||||||
|
if (cmpStart == start && cmpEnd == end)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,70 +324,15 @@ void CBreakPoints::ClearAllMemChecks()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 NotCached(u32 val)
|
|
||||||
{
|
|
||||||
// Remove the cached part of the address.
|
|
||||||
return val & ~0x40000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
MemCheck *CBreakPoints::GetMemCheck(u32 address, int size)
|
|
||||||
{
|
|
||||||
address &= addressMask;
|
|
||||||
|
|
||||||
std::vector<MemCheck>::iterator iter;
|
|
||||||
for (iter = memChecks_.begin(); iter != memChecks_.end(); ++iter)
|
|
||||||
{
|
|
||||||
MemCheck &check = *iter;
|
|
||||||
if (check.end != 0)
|
|
||||||
{
|
|
||||||
if (NotCached(address + size) > NotCached(check.start) && NotCached(address) < NotCached(check.end))
|
|
||||||
return ✓
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (NotCached(check.start) == NotCached(address))
|
|
||||||
return ✓
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//none found
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBreakPoints::ExecMemCheck(u32 address, bool write, int size, u32 pc)
|
|
||||||
{
|
|
||||||
auto check = GetMemCheck(address, size);
|
|
||||||
if (check)
|
|
||||||
check->Action(address, write, size, pc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBreakPoints::ExecMemCheckJitBefore(u32 address, bool write, int size, u32 pc)
|
|
||||||
{
|
|
||||||
auto check = GetMemCheck(address, size);
|
|
||||||
if (check) {
|
|
||||||
check->JitBefore(address, write, size, pc);
|
|
||||||
cleanupMemChecks_.push_back(check);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBreakPoints::ExecMemCheckJitCleanup()
|
|
||||||
{
|
|
||||||
for (auto it = cleanupMemChecks_.begin(), end = cleanupMemChecks_.end(); it != end; ++it) {
|
|
||||||
auto check = *it;
|
|
||||||
check->JitCleanup();
|
|
||||||
}
|
|
||||||
cleanupMemChecks_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBreakPoints::SetSkipFirst(u32 pc)
|
void CBreakPoints::SetSkipFirst(u32 pc)
|
||||||
{
|
{
|
||||||
breakSkipFirstAt_ = pc & addressMask;
|
breakSkipFirstAt_ = standardizeBreakpointAddress(pc);
|
||||||
breakSkipFirstTicks_ = r5900Debug.getCycles();
|
breakSkipFirstTicks_ = r5900Debug.getCycles();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 CBreakPoints::CheckSkipFirst(u32 cmpPc)
|
u32 CBreakPoints::CheckSkipFirst(u32 cmpPc)
|
||||||
{
|
{
|
||||||
cmpPc &= addressMask;
|
cmpPc = standardizeBreakpointAddress(cmpPc);
|
||||||
u32 pc = breakSkipFirstAt_;
|
u32 pc = breakSkipFirstAt_;
|
||||||
if (breakSkipFirstTicks_ == r5900Debug.getCycles())
|
if (breakSkipFirstTicks_ == r5900Debug.getCycles())
|
||||||
return pc;
|
return pc;
|
||||||
|
|
|
@ -132,13 +132,6 @@ public:
|
||||||
static void ChangeMemCheck(u32 start, u32 end, MemCheckCondition cond, MemCheckResult result);
|
static void ChangeMemCheck(u32 start, u32 end, MemCheckCondition cond, MemCheckResult result);
|
||||||
static void ClearAllMemChecks();
|
static void ClearAllMemChecks();
|
||||||
|
|
||||||
static MemCheck *GetMemCheck(u32 address, int size);
|
|
||||||
static void ExecMemCheck(u32 address, bool write, int size, u32 pc);
|
|
||||||
|
|
||||||
// Executes memchecks but used by the jit. Cleanup finalizes after jit is done.
|
|
||||||
static void ExecMemCheckJitBefore(u32 address, bool write, int size, u32 pc);
|
|
||||||
static void ExecMemCheckJitCleanup();
|
|
||||||
|
|
||||||
static void SetSkipFirst(u32 pc);
|
static void SetSkipFirst(u32 pc);
|
||||||
static u32 CheckSkipFirst(u32 pc);
|
static u32 CheckSkipFirst(u32 pc);
|
||||||
|
|
||||||
|
@ -168,3 +161,5 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// called from the dynarec
|
||||||
|
u32 __fastcall standardizeBreakpointAddress(u32 addr);
|
|
@ -483,12 +483,26 @@ std::string R5900DebugInterface::disasm(u32 address)
|
||||||
|
|
||||||
bool R5900DebugInterface::isValidAddress(u32 addr)
|
bool R5900DebugInterface::isValidAddress(u32 addr)
|
||||||
{
|
{
|
||||||
|
// ee can't access the first part of memory.
|
||||||
if (addr < 0x80000)
|
if (addr < 0x80000)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (addr >= 0xFFFF8000)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
addr &= 0x7FFFFFFF;
|
||||||
|
|
||||||
|
// get rid of ee ram mirrors
|
||||||
|
if ((addr >> 28) == 2 || (addr >> 28) == 3)
|
||||||
|
addr &= ~(0xF << 28);
|
||||||
|
|
||||||
|
// registers
|
||||||
if (addr >= 0x10000000 && addr < 0x10010000)
|
if (addr >= 0x10000000 && addr < 0x10010000)
|
||||||
return true;
|
return true;
|
||||||
if (addr >= 0x12000000 && addr < 0x12001100)
|
if (addr >= 0x12000000 && addr < 0x12001100)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// scratchpad
|
||||||
if (addr >= 0x70000000 && addr < 0x70004000)
|
if (addr >= 0x70000000 && addr < 0x70004000)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -1314,7 +1314,9 @@ void recMemcheck(u32 bits, bool store)
|
||||||
if (bits == 128)
|
if (bits == 128)
|
||||||
xAND(ecx, ~0x0F);
|
xAND(ecx, ~0x0F);
|
||||||
|
|
||||||
xMOV(edx,ecx);
|
xCALL(standardizeBreakpointAddress);
|
||||||
|
xMOV(ecx,eax);
|
||||||
|
xMOV(edx,eax);
|
||||||
xADD(edx,bits/8);
|
xADD(edx,bits/8);
|
||||||
|
|
||||||
// ecx = access address
|
// ecx = access address
|
||||||
|
@ -1332,11 +1334,11 @@ void recMemcheck(u32 bits, bool store)
|
||||||
|
|
||||||
// logic: memAddress < bpEnd && bpStart < memAddress+memSize
|
// logic: memAddress < bpEnd && bpStart < memAddress+memSize
|
||||||
|
|
||||||
xMOV(eax,checks[i].end);
|
xMOV(eax,standardizeBreakpointAddress(checks[i].end));
|
||||||
xCMP(ecx,eax); // address < end
|
xCMP(ecx,eax); // address < end
|
||||||
xForwardJGE8 next1; // if address >= end then goto next1
|
xForwardJGE8 next1; // if address >= end then goto next1
|
||||||
|
|
||||||
xMOV(eax,checks[i].start);
|
xMOV(eax,standardizeBreakpointAddress(checks[i].start));
|
||||||
xCMP(eax,edx); // start < address+size
|
xCMP(eax,edx); // start < address+size
|
||||||
xForwardJGE8 next2; // if start >= address+size then goto next2
|
xForwardJGE8 next2; // if start >= address+size then goto next2
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue