From 7bbadfd08bc2d6c3da98ecc7edd00a7e837138e3 Mon Sep 17 00:00:00 2001 From: Jake Date: Mon, 5 Mar 2018 20:36:33 -0600 Subject: [PATCH] ppu/sys_interrupt: add stack_reset command to fix sys_interrupt stack overflowing --- rpcs3/Emu/Cell/PPUThread.cpp | 5 +++++ rpcs3/Emu/Cell/PPUThread.h | 1 + rpcs3/Emu/Cell/lv2/sys_interrupt.cpp | 1 + 3 files changed, 7 insertions(+) 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 }