diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 3de988ecf8..1ba1f0d673 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -591,7 +591,13 @@ std::vector> ppu_thread::dump_callstack_list() const auto is_invalid = [](u64 addr) { - return (addr > UINT32_MAX || addr % 4 || !vm::check_addr(static_cast(addr), 1, vm::page_executable)); + if (addr > UINT32_MAX || addr % 4 || !vm::check_addr(static_cast(addr), 1, vm::page_executable)) + { + return true; + } + + // Ignore HLE stop address + return addr == ppu_function_manager::addr + 8; }; if (is_invalid(addr)) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 84ad06c519..fb344d1399 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1269,17 +1269,19 @@ std::vector> spu_thread::dump_callstack_list() const { v128 lr = _ref(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)) { - // 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 !!(addr & ~0x3FFFC); + const u32 op = _ref(addr); + return s_spu_itype.decode(op) == spu_itype::UNK || !op; }; if (is_invalid(lr)) diff --git a/rpcs3/rpcs3qt/call_stack_list.cpp b/rpcs3/rpcs3qt/call_stack_list.cpp index 567198ecdd..379e1fe71c 100644 --- a/rpcs3/rpcs3qt/call_stack_list.cpp +++ b/rpcs3/rpcs3qt/call_stack_list.cpp @@ -23,7 +23,7 @@ void call_stack_list::HandleUpdate(std::vector> 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); callStackItem->setData(Qt::UserRole, { addr.first }); addItem(callStackItem);