diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 158eee2e43..e9cc8cf209 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -575,6 +575,11 @@ void ppu_thread::cpu_task() cmd_pop(), lv2_obj::sleep(*this); break; } + case ppu_cmd::reset_stack: + { + cmd_pop(), gpr[1] = ::align(stack_addr + stack_size, 0x200) - 0x200; + break; + } default: { fmt::throw_exception("Unknown ppu_cmd(0x%x)" HERE, (u32)type); diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index f5db19fcea..94074a45af 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -16,6 +16,7 @@ enum class ppu_cmd : u32 hle_call, // Execute function by index (arg) initialize, // ppu_initialize() sleep, + reset_stack, // resets stack address }; // Formatting helper diff --git a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp index 2c99fe72ee..9e0a068c31 100644 --- a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp @@ -16,6 +16,7 @@ void lv2_int_serv::exec() { thread->cmd_list ({ + { ppu_cmd::reset_stack, 0 }, { ppu_cmd::set_args, 2 }, arg1, arg2, { ppu_cmd::lle_call, 2 }, { ppu_cmd::sleep, 0 }