mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-07 13:39:55 +00:00
On macOS under Rosetta, Aps5StartGuest moves the main thread off the host stack and releases the old range to the guest arena. dyld keeps its own pointers into the process start block at the top of that range and offers no call that redirects them, where argv and environ have one: _NSGetExecutablePath copies the path string out of the block on every call, so the first call after the move read unmapped memory and the process died with KERN_PROTECTION_FAILURE. A title does not have to call it: libxpc reaches it from xpc_connection_resume, and ShaderCacheDirectory calls it for the shader disk cache. Release the old stack only up to the pages that hold the block, and only while argv still points into the stack. They are the top two pages, 8 KiB of the 8372224-byte stack here, so a title that fixes a mapping over that range now fails with a host region overlap; the rest is free as before. guest_main_stack_move asked for a 64 KiB guest mapping aligned down from a local of main, which falls inside the kept pages. It now probes the 64 KiB below them, requires the kept pages to be refused, and calls _NSGetExecutablePath after the move, which segfaults without this change.