diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a22b9b2dbf..2b94e2d026 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1290,7 +1290,7 @@ std::vector> ppu_thread::dump_callstack_list() const for ( u64 sp = r1; sp % 0x10 == 0u && sp >= stack_min && sp <= stack_max - ppu_stack_start_offset; - sp = *vm::get_super_ptr(static_cast(sp)), first = false + first = false ) { u64 addr = *vm::get_super_ptr(static_cast(sp + 16)); @@ -1328,6 +1328,16 @@ std::vector> ppu_thread::dump_callstack_list() const // TODO: function addresses too call_stack_list.emplace_back(static_cast(addr), static_cast(sp)); + + const u64 temp_sp = *vm::get_super_ptr(static_cast(sp)); + + if (temp_sp <= sp) + { + // Ensure inequality and that the old stack pointer is higher than current + break; + } + + sp = temp_sp; } return call_stack_list; diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 070f1ed25f..f5152dd7d0 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1182,7 +1182,7 @@ std::vector> spu_thread::dump_callstack_list() const const v128 gpr0 = gpr[0]; // Declare first 128-bytes as invalid for stack (common values such as 0 do not make sense here) - for (u32 sp = gpr[1]._u32[3]; (sp & 0xF) == 0u && sp >= 0x80u && sp <= 0x3FFE0u; sp = _ref(sp), first = false) + for (u32 sp = gpr[1]._u32[3]; (sp & 0xF) == 0u && sp >= 0x80u && sp <= 0x3FFE0u; first = false) { v128 lr = _ref(sp + 16); @@ -1310,6 +1310,16 @@ std::vector> spu_thread::dump_callstack_list() const // TODO: function addresses too call_stack_list.emplace_back(lr._u32[3], sp); + + const u32 temp_sp = _ref(sp); + + if (temp_sp <= sp) + { + // Ensure ascending stack frame pointers + break; + } + + sp = temp_sp; } return call_stack_list;