mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-16 16:21:02 +00:00
PPUTranslator: Try to fix a regression
This commit is contained in:
parent
c2076373e8
commit
467790c8d8
@ -368,13 +368,19 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect)
|
|||||||
const u64 base = m_reloc ? m_reloc->addr : 0;
|
const u64 base = m_reloc ? m_reloc->addr : 0;
|
||||||
const u32 caddr = m_info.segs[0].addr;
|
const u32 caddr = m_info.segs[0].addr;
|
||||||
const u32 cend = caddr + m_info.segs[0].size - 1;
|
const u32 cend = caddr + m_info.segs[0].size - 1;
|
||||||
const u32 _target = ::narrow<u32>(target + base);
|
const u64 _target = target + base;
|
||||||
|
|
||||||
if (_target >= caddr && _target <= cend)
|
if (_target >= u32{umax})
|
||||||
{
|
{
|
||||||
std::unordered_set<u32> passed_targets{_target};
|
Call(GetType<void>(), "__error", m_thread, GetAddr(), m_ir->getInt32(*ensure(m_info.get_ptr<u32>(::narrow<u32>(m_addr + base)))));
|
||||||
|
m_ir->CreateRetVoid();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (_target >= caddr && _target <= cend)
|
||||||
|
{
|
||||||
|
u32 target_last = static_cast<u32>(_target);
|
||||||
|
|
||||||
u32 target_last = _target;
|
std::unordered_set<u32> passed_targets{target_last};
|
||||||
|
|
||||||
// Try to follow unconditional branches as long as there is no infinite loop
|
// Try to follow unconditional branches as long as there is no infinite loop
|
||||||
while (target_last != _target)
|
while (target_last != _target)
|
||||||
@ -396,7 +402,7 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Infinite loop detected
|
// Infinite loop detected
|
||||||
target_last = _target;
|
target_last = static_cast<u32>(_target);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Odd destination
|
// Odd destination
|
||||||
|
Loading…
x
Reference in New Issue
Block a user