Commit Graph
14017 Commits
Author SHA1 Message Date
Mouhand-Kaddo 4c7e823294 feat(opus): implement 48 kHz libSceOpusDec
Decode raw mono and stereo packets for missing system-library imports. Add behavioral tests and document unverified firmware semantics.
2026-10-09 19:24:56 +04:00
Mouhand-Kaddo d14f036122 feat(posix): implement gethostbyname
Resolve the missing EVO-PLAYER import reported in #1578. Convert native host entries into the guest ABI with owned per-thread storage, and use the SDK network error location for failures.
2026-10-09 19:24:55 +04:00
Mouhand-Kaddo e0b0d087cc test(posix): cover gethostbyname guest results
Check numeric address bytes, guest hostent fields, per-thread result lifetime, and the SDK resolver error location. The check currently fails to link because the reported export is missing.
2026-10-09 19:24:55 +04:00
klosixgaming-arch dd0d8cd425 fix(shader): work around Intel iGPU OpSMulExtended bug 2026-10-09 10:20:14 -05:00
Karan Vora 9996baaf41 perf(shader): pick f32 min, max and med3 results with fewer selects
EmitClassifyF32Bits found a NaN from the exponent and mantissa fields
separately. The magnitude settles it: a NaN is above 0x7f800000 and a
zero is 0.

min and max ended with two NaN selects. An ordered compare is false when
either operand is a NaN, so the ordered pick already returns rhs for a
NaN lhs; only the select that returns lhs for a NaN rhs, also when both
are NaNs, is needed.

med3 is the minimum of the three when any operand is a NaN and the
median otherwise. The median is used only without NaNs, so it is now
built from compares and the zero-sign rule alone, and the minimum reuses
the operands' NaN tests instead of classifying intermediate values.
2026-10-09 11:18:19 -04:00
Joey Fisher 24e33365f0 perf(agc): key sampled textures without the streaming-feedback fields
MIN_LOD_WARN, MIP_STATS_COUNTER_EN and MIP_STATS_COUNTER_ID are ignored by the texture decoder, but the cache
key held the raw T# words. A title that rotates the counter fields per use got a cache entry per variant of the
same texture, and the extra entries evicted live ones under the budget.
2026-10-09 09:14:22 -06:00
popcoder565andClaude Opus 5.5 3b0454dadf test(agc-driver): retire the unit shadow block's import before releasing it
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 10:59:12 -04:00
Josip Parlov 61684ce98f test(net): reset the closed peer with unread data so the send fails at once 2026-10-09 16:53:26 +02:00
AlexandClaude Opus 5.5 270f375c82 fix(agc): skip prim state preparation for a patch/hull mismatch
sceAgcCreatePrimState only packs registers, but it now also resolves the
graphics ABI ahead of time, and that resolve throws when the primitive
type is a patch list without HS_EN or a hull stage with another type.
No draw can use such a state, so leave it to draw time and return the
registers. Bit 2 of VGT_SHADER_STAGES_EN is HS_EN, not an NGG bit.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 16:49:28 +02:00
Pedro a1efdab629 fix(videoout): cancel flips on a port the title closed instead of failing the driver
A flip still queued or in presentation when the title closes its port is discarded, as on hardware, rather than stored as a driver failure. A closed port no longer terminates the presentation thread nor surfaces from Shutdown. The lifetime test now expects cancellation and the reopen mode is registered in ctest.
2026-10-09 09:42:53 -05:00
Pedro 59c98bde58 test(videoout): limit the flip tests to the 30 second contribution timeout 2026-10-09 09:40:45 -05:00
Karan Vora 3a2494e533 perf(shader): choose the fma NaN result only when the result is NaN
#2083 chooses the NaN result of the f32 fma family on the bits: the first
NaN source, quieted in IEEE mode, with the addend skipped when the
product is infinity times zero, and 0xffc00000 otherwise. The selection
and the infinity-times-zero test ran for every fma, but a NaN source
always gives a NaN result, so for any other result they return it
unchanged.

FPNanResultFma32 carries the result and the three sources, with the IEEE
mode as a flag. The SPIR-V emitter makes the selection, including the
infinity-times-zero test, in a branch taken only for a NaN result, and
the SRT evaluator computes it exactly. Add, sub and mul keep the inline
selects: with two sources a branch costs more than it saves.
2026-10-09 10:27:36 -04:00
eljackjoestar-cmd 4dc29440d5 fix(rtc): validate ticks before timezone conversion 2026-10-09 18:20:55 +04:00
eljackjoestar-cmd d31100a0f2 fix(agc): release shader modules after pipeline creation 2026-10-09 18:19:43 +04:00
AndreasandClaude Opus 5.5 69063dc1ef fix(libkernel): initialize guest rwlocks before they are shared
winpthreads initializes a PTHREAD_RWLOCK_INITIALIZER lock on its first
use and fails a concurrent first lock with EINVAL. std::shared_timed_mutex
ignores that result in release builds, so two guest threads could both
hold a fresh guest rwlock.

Lock and unlock the mutex once when the guest rwlock is created, before
another thread can reach it, and record the remaining host exposure.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 16:13:41 +02:00
xXPBSXxandClaude Sonnet 5.5 0ccfbe46a5 docs(build): note antivirus quarantine of relinker test executables on Windows
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 15:56:29 +02:00
Tomás Ortellado a213a26b47 fix(relinker): validate ELF identification before parsing 2026-10-09 10:44:31 -03:00
Achraf ReyaniandClaude Opus 5.5 275163277b fix(libkernel): return EPERM when unlinking a directory
FreeBSD's unlink(2) reports EPERM for a directory, but the host call
returns EACCES on Windows and EISDIR on Linux, so the guest saw a
different error on each host. Check for a directory, not following a
symbolic link, before unlinking.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 22:39:50 +09:00
Tomás Ortellado a406ad4df7 fix(relinker): keep input checks compatible with module discovery 2026-10-09 10:38:17 -03:00
JohnMandClaude Opus 5.5 c1b4eb2001 fix(tools): exit 2 when import_audit cannot read an input or write --json
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 21:35:49 +08:00
Tomás Ortellado ec5a2019b2 fix(relinker): reject truncated EH frame headers 2026-10-09 10:24:04 -03:00
Jan ŠléglandClaude Fable 5.1 1078608783 feat(libkernel): implement munlock beside mlock
sceKernelMunlock and the POSIX munlock unlock the page-rounded range with
FreeBSD's results: 0 for a mapped range whether or not it is locked, EINVAL
for a range that wraps around zero, ENOMEM for an unmapped range. On Linux
the host munlock gives them. On Windows a reserved placeholder counts as
mapped only while the guest reservation or protection registry covers it,
and a region VirtualUnlock refuses as not fully locked is unlocked page by
page, as VirtualUnlock is all-or-nothing. sceKernelMlock shares the range
rounding.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_012GLfKH7Sqe51wX254k1XsV
2026-10-09 15:14:57 +02:00
PrintOrb cf744a3740 fix(tools): preserve UTF-8 in progress comparisons 2026-10-09 08:10:27 -05:00
Tomás Ortellado 682d6f62a3 fix(relinker): reject overflowing signed unwind LEB128 values 2026-10-09 10:05:26 -03:00
meiz 15a877892b Merge branch 'boykopovar:main' into claude/agc-fail-flips-before-report 2026-10-09 16:03:13 +03:00
Celegans12 8426cab241 perf(agc): keep sampled textures that are bound or used this frame
The sampled texture cache let go of its least recently used entry even
when a build, a recorded batch or a cached resource set still held that
texture, which frees no memory and makes the next lookup create a
second copy. A frame that samples more textures than the cache holds
also missed on all of them every frame.

Eviction passes over an entry whose texture is held elsewhere, or a
view of a cached storage image, up to a quarter over the budget, and
rescans for released textures about once a second. While the least
recently used entry was used in this frame or the previous one, a
texture's first use in the frame is returned uncached and only a second
use evicts, so the next frame finds the cached textures again, even
after an early miss; a new set replaces the old one on its second
frame. APS5_PROFILE_DRAW prints the cache's counts every 10 s.
2026-10-09 14:58:27 +02:00
Celegans12 28345b0eac perf(agc): pool device staging buffers by size class
The device-local tier of BufferPool only reused a buffer of the exact
size and usage it was asked for. Partial storage-image detiles and
retiles ask for a new size and the other transfer direction almost
every time, so the tier sat at its budget and missed and evicted
dozens of buffers per frame, and the vkFreeMemory calls on the release
thread held up submits and allocations on the recording threads.

Device-tier requests of 1 MiB and more now round up to an eighth of
their octave, the tier's buffers are created for storage and both
transfer directions, and a request takes the smallest retained buffer
from its own class up to twice its size. Host tiers, the budget and
eviction are unchanged. agc_buffer_pool covers the classes, the fit
and its bound, reuse only after release, the budget and the unchanged
lists.
2026-10-09 14:58:21 +02:00
Celegans12 4709920641 fix(agc): throw instead of aborting when a heap mirror cannot be made
An address-based build whose heap mirror the device refused, or one past
APS5_HEAP_MIRROR_MIB, stopped the process inside acquireMirror. PPSA26344
hit it at 478 s with 6.8 GiB of heap mirrors beside the host imports.

- a mirror that would go past the budget first sweeps the mirrors whose
  registered range is gone, before its allocation; if it still does not
  fit, the build throws "past the budget"
- the mirror is allocated once: a refusal throws with the range, the
  Vulkan result and the mirror totals, so the draw or dispatch fails like
  any other allocation; nothing is registered for the refused range
- the BDA resource tests run with a 4 MiB mirror budget and a mock memory
  limit: a mirror past the budget is made in the swept mirror's memory,
  and a refused one fails after a single allocation attempt
2026-10-09 14:58:20 +02:00
Celegans12 5623c0e937 perf(shader): share the BDA dword span read between read sites
Every BDA dword read site still emitted in the entry function the add
of its first dword address with the overflow fault, a probe_bda_pointer
call, the wide loads, and one read_bda_dword_bytes call per extracted
dword. NVIDIA's pipeline compile time grows with every call left in the
entry function, so large compute programs with a few hundred such reads
spend 47-77 s in vkCreateComputePipelines.

A read site is now one call to a DontInline read_bda_span function, in
a stop and a coherent variant, taking the address, the immediate offset,
the mask of extracted dwords and the pc, which does the same steps in
the same order. Fault reasons, addresses, pcs, Volatile, the stop
behaviour and the APS5_BDA_BYTE_READS path are unchanged.
2026-10-09 14:58:19 +02:00
Celegans12 3f00dc7841 perf(agc): release a heap mirror once a host import serves its range
An address-based build maps every readable registered range: through a
host import when one can be made, else through a heap mirror, a
host-visible copy of the range. A range mirrored while the import budget
was full kept its mirror after a later pass imported it, until the guest
freed the range. The pass then read the range through the import, and the
mirror only held host-visible memory and a second copy of the bytes.

The pass now releases the heap mirror of every range it serves through
an import. Recorded work that bound the mirror keeps it until it
completes. If the import goes away while the range stays registered, the
next pass makes a new mirror from the guest bytes. The [buffers] image
mirrors profile line counts the released mirrors.
2026-10-09 14:58:17 +02:00
Celegans12 e804ce85f7 perf(agc): skip unchanged heap mirror runs and idle mirror sweeps in address-based builds
A build served by the cached address space walked every region of the
space for its mirrors, sorted the heap mirrors, compared each heap
mirror's blocks with the write tracker under its own lock and swept the
whole mirror registry. In an offline replay with 37,000 heap mirrors
that took about 10 ms per build, every build.

The space now keeps its writable mirrors, its sorted heap mirrors and
their adjacent runs from when it is published. Each run is still
flushed and collected; a run with no block stamped since the generation
its last complete check collected skips the per-mirror compare, and that
generation is stored only once the build's blocks were copied. The
registry sweep is skipped while every live mirror's range is held by the
cached address space's lease and no mirror was added, replaced or
dropped since.
2026-10-09 14:58:16 +02:00
Tomás Ortellado dc9c75b576 fix(relinker): protect executable inputs from output overwrites 2026-10-09 09:50:16 -03:00
Raihan Abdul MajidandClaude Opus 5.5 1680962763 test(libs): report patched libraries that fail to load instead of a loader dialog
LoadLibraryEx with an unresolved import shows the loader's "Entry Point
Not Found" message box unless SEM_FAILCRITICALERRORS is set, so
patched_libraries waited on the dialog until ctest's timeout instead of
printing the failing libraries. Set it at start, as GuestHeapRounding does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 19:49:57 +07:00
Jan ŠléglandClaude Fable 5.1 892aa8b5ee feat(libkernel): implement mlock
The POSIX form of sceKernelMlock: 0 on success, -1 with errno (EINVAL,
ENOMEM, EPERM, EAGAIN) where the sce form returns the kernel error, as
munmap and mprotect do beside it.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-09 14:47:29 +02:00
AndreasandClaude Opus 5.5 ba5256333d fix(relinker): root code addresses taken by RIP-relative LEA
Functions referenced only through a REX.W RIP-relative LEA (constructors,
callbacks, thread entries called indirectly) were not reached by code
analysis, so their guest TLS accesses stayed unpatched on Windows.

Add LEA targets inside executable code as roots, both in the instruction
walk and when following the control-flow graph of unreached code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 14:45:29 +02:00
Jan ŠléglandClaude Fable 5.1 db7666b22c fix(tools): count only definitions as exports in the overlap report
pr_overlap.py took every added line with APS5_VABI before a name and a
parenthesis as an export, so a declaration such as
extern "C" int* APS5_VABI __error_nid_postfix(); made each pull request
that adds it "implement the same function" as all the others. A line
that ends in a semicolon is a declaration and is skipped; every
definition's first line in the tree ends in a brace, a parenthesis or
a comma.

Registers pr_overlap_exports.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-09 14:43:32 +02:00
AndreasandClaude Opus 5.5 24474e3d28 fix(libkernel): unmap direct memory views when the memory is released
Releasing direct memory left the virtual ranges that mapped it registered,
so sceKernelVirtualQuery reported them as flexible memory at offset 0 and
titles walking a range with FIND_NEXT released physical page 0.

Collect every view of the released pages before freeing them and unmap
them through UnmapRegistered, as shadPS4's MemoryManager::Free does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 14:42:17 +02:00
mugurc f3c514744b feat(nid): patch NIDs in Mach-O libraries
nid_patcher turns the _nid_postfix names of a library into NIDs for ELF
and PE. A library built on macOS is a Mach-O dylib, whose exports are in
a dyld export trie and whose imports are in the chained fixups, so it
gets its own patcher.

- The export trie is read, every exported C name (without Mach-O's
  leading underscore) is resolved to its NID, and the trie is rebuilt the
  way ld64 lays it out: the offsets are uleb128, so the layout is repeated
  until it is stable. A trie that no longer fits is appended to
  __LINKEDIT, which has to end the file, and a signed image is refused.
- Weak definitions that are not marked _nid_postfix or _nid_no_patch keep
  their names: dyld coalesces those across images by name.
- In the chained imports, names bound to a .prx dylib that are guest
  facing (a _nid_postfix name or an sce prefix) are patched in place; a
  name that would grow, or that shares storage with another import, is an
  error. Images that use bind opcodes instead of chained fixups are
  refused.
- ExportExclusions reads the exports of a reference Mach-O, so the
  exclusion list works for libraries built on macOS as well.
2026-10-09 15:40:29 +03:00
LuisBiceps 50ee20c7fc Merge remote-tracking branch 'upstream/main' into feat/system-service-web-browser-unavailable 2026-10-09 20:40:00 +08:00
EdouardSenceandClaude Opus 5.5 52b77c2022 fix(agc): defer shaders that cannot be prepared at registration to their first use
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 14:26:30 +02:00
Ramzi 115a8b050a test(relinker): launch the GUI startup fixtures without Windows Error Reporting
The GUI missing-symbol and missing-module fixtures were started with
ShellExecuteExW. A process the shell starts gets the default error mode,
so the status the entry stub raises reaches Windows Error Reporting as an
APPCRASH. Collecting each report took about 2 s, sometimes over 10 s,
and under a parallel ctest run it could pass the 30 s wait, failing
windows_import_modules with "ShellExecuteExW child did not exit" while
WerFault still held the fixture's files.

The fixtures now start through CreateProcessW with STARTF_USESTDHANDLES
and no standard handles, so the stub's diagnostic still has nowhere to
write, and with the test's error mode, which keeps the report away.
2026-10-09 13:24:01 +01:00
Eshaan Jaiswal 98b449f655 fix(relinker): allow empty relocation tables 2026-10-09 17:52:07 +05:30
Arvind FrøilandandClaude Opus 5.5 f4084d5653 feat(libSceNpManager): answer sceNpCheckNpAvailability with no user signed in
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 21:13:56 +09:00
don 1c71428f82 fix(agc): restore the standalone visual demo 2026-10-09 14:12:24 +02:00
Arvind FrøilandandClaude Opus 5.5 eb1d558fe9 feat(share): answer sceShareSetContentParamForApplicationTitle
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 21:02:01 +09:00
Eshaan Jaiswal efe54ad6cb fix(relinker): validate relative relocation table bounds 2026-10-09 17:31:29 +05:30
Pedro 2663699dc5 test(videoout): skip flip tests without a Vulkan window and create param.json
The offscreen SDL driver cannot create a Vulkan window on Windows since
the VideoOut window uses SDL_WINDOW_VULKAN, so the tests that open a port
now exit 77 (skipped) like the other display tests, unless
ANYPS5_REQUIRE_DISPLAY is set. The tests also write app0/sce_sys/param.json,
which AppMetadata now requires.
2026-10-09 06:56:43 -05:00
eliasbruno124-dev 98c47df9e5 fix(relinker): discover required guest module identities 2026-10-09 13:53:48 +02:00
Pedro 3e01e740e4 test(videoout): drop video_out_flip_tests from KNOWN_UNRUN now that ctest runs it 2026-10-09 06:53:27 -05:00
PedroandClaude Sonnet 5.5 64b97c8981 test(videoout): prepend libc dir to PATH for video_out_flip tests on Windows
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 06:53:27 -05:00