Commit Graph
14017 Commits
Author SHA1 Message Date
Nicolas FalesyandClaude Opus 5.5 1ffffc318d feat(libkernel): export nmount
Prospero Themes (PPSA90210) imports nmount (3YnXspQNyw8) from libkernel
and fails to load without it:
"./app.elf: symbol lookup error: ./app.elf: undefined symbol: 3YnXspQNyw8".

Mounting file systems is not supported, so it throws if called, like
execvp does for executable replacement. The title opens its theme
library without calling it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Sovthwyu4H63RMbRVha2Sy
2026-10-17 14:08:53 -04:00
Adrià FranchandClaude e572635506 ci(build): run test jobs only for the parts of build.yml a change touches
A change to build.yml ran the relinker, register-context and write-watch jobs whatever it touched. The patch's lines are now mapped to the job sections of the workflow at the head, and a test job runs only if its own section, the eligibility job or the shared part outside jobs changed; without a patch every job runs as before.

Co-Authored-By: Claude <[email protected]>
2026-10-17 20:08:51 +02:00
JJenkx b17406a33a fix(ngs2): return PS5 errors for invalid voice handles 2026-10-17 14:07:44 -04:00
Nicolas FalesyandClaude Opus 5.5 05b457d49a feat(libkernel): implement pthread_condattr_setpshared
PSFlyCast (PPSA99247) imports pthread_condattr_setpshared (3BpP850hBT4)
from libkernel and fails to load without it:
"./app.elf: symbol lookup error: ./app.elf: undefined symbol: 3BpP850hBT4".

The attribute stores PTHREAD_PROCESS_PRIVATE (0) or
PTHREAD_PROCESS_SHARED (1); a null or uninitialized attribute and any
other value return EINVAL without changing it, following FreeBSD 11
libthr thr_condattr.c and pthread_mutexattr_setpshared here. Sharing
across processes is not modeled, as for mutexes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Sovthwyu4H63RMbRVha2Sy
2026-10-17 14:06:11 -04:00
hugodearaujo 52c4589f83 test(agc): check the unaligned import's lead only for a dma-buf import
A device that imports shared memory through host pointers, such as lavapipe, imports the unaligned range that way, and a host-pointer import has no lead.
2026-10-17 15:03:33 -03:00
hugodearaujo 9eb7e2444f fix(agc): publish unit shadows at an import's lead
A unit shadow published its units into the import's buffer at the guest offset from the import's
base, without the import's lead, so a sparse import that starts below its range (HostImport::lead)
got the units lead bytes before their place. The shadow keeps the lead with the import's base and
buffer, and the shadow verify reads the guest bytes at the same place.

agc_driver_sparse_dma_buf_import publishes a unit shadow of its unaligned import and checks the
unit's guest bytes and the bytes around it; without the lead it fails there.
2026-10-17 15:03:33 -03:00
hugodearaujo ef622e2f8f feat(agc): import shared ranges whose backing offset is not 64 KiB aligned
A sparse import binds whole 64 KiB blocks, so a range whose memfd offset
is not a multiple of 64 KiB fell back to one UDMABUF_CREATE and, above
udmabuf's size limit, to copies. The sparse buffer now starts at the
block below the range: HostImport::lead holds that distance, the
import's device address points at the range itself, and every offset
into the import's buffer goes through HostImportOffset.
2026-10-17 15:03:33 -03:00
Adrià e1041f6a57 Merge pull request #7222 from adriadam10/ci/windows-ccache-dispatch
ci(build): save the Windows ccache from merge queue builds
2026-10-17 20:03:03 +02:00
Adrià 07b4651142 Merge pull request #6104 from fma-rc/fix/libc-host-libstdcxx-exceptions
fix(libc): catch exceptions that libstdc++ throws inside the prx libraries on Linux
2026-10-17 19:59:41 +02:00
jagrat Singh 586028c991 feat(libSceVoice): implement sceVoiceGetResourceInfo 2026-10-17 23:26:26 +05:30
Adrià FranchandClaude 4cfb85482a ci(build): save the Windows ccache from merge queue builds
Queue builds are workflow_dispatch runs on main and never saved their ccache,
so each one restored the last push build's entry and recompiled everything the
queued PRs and the merges since then touched (32 min vs 6 min warm). They now
save under their own prefix, restore it first and fall back to the push
entries; push builds still restore only push entries, so main never starts
from a tree that held unmerged PRs.

Co-Authored-By: Claude <[email protected]>
2026-10-17 19:54:25 +02:00
MarcZX100 a2ed4abead docs(dev): clarify guest clock scale coverage 2026-10-17 17:50:36 +00:00
MarcZX100 c732321bd3 docs(dev): describe the guest clock scale switch 2026-10-17 17:50:36 +00:00
ArjenS-LA 0eb94a28cd fix(tools): preserve registry validation when integrating main 2026-10-17 10:44:01 -07:00
AlxcBTW 5da6de62ad fix(agc): count stage-A drops of a dispatch move as refusals
The [dispmove] line printed refused 0 next to a rebuild count that came mostly from PrepareDispatch dropping the hit. The line now reports the refusals at stage A and at record separately, each with its reasons.
2026-10-17 19:32:05 +02:00
Jota 9626d006bf fix(tests): give the large cache file test its own temporary directory 2026-10-17 14:22:48 -03:00
Gjon Gojcevic 88642b874f fix(shader): declare the 64-bit integer type only for programs with BDA anchors
EmitBdaAnchors declared the u64 type before checking for anchors, so every
program got a 64-bit integer type, and programs without the Int64 capability
failed SPIR-V validation. It now returns before declaring anything when the
program has no anchors. A compute program without BDA reads is checked to
declare no 64-bit integer type and no Int64 capability.

AI-assisted: yes
2026-10-17 13:05:25 -04:00
milescovielloandClaude Opus 5.5 227d1e44a1 perf(shader): fold a select nested in a select on the same condition
select(c, a, select(c, b, d)) is select(c, a, d), and
select(c, select(c, a, b), d) is select(c, a, d). The recompiler leaves
these behind when a register is written more than once under the same
lane mask and when the f32 NaN selection tests the same source twice,
and nothing folded them. The constant folder now takes the inner arm
the outer condition already decides, then folds a select whose arms
became equal.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 17:03:09 +00:00
thuanquangandClaude Opus 5.5 20502c0022 feat(agc): render 5_6_5 UNORM color targets
Goosebumps Terror in Little Creek (PPSA27305) aborts in gameplay with
"unsupported color format 16 number type 0 component swap 2": it renders
into a COLOR_5_6_5 UNORM target. The target now renders into
R5G6B5_UNORM_PACK16. AMD keeps X in bits 0-4 and Z in bits 11-15, and
Mesa's ac_translate_colorswap programs SWAP_STD_REV for a surface with
red in bits 11-15, so with SWAP_STD_REV the exports are written as they
are and with SWAP_STD they are written with X and Z exchanged, as for
1_5_5_5. The alternate swaps and other number types keep throwing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 23:59:26 +07:00
Dextroid17 9d12efa1c6 test(libkernel): stagger the leaving-thread raise by the clock, not by yields 2026-10-17 12:53:05 -04:00
SandstromPLandClaude Opus 5.5 3dadf77121 fix(agc): draw a one-sample depth target under a multisampled rasterizer without MSAA_ENABLE as one sample
With #6014 merged, the first draw of METAL GEAR SOLID: Peace Walker's
(PPSA18216) opening movie stops on "the depth target's sample count
differs from the rasterizer's" (mrfelek on #6196). The state he reported
is a 4x PA_SC_AA_CONFIG, MSAA_ENABLE clear, a one-sample 1440x810 depth
target and no color target; on main alone it throws earlier, on "a depth
target". Like the one-sample color targets of bb877791a, such
a depth target, with or without one-sample color targets, is now drawn
as a one-sample draw at the pixel center, before the multisampled-target
check and instead of the sample-0 path, which needs MSAA_ENABLE.

Points, lines, alpha-to-coverage, a sample-mask export and DB_EQAA Z
interpolation or overrasterization throw on this path, and so do
PS_ITER_SAMPLE and ANCILLARY or SAMPLE_COVERAGE pixel inputs when the
pixel program runs. A skipped pixel program is replaced by the null
program, which uses neither.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:18:56 +05:30
simonbronk f0d68fb436 fix(libc): reject null secure scan destinations
Prevent reached null conversion destinations from crashing sscanf_s and vsscanf_s. Return EOF before writes and retain earlier assignments. Add regression coverage through both guest ABI entry points.

AI-assisted: yes (OpenAI Codex). Windows WinLibs GCC 15.2 Release: production baseline crashes with the new regression; fixed shared libc passes guest_scan_count, guest_formatting, guest_wide_formatting and guest_strings (4/4). Conventions pass. Full all-target build was deliberately stopped after 83s with 3691 pending targets, not completed. No title or console run; constraint-handler invocation remains unimplemented as documented. No performance or coverage-percentage claim.
2026-10-17 18:46:36 +02:00
unknown 7c71fc603a fix(libSceHttp): make URI escaping independent of host locale 2026-10-17 18:46:12 +02:00
alosta 14db22d458 test(libSceRudp): add GuestRudpContextLifecycle behavioral tests
Adds tests for nine implemented libSceRudp functions that previously
lacked coverage:

- sceRudpActivate (returns 0 always)
- sceRudpEnableInternalIOThread (NOT_INITIALIZED before init, 0 after)
- sceRudpSetEventHandler (returns 0)
- sceRudpBind (NOT_INITIALIZED, INVALID_CONTEXT_ID, 0 on success)
- sceRudpSetOption (NOT_INITIALIZED, INVALID_CONTEXT_ID, 0 on success)
- sceRudpInitiate (NOT_INITIALIZED, INVALID_CONTEXT_ID, CONN_REFUSED)
- sceRudpGetContextStatus (NOT_INITIALIZED, INVALID_CONTEXT_ID, fills
  status with 0, null status allowed)
- sceRudpWrite (NOT_INITIALIZED, INVALID_CONTEXT_ID, CONN_RESET)
- sceRudpRead (NOT_INITIALIZED, INVALID_CONTEXT_ID, CONN_RESET)

Each assertion mirrors the exact implementation in Export.cpp. Error
codes and return values are the constants hardcoded in the source.
No console measurement needed — these are pure offline behaviors.

AI-assisted: yes
2026-10-17 17:35:07 +01:00
milescovielloandClaude Opus 5.5 6e0886d76d perf(shader): drop the result flush of a product behind its tiny-product check
A v_mul_f32 in a FLOAT_MODE that flushes f32 denormals emits the
nearest-even tininess check, the NaN result selection and then a
result flush. The check already turns every product that rounds below
2^-126 into a zero of its sign, so the flush can't change what it
keeps. DenormalFlushEliminator now proves that: a select arm guarded
by the tiny-product check of the same denormal-free factors, an arm a
select takes only when its own bits are NaN, and an and with a mask
that has no significand bits are denormal-free.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 16:34:08 +00:00
MarcZX100 d71a1c5775 fix(libkernel): accept fractional nanosecond kevent periods 2026-10-17 16:28:55 +00:00
Muhammad Wasif Ali WasifandClaude Opus 5.5 521a68ad9e ci(build): build the pull requests in the register context and write watch jobs
Both jobs checked out without a ref, so a dispatched build compiled and
tested main instead of the selected pull requests, although the gate
starts them because a pull request touched their files. They now check
out the gate's main commit and merge the pull requests with the same
step as the relinker, Linux and Windows jobs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 21:25:39 +05:00
Muhammad Wasif Ali WasifandClaude Opus 5.5 78cabf5dcd fix(libc): keep a drive-letter component of a guest path under its mount on Windows
A guest path is resolved by appending its components to the host root or
to a mount alias directory through std::filesystem::path. On Windows a
component such as "C:" that came first in the appended part was parsed as
a root name, so operator/ replaced the host directory instead of
appending: "/savedata0/C:/Windows/win.ini" and "/app0/../C:/Windows/win.ini"
resolved to "C:\Windows\win.ini", and "/C:/x" lost the component and
resolved to "<root>\x". A colon is an ordinary character in a FreeBSD
file name, so those names belong under the mount.

Guest paths are now split into component names and joined to the host
directory as text. Explicit native drive paths are still passed through.
On NTFS a name containing ":" still opens an alternate data stream; the
libc debt list now records it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 21:22:08 +05:00
MarcZX100 28eaa5bdad fix(libkernel): preserve extended paths in stat metadata 2026-10-17 16:15:54 +00:00
MarcZX100 c0a6caeed3 test(libkernel): preserve directory stat on long paths 2026-10-17 16:15:54 +00:00
MarcZX100 2644234a24 test(libkernel): keep missing long stat paths as ENOENT 2026-10-17 16:15:54 +00:00
MarcZX100 ee5ff02e7a fix(libkernel): stat files under long Windows paths 2026-10-17 16:15:54 +00:00
Romans Pokrovskis cf84fc44a8 fix(libc): preserve existing Windows path namespaces 2026-10-17 19:13:32 +03:00
Romans Pokrovskis fd8a008277 test(libc): cover an existing Windows path namespace 2026-10-17 19:13:02 +03:00
hossiendehghan989 b4786ad4bc fix(input): avoid pad wheel bindings while title reads mouse 2026-10-17 16:11:42 +00:00
ThatsLeo e14a4e5138 fix(shader): stop first-lane reads that reach themselves from recursing
MayEvaluate and the evaluator track the first-lane reads they are inside, so a read reached again through a loop-carried phi or a constant slot is not evaluable instead of recursing.
2026-10-17 18:11:28 +02:00
Ondra97 8e1f06b511 test(ci): report eligibility harness progress on timeout 2026-10-17 18:08:19 +02:00
Ondra97 3bf3253650 fix(libc): replace Windows directories without pre-deleting targets 2026-10-17 18:08:19 +02:00
Ondra97 de2e12148e fix(libkernel): share guest rename semantics with sceKernelRename 2026-10-17 18:08:19 +02:00
Ondra97 57f353df3e fix(libkernel): preserve semaphore wakeups across cancellation 2026-10-17 18:06:21 +02:00
ThatsLeo 745cdb5bf7 perf(shader): judge first-lane and constant reads by what they read
MayEvaluate took ReadFirstLane and ReadConst as evaluable without looking at
their sources, so plans kept conditions behind per-lane values.
2026-10-17 18:03:33 +02:00
Romans Pokrovskis a44455b740 test(libc): keep relative long-path fixture on one drive 2026-10-17 18:58:08 +03:00
Romans Pokrovskis e61af865de fix(libc): open long Windows host paths 2026-10-17 18:53:10 +03:00
Dean 66702f1cff Merge pull request #7060 from Aryansh1520/fix/libc-backtrace-self-linux
feat(libc): implement sceLibcBacktraceSelf and GetBufferSize on Linux
2026-10-18 04:49:45 +13:00
Dean 7b763e6359 Merge pull request #7068 from AlexOfTheForest/fix/fopen-errno
fix(libc): translate host errno from fopen, freopen and fopen_s
2026-10-18 04:49:08 +13:00
Dean 13d07428a1 Merge pull request #7035 from milescoviello/fix/timed-locks-null-deadline
fix(libkernel): treat a null deadline as an untimed lock in the timed pthread locks
2026-10-18 04:48:21 +13:00
Dean 48b2de5ba4 Merge pull request #7170 from MrMha/fix/web-output-parent-conflicts-20261017
fix: reject file and directory conflicts in browser output
2026-10-18 04:47:46 +13:00
Dean e0d1f1b2f8 Merge pull request #7114 from pushkarreddyy/fix/libkernel-rename-null-efault
fix(libkernel): return EFAULT from truncate, utimes, mkdir, rmdir, and rename for a null path
2026-10-18 04:46:58 +13:00
XairRrR ac840ec7dd fix(agc): take a later slice's HTILE clear when every word has ZMask 0
A bind of slice 1 or later of a depth array read the slice's HTILE but took
its clear only when all its words were equal, because the HTILE word layout
of those slices is not modelled. Neither step needs the layout: the clear
is taken when every word of the range has ZMask 0 (a check over the set of
words), and the store-back rewrites each word in place from its own bits.
The value the surface is cleared to is DB_DEPTH_CLEAR, which the DB's depth
test reads for every cleared tile whatever its Min/Max Z (HTILE_Z_CLEAR_REG
in Mesa's src/amd/common/ac_descriptors.h), the same rule slice 0 already
follows.

PPSA05684 resets the four slices of its 2048x2048 D16 sun cascade array
every frame by writing ZMask 0 words with Min/Max Z 0 or 1 into their HTILE.
Slices 1 to 3 kept the previous frame's depth, and the main menu lost its
volumetric sun shafts and sunlit foliage.

agc_driver_depth_fast_clear_submit: slice 1 with words alternating 0x0 and
0xfffffff0 takes the clear, stores them back expanded and leaves slice 0's
HTILE alone. The refusal case keeps a word left expanded and is renamed.

AI-assisted: yes
2026-10-17 17:40:57 +02:00
milescovielloandClaude Opus 5.5 77bf326d51 test(agc): skip the multisampled target test without storage image multisampling
agc_driver_sample_multisample_target draws into a 4x target and reads
its samples back through a multisampled storage image. On a device
without shaderStorageImageMultisample, such as an Intel Arrow Lake iGPU
on ANV, the recompiler refuses that shader ('storage image multisampling
is unavailable on the target device') and the test failed. It now
skips there, as the recorder's storage multisample checks already do.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 15:39:18 +00:00