mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 13:31:27 +12:00
Debugger: Improve SPU/PPU callstack handling
This commit is contained in:
parent
6fcc68699a
commit
516da4ecdd
3 changed files with 14 additions and 6 deletions
|
@ -591,7 +591,13 @@ std::vector<std::pair<u32, u32>> ppu_thread::dump_callstack_list() const
|
||||||
|
|
||||||
auto is_invalid = [](u64 addr)
|
auto is_invalid = [](u64 addr)
|
||||||
{
|
{
|
||||||
return (addr > UINT32_MAX || addr % 4 || !vm::check_addr(static_cast<u32>(addr), 1, vm::page_executable));
|
if (addr > UINT32_MAX || addr % 4 || !vm::check_addr(static_cast<u32>(addr), 1, vm::page_executable))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignore HLE stop address
|
||||||
|
return addr == ppu_function_manager::addr + 8;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (is_invalid(addr))
|
if (is_invalid(addr))
|
||||||
|
|
|
@ -1269,17 +1269,19 @@ std::vector<std::pair<u32, u32>> spu_thread::dump_callstack_list() const
|
||||||
{
|
{
|
||||||
v128 lr = _ref<v128>(sp + 16);
|
v128 lr = _ref<v128>(sp + 16);
|
||||||
|
|
||||||
auto is_invalid = [](v128 v)
|
auto is_invalid = [this](v128 v)
|
||||||
{
|
{
|
||||||
const u32 addr = v._u32[3];
|
const u32 addr = v._u32[3] & 0x3FFFC;
|
||||||
|
|
||||||
if (v != v128::from32r(addr))
|
if (v != v128::from32r(addr))
|
||||||
{
|
{
|
||||||
// Non-zero lower words are invalid (because BRSL-like instructions generate only zeroes)
|
// 1) Non-zero lower words are invalid (because BRSL-like instructions generate only zeroes)
|
||||||
|
// 2) Bits normally masked out by indirect braches are considered invalid
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !!(addr & ~0x3FFFC);
|
const u32 op = _ref<u32>(addr);
|
||||||
|
return s_spu_itype.decode(op) == spu_itype::UNK || !op;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (is_invalid(lr))
|
if (is_invalid(lr))
|
||||||
|
|
|
@ -23,7 +23,7 @@ void call_stack_list::HandleUpdate(std::vector<std::pair<u32, u32>> call_stack)
|
||||||
|
|
||||||
for (const auto& addr : call_stack)
|
for (const auto& addr : call_stack)
|
||||||
{
|
{
|
||||||
const QString call_stack_item_text = qstr(fmt::format("0x%08llx (r1=0x%08llx)", addr.first, addr.second));
|
const QString call_stack_item_text = qstr(fmt::format("0x%08llx (sp=0x%08llx)", addr.first, addr.second));
|
||||||
QListWidgetItem* callStackItem = new QListWidgetItem(call_stack_item_text);
|
QListWidgetItem* callStackItem = new QListWidgetItem(call_stack_item_text);
|
||||||
callStackItem->setData(Qt::UserRole, { addr.first });
|
callStackItem->setData(Qt::UserRole, { addr.first });
|
||||||
addItem(callStackItem);
|
addItem(callStackItem);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue