mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-23 00:53:02 -05:00
Since guest threads get exactly the stack size they request, host code that a guest thread calls runs on that small stack too. sceAgcCreateShader reaches Driver::RegisterShader, whose frame alone is about 50 KiB, so a title whose job threads ask for 48 KiB overflows the stack (#2603). Each guest thread now gets a fixed 1 MiB of host stack below the range it asked for. The guest still sees the requested size and address range through scePthreadAttrGet and sceKernelIsStack; only host calls made from the thread use the extra room. Running the prepared-shader driver tests on a limited main-thread stack needs between 128 and 192 KiB for shader registration, Vulkan setup included, so 1 MiB leaves several times that. Switching to a separate host stack at each HLE entry point would need a trampoline on every export that may go deep, handling of stack-passed arguments and unwinding across the switch, and a list of which exports qualify. A margin below the guest range covers every host call with no per-export list. On Windows the committed size was the requested size, and the margin below it depended on the executable's default stack reserve; requests at or above that reserve had none. The commit now includes the same margin. macOS does not run guest threads. guest_pthread_stack now also calls host code that uses 256 KiB of stack below each thread's guest range; without the margin it crashes on the 16 KiB thread. Fixes #2603