Repository navigation
Silt ps5 (PPSA03306) on windows: boots and plays with four local changes” #2810
billythemenace2
started this conversation in
Game bring-up
Replies: 2 comments 2 replies
|
Could you share the relevant log output and specify which windows version you're using? It would also help to know whether the issue occurs consistently or only with a particular module. With those details, it may be easier to identify whether the problem is related to module loading, rendering, or a possible deadlock. |
2 replies
|
Windows version: Windows 11, build 10.0.26200. GPU is an AMD Radeon RX 5700 XT. Logs: the stall log with the full thread dump is attached as |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Status: boots, reaches the main menu, starts a new game and plays through several areas on Windows with four local changes, with sound. Open: no antialiasing (workaround) and one rendering artefact.
Setup
EP2520-PPSA03306_00-SIEESILTFULLGAME), version 01.003.000, master 01.00. Unity (IL2CPP), FMOD.ba2a0a31plus the attached patch (12 files), built with WinLibs GCC 15.2.0 r7 (x86_64-ucrt-posix-seh).Media/Modules/*.prxcopied intosce_module/,Media/Plugins/*.prxcopied intoprx/.relinker --windows --windows-diagnostics --registry eboot.elf app.exe, run withAPS5_IGNORE_MSAA=1(added by the patch).What works with the patch
GameSave.binis written.1. Multisampling
Unpatched, the first scene draw is rejected:
The scene target is 4x (2x once the saved settings load:
0x00108001), uncompressed:CB_COLOR_INFO 0x00040718,CB_COLOR_ATTRIB 0x00012000. Each frame ends the scene with a hardware resolve,CB_COLOR_CONTROL 0x00cc0030(mode 3), from color 0 to a single-sample color 1 that the bloom chain then samples.Local workaround, behind
APS5_IGNORE_MSAA: multisampled color and depth targets are decoded as single-sample surfaces at the same address, and the mode 3 draw becomesStorageTexture::CopyFromfrom the source image to the destination. No antialiasing, but the frame is otherwise complete.2. Modules the title loads by path
Unity loads
/app0/Media/Modules/PS5Util.prxandIl2CppUserAssemblies.prx(both needed by the executable) and its plugins under/app0/Media/Plugins/withsceKernelLoadStartModule. The relinker writes them underapp0/sce_moduleandapp0/prx, sodlopenfinds no<path>.guest.prx:On Windows a second image loaded from that path would also have no imports bound, since the entry stub binds them. Local change: Windows
dlopenfirst looks for an already loaded<file name>.guest.prxand returns that module.3. Plugin module_start arguments (Windows)
The entry stub calls DT_INIT of every guest module with
(0, NULL). Unity's PSN plugin needs the arguments Unity passes with its load request:Local change: for a module under
prx/that neither the executable nor another module depends on, the stub skips DT_INIT and DT_FINI, the guest image exports its DT_INIT, anddlopencalls it on the first load request with the pendingsceKernelLoadStartModulearguments.4. Stall while loading: deadlock between signal delivery and the guest mapping lock (Windows)
Before the change the title stalled while loading the first level or the next area (three runs). All file, texture and shader activity stops and Unity's watchdog prints, until the window is closed:
Thread dump taken with
APS5_HANG_DUMP_SECS(log attached; offsets are from the local build, names resolved withnm):Il2CppUserAssemblies+0xe2405a, the garbage collector stopping the world), waiting insceKernelWaitEventFlag: 29 delivered throughWaitingEntry, 2 throughRedirectedEntry.GuestArenaHandleWrite:libwinpthread-1.dll+0x453c).Reading: the worker was stopped while it held
WindowsMappings::mutex, so every later write fault waits for a thread that only the end of the collection resumes. This is the case TechnicalDebt already lists forsceKernelRaiseExceptionon Windows (a handler run where the thread was interrupted can deadlock on a lock of the emulator). That the three waiting threads are on this mutex is inferred; the dump has no deeper frames for them.Local change:
WindowsMappingsuses a lock that records its holder and waits by yielding, andRaiseOnresumes the target and retries while it holds that lock (30 s limit). After it: no stall in a run crossing several area loads. Other host locks have the same exposure and are not covered.5. Open: rendering
Smaller points
sceSysmoduleLoadModulelogs unknown ids 272 and 295.Attached:
anyps5-silt-bringup.patch,silt-run7-trimmed.log(the stall with the thread dump; the repeated watchdog lines are cut). Investigated and patched with AI assistance (Claude).anyps5-silt-bringup.patch
silt-run7-trimmed.log
All reactions