RPCS3 Forums

Full Version: Persona 5 [NPJB00769]
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3
Now works on master versions, download from rpcs3.net/download and ignore any and all links to strange hacked builds etc.

Optimal settings for Persona 5 are as follows: PPU and SPU recompiler, Vulkan renderer. 1 or 2 or 3 preferred SPU threads depending on your CPU (try all three), SPU loop detection must be enabled, and fps limit should be off. If you see broken shadows, turn on invalidate cache every frame.


Bryceless

(09-15-2016, 04:49 PM)ssshadow Wrote: [ -> ]Of course it doesn't work.

That said, since this is quite literally the last meaningful PS3 game to ever be released and Atlus are being fanboys or someshit and not releasing on Steam I am making this thread so no one has to waste time trying.

Rest assured, the day it starts to work (or maybe the day after) I will update this thread. It's probably going to be quite some time though...

Absolutelely required LLE modules:
- libfiber.prx
- libresc.prx
- librtc.prx
- libsail.prx
- libspurs_jq.prx
- libsre.prx

Log:

So with the info that you gave me, I managed to get to a blank gray screen, but it shows up with an STD:RuntimeError (F {PPU[0x70000000] Thread (main_thread) [0x00b49400]} class std::runtime_error thrown: Stack overflow (size=0x8, align=0x4, SP=0x2034b8a0, stack=*0xd0000000)
(in file C:\rpcs3\rpcs3\Emu\Cell\PPUThread.cpp:410)
)

Nezarn

Thats what he posted too, if you check his log.

Long story short, GAME DOESN'T WORK.
I got the game to "work" with a small hack, basically just ignore an exception and continue. The game can hang at random at any time and as you can see in the video I was quick to get past the main menu (with proper looking 3D graphics!).

You can sadly not skip the video that plays after starting a new game, the fade out effect causes some RSX error. Therefore each try at going in game will take about 8 minutes. And the LLVM recompiler doesn't work. But it can go in game, even for just a few seconds as seen in the screenshot below. A faster computer would probably help.

Use OpenGL. Vulkan looks worse than OpenGL and DX12 doesn't work at all, it will fail when reaching the main menu.

Video


A screenshot


Going in game for a few seconds


Settings
OpenGL 1280x720
PPU Decoder: Interpreter (fast)
SPU Decoder: Recompiler (ASMJIT)
XAudio

LLE (yes, it turns out you only need these)
Code:
libfiber.prx
librtc.prx
libspurs_jq.prx
libsre.prx

Log


Hacked build v4 with skippable new game video, no hanging, and a bit better performance.
https://mega.nz/#!g80nmAzJ!Us13wDDgXy3Bk...quuqh6cAKU

Changes made
In \Emu\Cell\PPUThread.cpp change:
Code:
        if (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);
        }
        else
        {
            const u32 addr = static_cast<u32>(context.gpr[1]);
            vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
            std::memset(vm::base(addr), 0, size);
            return addr;
        }
Into:
Code:
        const u32 addr = static_cast<u32>(context.gpr[1]);
        vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
        std::memset(vm::base(addr), 0, size);
        return addr;

(Someone please explain the rationale behind that if-condition, the contents of gpr1 is a much lower address than stack_addr but the game runs regardless... This error happens right when “CRI FS File Access 0” is created, so it's not something unimportant we are ignoring here. Edit: It actually also happens for like 10 other threads too...)

Dante38490

(01-08-2017, 05:27 PM)ssshadow Wrote: [ -> ]Changes made
In \Emu\Cell\PPUThread.cpp change:
Code:
        if (context.gpr[1] < context.stack_addr)
        {
            LOG_ERROR(PPU, "Stack overflow (size=0x%x, align=0x%x, SP=0x%llx, stack=*0x%x)" HERE, size, align_v, old_pos, context.stack_addr);
            const u32 addr = static_cast<u32>(context.gpr[1]);
            vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
            std::memset(vm::base(addr), 0, size);
            return addr;
        }
        else
        {
            const u32 addr = static_cast<u32>(context.gpr[1]);
            vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
            std::memset(vm::base(addr), 0, size);
            return addr;
        }
Into:
Code:
        const u32 addr = static_cast<u32>(context.gpr[1]);
        vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
        std::memset(vm::base(addr), 0, size);
        return addr;

Thx Smile but me have set with this
Quote: if (context.gpr[1] < context.stack_addr)
{
LOG_ERROR(PPU, "Stack overflow (size=0x%x, align=0x%x, SP=0x%llx, stack=*0x%x)" HERE, size, align_v, old_pos, context.stack_addr);
const u32 addr = static_cast<u32>(context.gpr[1]);
vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
std::memset(vm::base(addr), 0, size);
return addr;
}
else
{
const u32 addr = static_cast<u32>(context.gpr[1]);
vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
std::memset(vm::base(addr), 0, size);
return addr;
}
for rpcs3 indicate in error in LOG Smile, and rpcs3 indicate this error for boot, after boot have no error
Quote:E {PPU[0x70000000] Thread (main_thread) [0x00b48a50]} PPU: Stack overflow (size=0x8, align=0x4, SP=0x2034c360, stack=*0xd0000000)
(in file Emu\Cell\PPUThread.cpp:411)
E {PPU[0x70000000] Thread (main_thread) [0x00b48a50]} PPU: Stack overflow (size=0x8, align=0x4, SP=0x2034c360, stack=*0xd0000000)
(in file Emu\Cell\PPUThread.cpp:411)
E {PPU[0x70000000] Thread (main_thread) [0x00b48a50]} PPU: Stack overflow (size=0x8, align=0x4, SP=0x2034c120, stack=*0xd0000000)
(in file Emu\Cell\PPUThread.cpp:411)
Interesting find. I wonder what the CPU disassembly around this instruction looks like; might explain the check failing.
(01-09-2017, 06:17 PM)kd-11 Wrote: [ -> ]Interesting find. I wonder what the CPU disassembly around this instruction looks like; might explain the check failing.

I don't know enough to understand why that check is there, there is probably some kind of assumption but it doesn't seem right. The check is run right after creating a new thread, and look how many times it "fails", and yet the game runs... Maybe it is some kind of weird edge case or something, I might have a look later.

Quote:E {PPU[0x70000000] Thread (main_thread) [0x012a3704]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021da8, entry=0x12b939c, arg=0x20021080, prio=1000, stacksize=0x8000, flags=0x1, threadname=“gfdSpursSpursHdlr1”)
E {PPU[0x70000000] Thread (main_thread) [0x012a3704]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021da0, entry=0x12b92d4, arg=0x20021080, prio=1000, stacksize=0x4000, flags=0x1, threadname=“gfdSpursSpursHdlr0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021060, entry=0xcf5ac8, arg=0x20021060, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200379d0, entry=0xcf5ac8, arg=0x200379d0, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200209d0, entry=0xcf5ac8, arg=0x200209d0, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1146c68, entry=0xcf8e40, arg=0x1146c58, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x11632c0, entry=0xcf8e40, arg=0x11632b0, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS Memory File System”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x114ad50, entry=0xcf8e40, arg=0x114ad40, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 1”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x114ee38, entry=0xcf8e40, arg=0x114ee28, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1152f20, entry=0xcf8e40, arg=0x1152f10, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 3”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1142a28, entry=0xcf8e40, arg=0x1142a18, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS Data Decompression 0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b9c0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x113e7a0, entry=0xcf8e40, arg=0x113e790, prio=800, stacksize=0x4000, flags=0x1, threadname=“CRI Server Manager”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034bac0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x203f3010, entry=0xcf5ac8, arg=0x203f3010, prio=1002, stacksize=0xa000, flags=0x0, threadname=“FileSeqThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c490 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x203f3030, entry=0xcf5ac8, arg=0x203f3030, prio=1002, stacksize=0xa000, flags=0x0, threadname=“pakDevFileSyncThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c490 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x2034c600, entry=0xce4048, arg=0x0, prio=1003, stacksize=0x4000, flags=0x0, threadname=“game contents hdd install”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c580 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200209b0, entry=0xcf5ac8, arg=0x200209b0, prio=1002, stacksize=0xa000, flags=0x0, threadname=“threadSeqSndAdx2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c350 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x2034ccb0, entry=0xcf5ac8, arg=0x2034ccb0, prio=999, stacksize=0xa000, flags=0x0, threadname=“threadExecuteSndAdx2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c350 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20c7c320, entry=0xcf8e40, arg=0x20c7c310, prio=800, stacksize=0x2800, flags=0x1, threadname=“CriManaDecodeThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c110 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x234ff190, entry=0xcf5ac8, arg=0x234ff190, prio=1002, stacksize=0xa000, flags=0x1, threadname=“UNLOCK Thread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c3c0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x234ff190, entry=0xcf5ac8, arg=0x234ff190, prio=1002, stacksize=0xa000, flags=0x0, threadname=“addContSyncThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c340 stack_addr=0xd0000000
(01-09-2017, 06:37 PM)ssshadow Wrote: [ -> ]
(01-09-2017, 06:17 PM)kd-11 Wrote: [ -> ]Interesting find. I wonder what the CPU disassembly around this instruction looks like; might explain the check failing.

I don't know enough to understand why that check is there, there is probably some kind of assumption but it doesn't seem right. The check is run right after creating a new thread, and look how many times it "fails", and yet the game runs... Maybe it is some kind of weird edge case or something, I might have a look later.

Quote:E {PPU[0x70000000] Thread (main_thread) [0x012a3704]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021da8, entry=0x12b939c, arg=0x20021080, prio=1000, stacksize=0x8000, flags=0x1, threadname=“gfdSpursSpursHdlr1”)
E {PPU[0x70000000] Thread (main_thread) [0x012a3704]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021da0, entry=0x12b92d4, arg=0x20021080, prio=1000, stacksize=0x4000, flags=0x1, threadname=“gfdSpursSpursHdlr0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20021060, entry=0xcf5ac8, arg=0x20021060, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200379d0, entry=0xcf5ac8, arg=0x200379d0, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200209d0, entry=0xcf5ac8, arg=0x200209d0, prio=1001, stacksize=0x19000, flags=0x0, threadname=“gfdJobQueueFiberWorker”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1146c68, entry=0xcf8e40, arg=0x1146c58, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x11632c0, entry=0xcf8e40, arg=0x11632b0, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS Memory File System”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x114ad50, entry=0xcf8e40, arg=0x114ad40, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 1”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x114ee38, entry=0xcf8e40, arg=0x114ee28, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1152f20, entry=0xcf8e40, arg=0x1152f10, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS File Access 3”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b890 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x1142a28, entry=0xcf8e40, arg=0x1142a18, prio=800, stacksize=0x2000, flags=0x1, threadname=“CRI FS Data Decompression 0”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034b9c0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x113e7a0, entry=0xcf8e40, arg=0x113e790, prio=800, stacksize=0x4000, flags=0x1, threadname=“CRI Server Manager”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034bac0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x203f3010, entry=0xcf5ac8, arg=0x203f3010, prio=1002, stacksize=0xa000, flags=0x0, threadname=“FileSeqThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c490 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x203f3030, entry=0xcf5ac8, arg=0x203f3030, prio=1002, stacksize=0xa000, flags=0x0, threadname=“pakDevFileSyncThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c490 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x2034c600, entry=0xce4048, arg=0x0, prio=1003, stacksize=0x4000, flags=0x0, threadname=“game contents hdd install”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c580 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x200209b0, entry=0xcf5ac8, arg=0x200209b0, prio=1002, stacksize=0xa000, flags=0x0, threadname=“threadSeqSndAdx2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c350 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x2034ccb0, entry=0xcf5ac8, arg=0x2034ccb0, prio=999, stacksize=0xa000, flags=0x0, threadname=“threadExecuteSndAdx2”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c350 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x20c7c320, entry=0xcf8e40, arg=0x20c7c310, prio=800, stacksize=0x2800, flags=0x1, threadname=“CriManaDecodeThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c110 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x234ff190, entry=0xcf5ac8, arg=0x234ff190, prio=1002, stacksize=0xa000, flags=0x1, threadname=“UNLOCK Thread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c3c0 stack_addr=0xd0000000
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} sysPrxForUser: sys_ppu_thread_create(thread_id=*0x234ff190, entry=0xcf5ac8, arg=0x234ff190, prio=1002, stacksize=0xa000, flags=0x0, threadname=“addContSyncThread”)
E {PPU[0x70000000] Thread (main_thread) [0x00b49400]} PPU: Fail, context.gpr[1] < context.stack_addr, gpr[1] = 0x2034c340 stack_addr=0xd0000000

Looking at ppu_thread, it seems that check should be removed, or at most just throw a pessimistic warning. I dont think the PPU has a requirement that r1 cannot be set to another target location by the calling thread before performing a push. The faulting addresses also seem to indicate that subsequent threads are all writing to some sequential memory location using a push and that does not seem random to me. Our implementation assumes that the stack frame shall not be changed by the application, but clearly this still happens and I'm guessing the real hardware doesn't care as long as we dont fault on access. This check ought to be moved to the page fault handler IMO and a guard page inserted to properly detect stack overflow, but CPU guys are better suited for this kind of task than I am. Unfortunately I have too much on my plate at the moment, otherwise this could've been a fun challenge.

By the way, an easier way to check for stack overflow without complicating design would be to check if r1 straddles the stack boundary instead of merely doing a check like this. Simplified:

if (old_r1 >= stack_addr && new_r1 < stack_addr) then except;
else
do the push;

This IMO is alot easier to implement than the full implementation idea I mentioned above.
This game had the same error and the same fix so it's pretty much confirmed: http://www.emunewz.net/forum/showthread....#pid239350
https://mega.nz/#!Z8E3gD4D!93BmOg__sUHzo...IzEVdQBylY

New hacked build that doesn't hang, and that can skip the new game video. Enjoy Persona 5 at 0,5 fps!
Pages: 1 2 3