Commit Graph
5577 Commits
Author SHA1 Message Date
Adrià e82e03f11e Merge pull request #1093 from kjhq/fix/libkernel-sync-access-denied
fix(libkernel): flush only the paths the guest changed in sceKernelSync on Windows
2026-10-08 10:58:55 +02:00
Claude 3ed954fb90 feat(libSceHttp): accept the SSL version, SSL error and redirect and cookie callback calls
No request reaches the network, so sceHttpsSetSslVersion has no TLS
connection to configure, sceHttpSetRedirectCallback and
sceHttpSetCookieRecvCallback register callbacks that are never called,
and sceHttpsGetSslError reports error 0 with detail 0. A null errNum or
detail returns SCE_HTTP_ERROR_INVALID_VALUE like sceHttpGetLastErrno.
Signatures follow shadPS4.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 10:57:14 +02:00
Adrià 5d42b82c6d Merge pull request #1213 from krishnaraya4/fix/agc-buffer-int64-atomics-check
fix(agc): refuse 64-bit buffer atomics on devices without shaderBufferInt64Atomics
2026-10-08 10:56:35 +02:00
Aryan Sharma d77bc7c363 fix(libkernel): return EBUSY when destroying a locked mutex
scePthreadMutexDestroy threw when the mutex was locked. FreeBSD libthr,
which the console's libkernel follows, returns EBUSY and leaves the
mutex usable; PPSA28997 destroys a locked mutex during its intro and
was aborted.
2026-10-08 14:25:16 +05:30
clem-gbandClaude Opus 5.5 7406c975d2 fix(libkernel): release every level of a recursive mutex during a cond wait
A condition wait on a recursive mutex locked more than once unlocked the
native mutex only once, so the thread that should signal blocked forever
on it. Unlock the remaining levels before the wait and lock them again
after it, as FreeBSD libthr does in _mutex_cv_unlock and _mutex_cv_lock.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HeC9bA3n74TzJRYv9AgBE8
2026-10-08 10:53:58 +02:00
Adrià 175472699e Merge pull request #1185 from krishnaraya4/fix/agc-compute-subgroup-default-32
fix(agc): require 32-wide compute subgroups on devices whose default is 32
2026-10-08 10:53:33 +02:00
Adrià 0703d818d0 Merge pull request #1194 from ASVLCII/fix/relinker-input-validation-20261007
fix(relinker): reject incomplete RELA entries
2026-10-08 10:49:19 +02:00
clem-gbandClaude Opus 5.5 15c1962e82 fix(libkernel): keep ymm upper halves across a redirected raise
A thread that sceKernelRaiseException redirects resumes through
RtlRestoreContext with a CONTEXT that has no XSTATE, so the upper halves
of ymm0-ymm15 came back as the handler and the delivery path left them.
A handler or host routine that runs vzeroupper or any VEX instruction
(Zen 2 guest code, the CRT's memcpy) cleared the upper lanes of a thread
interrupted in the middle of AVX code. The entry stub now stores
ymm0-ymm15 next to the delivery when the CPU and the OS enable AVX, and
the exit loads them back right before RtlRestoreContext, which restores
only the low halves.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HeC9bA3n74TzJRYv9AgBE8
2026-10-08 10:47:33 +02:00
clem-gbandClaude Opus 5.5 2ba8f75e15 fix(libkernel): report the current CPU within the thread's guest affinity
sceKernelGetCurrentCpu returned the raw host CPU index. Guest affinities
are bookkeeping only and sceKernelGetAvailableCpumask advertises CPUs 0
to 12, so on a host with more than 13 logical CPUs a title could get 13
or higher, and a thread pinned to one CPU could get another one.

The host index now selects a CPU of the calling thread's affinity
clipped to the available mask, so the result is always an advertised
CPU and a thread pinned to one CPU reports that CPU.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HeC9bA3n74TzJRYv9AgBE8
2026-10-08 10:47:33 +02:00
clem-gbandClaude Opus 5.5 39c3d0451d fix(libkernel): give each nested TimedWait its own waiter on Windows
A thread had one TimedWait waiter for every wait. When
sceKernelRaiseException reached a thread blocked in a TimedWait
condition, its handler ran as an APC inside that wait, and a wait in
the handler queued the same waiter on a second condition while it was
still linked into the first. The links of the first queue were
overwritten, so waiters behind it were never woken, and a wake of the
outer wait set the shared event and was consumed by the inner wait.

A wait now takes the thread's first waiter that is not in use, and
creates a deeper one for a wait nested inside another.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HeC9bA3n74TzJRYv9AgBE8
2026-10-08 10:47:32 +02:00
clem-gbandClaude Opus 5.5 0fb192c4c3 fix(libkernel): use positioned transfers for Windows AIO requests
On Windows each AIO request seeked a _dup of the descriptor and then read
or wrote through it. A duplicated descriptor shares the file position, and
the seek and the transfer are separate calls, so two threads submitting
requests on one descriptor could transfer at each other's offset. Each
request is now a single ReadFile/WriteFile with an OVERLAPPED offset on
the OS handle, as pread and pwrite already do in Stdio.cpp.

GuestAio reads four distinct blocks of one descriptor from four threads
and checks every result.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HeC9bA3n74TzJRYv9AgBE8
2026-10-08 10:47:32 +02:00
popcoder565andClaude Opus 5.5 30613d23b0 fix(agc): poll for completions with a high-resolution timer on Windows
An idle queue worker with completions pending waited on its condition
variable for 1 ms before each reap. With MinGW that wait goes through
winpthreads, which ends a timed wait on a 15.6 ms GetTickCount64 step,
so deferred end-of-pipe interrupts reached the guest about 15 ms after
the GPU had finished. On Windows the worker now sleeps with PollSleep
between reaps, and so does the wait for a wait-free submission's order
release.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 04:45:02 -04:00
Adrià a5df1a874d Merge pull request #1177 from MichonGoddijn231849/feat/standard-64k-color-targets
feat(agc): 64 KiB standard color targets
2026-10-08 10:44:52 +02:00
Adrià 2c8c9634c3 Merge pull request #1176 from EdouardSence/fix/linux-anonymous-writable-image
fix(libc): back the main image's writable mappings with anonymous memory on Linux
2026-10-08 10:41:35 +02:00
Adrià 2959dc5318 Merge pull request #1168 from oguzhanozfe/fix/decoder-moffs-length
fix(relinker): decode the 64-bit address of MOV moffs instructions
2026-10-08 10:39:59 +02:00
Adrià 0e173a4634 Merge pull request #1143 from AchrafReyani/feat/libc-bad-weak-ptr
feat(libc): implement std::bad_weak_ptr and _Throw_bad_weak_ptr
2026-10-08 10:30:41 +02:00
popcoder565andClaude Opus 5.5 b8084b4f02 fix(videoout): pace vblanks with a high-resolution timer
On Windows the vblank thread's condition_variable::wait_until went
through winpthreads, which ends a timed wait on a 15.6 ms
GetTickCount64 step even with the scheduler tick raised to 0.5 ms.
Vblank intervals ranged from 2 ms to 34 ms instead of 16.68 ms. The
thread now sleeps to each deadline with PreciseSleepUs and checks for
a stop or a presentation failure after each sleep.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 04:29:57 -04:00
Adrià FranchandClaude 402cd1545e test(relinker): give the lifecycle fixture a non-executable stack header
glibc 2.41+ refuses to dlopen a module without PT_GNU_STACK, so the native
part of guest_lifecycle_ownership failed on current distributions.

Co-Authored-By: Claude <[email protected]>
2026-10-08 10:27:52 +02:00
kjhq bb1a4cbec4 fix(libkernel): flush only the paths the guest changed in sceKernelSync on Windows
Opening a volume needs administrator rights, so the volume flush skipped
every volume in a normal user session. The libc, libkernel, save data and
app content file functions now record each host file and directory they
change. On Windows sceKernelSync flushes the recorded paths that changed
since the previous call, plus their changed parent directories, through
handles a normal user can open. Linux still calls sync().
2026-10-08 08:27:22 +00:00
Fishybeing 5b0d28392c fix(libc): parse and collate guest wide strings as 16-bit units
wcstod, wcstof, wcstold, wcstol, wcstoll, wcstoul, wcstoull, wcscoll and wcsxfrm still forwarded to the host's wchar_t functions, which use 32-bit units on Linux. The wcsto* functions now parse the ASCII prefix of the guest string with the narrow parsers, as the C locale accepts only ASCII white space and digits. wcscoll compares like wcscmp and wcsxfrm copies, as strcoll and strxfrm do in the C locale.
2026-10-08 10:27:00 +02:00
Adrià 8388121a4f Merge pull request #1153 from ebarr24/codex/windows-gui-error-status
fix(relinker): preserve GUI startup failure status without stderr
2026-10-08 10:26:56 +02:00
Adrià 17440abe24 Merge pull request #1165 from oguzhanozfe/fix/linux-dynstr-runpath-size
fix(relinker): include the run path in the Linux DT_STRSZ
2026-10-08 10:25:19 +02:00
Arvind FrøilandandClaude Opus 5.5 c7083aa4e1 refactor(libkernel): name the Jrs7UUkGOFo Coredump stub by its NID
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 17:24:26 +09:00
Arvind FrøilandandClaude Opus 5.5 5019c1eee8 refactor(libSceAjm.native): name the WVorbis stubs by their NIDs
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 17:24:25 +09:00
Arvind FrøilandandClaude Opus 5.5 7b7a6a04dd refactor(libScePsml_debug): name the Mfsr2 stubs by their NIDs
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 17:24:25 +09:00
Adrià 61896dea23 Merge pull request #1163 from oguzhanozfe/fix/decoder-rexw-immediate-size
fix(relinker): let REX.W override 0x66 when sizing decoder immediates
2026-10-08 10:23:35 +02:00
TibixDev 09b419e8cc fix(agc): ignore stale input state for null pixel shaders
Use the synthetic shader input and export state when selecting the null pixel program. Keep ordinary shader validation unchanged. Written with AI assistance.
2026-10-08 11:23:09 +03:00
MichonandClaude Opus 5.5 20e055c244 feat(agc): compute dispatches with scratch memory
A compute program with COMPUTE_PGM_RSRC2.SCRATCH_EN takes its per-lane private size from the AGC
shader header (scratch_size_dw_per_thread) instead of being refused. The size travels in
ShaderComputeStageInfo (cache key, request serialization version 10) to the translator, whose
scratch accesses already lower to a per-invocation Function array of that many dwords.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-08 10:22:40 +02:00
Ahir Barman Maji b12022bb4e test(relinker): fix Windows lifecycle fixture build 2026-10-08 10:22:40 +02:00
Ahir Barman Maji 9517cc33f8 fix(relinker): suppress duplicate system library lifecycle 2026-10-08 10:22:40 +02:00
Adrià e705d430d6 Merge pull request #1139 from alfalfa-star/fix/agc-inert-pixel-stage
fix(agc): run draws whose pixel stage cannot run without its program
2026-10-08 10:20:09 +02:00
Adrià f6c33f0d04 Merge pull request #1131 from orbz22/feat/kernel-vectored-io-windows
feat(kernel): implement vectored file IO on Windows
2026-10-08 10:18:29 +02:00
LeandroLP23andClaude Opus 5.5 84fa55722d fix(kernel): create /download0 at start-up when the title declares download data
On the console a title whose param.json declares downloadDataSize finds
/download0 mounted from the start. The host directory was only created
by sceAppContentDownloadDataGetAvailableSpaceKb, so a title that opens
files there directly got ENOENT. libkernel now creates it when it loads,
reading only the run directory's param.json, without resolving guest
paths, so the libc path root is still fixed at first use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 10:18:22 +02:00
MichonandClaude Opus 5.5 6aa8e58de7 feat(agc): 64 KiB standard color targets
Color targets with the SW_64KB_S swizzle (CB_COLOR_ATTRIB3 tile mode 9) use the standard element
order of the 4 KiB mode extended by the texture detiler's 64 KiB bits, and are resident like the
other tiled targets. The standard blocks are now wider than tall for 2- and 8-byte elements, as the
standard swizzle and the texture layout have them (they were transposed, aliasing texels).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-08 10:16:22 +02:00
Adrià d549f76855 Merge pull request #1145 from AchrafReyani/refactor/name-resolved-unknown-stubs
refactor(libs): name the libc and Json2 stubs the NID database resolves
2026-10-08 10:16:20 +02:00
Adrià Franch ef451ab7ac test(agc): CLEAR_STATE resets SPI_PS_INPUT_ENA/ADDR to zero 2026-10-08 10:16:02 +02:00
MichonandClaude Opus 5.5 d15b3b1bd3 fix(agc): SPI_PS_INPUT_ENA/ADDR start at their reset value
A context that never wrote SPI_PS_INPUT_ENA or SPI_PS_INPUT_ADDR after CLEAR_STATE reads them as
zero, like the hardware, instead of refusing the draw for a missing register (a depth-only draw
whose pixel shader takes no inputs).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-08 10:16:02 +02:00
Adrià c081eb90dc Merge pull request #1116 from Fishybeing/fix/libc-utf16-strings
fix(libc): read guest wide strings as 16-bit units
2026-10-08 10:15:55 +02:00
Adrià 8e22498c20 Merge pull request #1134 from alfalfa-star/fix/agc-mesh-unindexed-index-vsharp
fix(agc): bind a null index buffer to non-indexed mesh draws
2026-10-08 10:15:09 +02:00
Adrià 1c3f55628d Merge pull request #1122 from TideOPL/feat/agc-copy-data-gpu-clock
feat(agc): copy the GPU clock counter with COPY_DATA
2026-10-08 10:12:18 +02:00
Suryansh Prajapati 58f596ee89 fix(shader): convert f16 bits to f32 without UnpackHalf2x16
On the AMD Windows driver (Radeon RDNA2 iGPU, 32.0.21030.2001)
UnpackHalf2x16 of a byte-selected half converts the unmasked source
register: an SDWA BYTE_0 source of 0xfff0fff0 reads as f16 0xfff0
instead of 0x00f0, so agc_driver_sdwa_float_selectors and
agc_driver_sdwa_ldexp_f16 fail there. EmitF16BitsToF32 now decodes
sign, exponent and mantissa with integer operations, scaling
subnormals by 2^-24, which is exact for every half and leaves the
driver nothing to fold into the conversion.
2026-10-08 13:36:49 +05:30
Adrià da4027399e Merge pull request #1125 from TideOPL/feat/ppsa16064-missing-exports
feat(libs): add the unimplemented exports PPSA16064 imports
2026-10-08 10:01:59 +02:00
Achraf ReyaniandClaude Opus 5.5 df570de6d5 feat(libc): implement std::bad_weak_ptr and _Throw_bad_weak_ptr
BnMAMrsfVWo is _ZSt19_Throw_bad_weak_ptrv. Replace the unknown stub
with a throw of a guest std::bad_weak_ptr, and add its type info,
vtable, destructors and what().

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 10:00:54 +02:00
TibixDev 48bb99d477 fix(agc): decode implicit six-face cube extents
Treat equal BASE_ARRAY and DEPTH as a six-face cube. Measured with image_load, image_sample and image_get_resinfo on RX 6600 gfx1032 using base slices 0, 5 and 6. Partial cube ranges still throw because filtered sampling differs from load bounds.

Graphics tests and GPU snapshot/storage sampling tests pass for all six faces at each tested base.

Assisted-by: OpenAI Codex
2026-10-08 11:00:04 +03:00
LeandroLP23andClaude Opus 5.5 2e9ab8cc59 fix(libc): give setvbuf a default buffer when the size is 0
FreeBSD's setvbuf takes a zero size with _IOFBF or _IOLBF as "pick the
buffer size". The UCRT rejects sizes below 2 for those modes through
its invalid parameter handler, so the call failed on Windows and a test
process was terminated. A zero size now drops the given buffer and
asks the host for one of BUFSIZ bytes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 09:58:38 +02:00
Adrià eaa6ccea08 Merge pull request #1124 from TideOPL/fix/agc-shader-fusion-swappc-terminator
fix(libSceAgc): accept s_swappc_b64 null, s[6:7] as a front half's terminator
2026-10-08 09:55:06 +02:00
Adrià f51eeff059 Merge pull request #1117 from TideOPL/fix/relinker-tls-unreached-code
fix(relinker): find Windows guest TLS accesses in code no root reaches
2026-10-08 09:54:40 +02:00
Adrià 7fccb7ff5f Merge pull request #1051 from fisherjoey/fix/linux-unwritable-host-import
fix(agc): skip Linux host imports of ranges not mapped read-write
2026-10-08 09:53:40 +02:00
Raihan Abdul MajidandClaude Opus 5.5 87f4444441 fix(kernel): transfer each iovec directly on Windows
Gathering every iovec into one host buffer threw for a total above
INT_MAX, which a console readv/writev accepts, and copied the whole
transfer twice. Each iovec is now read or written in place, in chunks
of at most INT_MAX bytes. A readv on a pipe returns after one read so
it does not block once the available bytes are consumed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UTjpbMX7BUFMZZaxJE98zV
2026-10-08 09:52:49 +02:00
Raihan Abdul MajidandClaude Opus 5.5 a38df0f020 feat(kernel): implement vectored file IO on Windows
sceKernelReadv, sceKernelWritev, sceKernelPreadv and sceKernelPwritev threw on Windows. They now gather or scatter through one host buffer and issue a single read or write, with the same argument checks and error codes as the Linux path. Positioned transfers restore the file offset afterwards, as pread and pwrite do on POSIX, and report ESPIPE for handles that are not disk files. guest_file_vector now runs on Windows as well.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UTjpbMX7BUFMZZaxJE98zV
2026-10-08 09:52:49 +02:00