From af53ce6f76bda4d5d6aacdc28a2a35f083b3910e Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 25 Feb 2017 19:29:31 +0300 Subject: [PATCH] Stack overflow constrained --- rpcs3/Emu/Cell/PPUThread.cpp | 3 ++- rpcs3/Emu/PSP2/ARMv7Thread.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 252074cba0..6eec05e5ca 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -264,6 +264,7 @@ std::string ppu_thread::dump() const ret += fmt::format("VSCR = [SAT=%u | NJ=%u]\n", sat, nj); ret += fmt::format("FPSCR = [FL=%u | FG=%u | FE=%u | FU=%u]\n", fpscr.fl, fpscr.fg, fpscr.fe, fpscr.fu); + // TODO: support foreign stack ret += "\nCall stack:\n=========\n"; ret += fmt::format("0x%08x (0x0) called\n", cia); const u32 stack_max = ::align(stack_addr + stack_size, 0x200) - 0x200; @@ -604,7 +605,7 @@ u32 ppu_thread::stack_push(u32 size, u32 align_v) context.gpr[1] -= align(size + 4, 8); // room minimal possible size context.gpr[1] &= ~(align_v - 1); // fix stack alignment - if (context.gpr[1] < context.stack_addr) + if (old_pos >= context.stack_addr && old_pos < context.stack_addr + context.stack_size && context.gpr[1] < context.stack_addr) { fmt::throw_exception("Stack overflow (size=0x%x, align=0x%x, SP=0x%llx, stack=*0x%x)" HERE, size, align_v, old_pos, context.stack_addr); } diff --git a/rpcs3/Emu/PSP2/ARMv7Thread.cpp b/rpcs3/Emu/PSP2/ARMv7Thread.cpp index b7dc15a19c..e8d3451c7b 100644 --- a/rpcs3/Emu/PSP2/ARMv7Thread.cpp +++ b/rpcs3/Emu/PSP2/ARMv7Thread.cpp @@ -170,7 +170,7 @@ u32 ARMv7Thread::stack_push(u32 size, u32 align_v) context.SP -= align(size + 4, 4); // room minimal possible size context.SP &= ~(align_v - 1); // fix stack alignment - if (context.SP < context.stack_addr) + if (old_pos >= context.stack_addr && old_pos < context.stack_addr + context.stack_size && context.SP < context.stack_addr) { fmt::throw_exception("Stack overflow (size=0x%x, align=0x%x, SP=0x%x, stack=*0x%x)" HERE, size, align_v, context.SP, context.stack_addr); }