Commit Graph
6138 Commits
Author SHA1 Message Date
xsvm 22ebf5e608 fix(relinker): classify rewrite reference sites with the instruction decoder
ClassifyInstruction assumed a ModRM byte right after every opcode that
was not a near branch. A length-changing rewrite therefore adjusted
immediates such as MOVABS imm64 that looked like a RIP-relative ModRM,
and missed RIP-relative operands of VEX and 0F 38 / 0F 3A instructions
and the rel8 targets of LOOP and JRCXZ. Take the RIP-relative
displacement and branch target from DecodeInstruction instead.
2026-10-08 18:20:14 +08:00
Sanjaysrinivas d9afb0af62 test(shader): cover half expansion bit patterns 2026-10-08 12:19:59 +02:00
Adrià e28fa01ca6 Merge pull request #1253 from popcoder565/feat/shader-system-opcodes
feat(shader): decode halt, trap return, code end, GWS and ordered count instructions
2026-10-08 12:19:38 +02:00
mugurc 0ae0bbf244 test(libc): reach the C personality through its guest export
Guest C built with -fexceptions binds __gcc_personality_v0 to
__gcc_personality_v0_nid_postfix, and the unwinder recognizes the frame
by that address. exception_c_cleanup links the host personality, so it
passed without the export.

The new test builds a call-site table by hand and drives the routine the
way the unwinder does: through the _nid_postfix symbol and through
CallPersonality. It covers the cleanup phase installing the landing pad,
the search phase continuing, ranges before and after the call site, a
call site with no landing pad, no LSDA, a signal frame, an unsupported
version, and an unknown personality. Without the export it fails to link.
2026-10-08 13:16:41 +03:00
mugurc 939c3d98f7 feat(libc): exception runtime on macOS hosts
On macOS the host keeps libc++abi: libc++ binds __cxa_throw two-level,
so moving only the personality into this runtime would leave the two
halves disagreeing on the exception header. The host personalities stay
libc++abi's and libunwind's, and libc.prx serves guest code:

- the guest's libstdc++ std::exception_ptr is modelled directly, since
  libc++'s differs, and the Itanium type_info layouts that libc++abi
  keeps private are declared for the runtime;
- guest frames are found through their PT_GNU_EH_FRAME, using a
  dl_iterate_phdr emulation over the ELF program headers that relinked
  images keep in __APS5DATA,__meta (written by relinker --macos, which
  comes in a later pull request);
- host frames are found by scanning __TEXT,__eh_frame;
- sceKernelGetModuleInfoForUnwind uses the same emulation and falls back
  to dladdr for host images.

The libc++ paths compile only with libc++/libc++abi and the rest only
on __APPLE__, so Linux and Windows builds are unchanged.
exception_c_cleanup throws from host code, which this runtime does not
serve on macOS, so it is not built there.
2026-10-08 13:16:41 +03:00
mugurc 1ac6866980 fix(libc): export the C personality to guest code
Guest C built with -fexceptions imports __gcc_personality_v0 for its
cleanup frames, and libc.prx did not export it. The routine becomes
__gcc_personality_v0_nid_postfix, the host __gcc_personality_v0
forwards to it as __gxx_personality_v0 already does, and
CallPersonality recognizes both names.
2026-10-08 13:16:41 +03:00
Adrià FranchandClaude ce5be8c2b4 test(agc): pin the AND and OR half-wave reductions in the pixel execution test
Co-Authored-By: Claude <[email protected]>
2026-10-08 12:16:02 +02:00
Celegans12 9513703244 fix(shader): read the half-wave scans of wave64 reductions on any host subgroup
The GFX10 lowering of a wave64 reduction scans rows with DPP row_shr
1/2/4/8 and v_permlanex16_b32 under EXEC -1, then joins lanes 31 and 63
with a scalar op. The console fills lanes outside the entry EXEC with
the identity, but on the host they can be helpers that sit out subgroup
operations or invocations that were never launched: on 64 lanes (RADV)
the emulated chain reads 0 or stale values from them, and on 32 lanes
lane 63 throws since #997.

EmitReadLane now recognises the sequence on any host for UMin, UMax,
SMin, SMax, IAdd, AND and OR when the keys are the identity outside the
entry EXEC. On 64 lanes, lanes 31 and 63 become subgroup reductions of
the keys of invocations 0-31 and 32-63; on 32 lanes or fewer, lane 31
reduces all keys and lane 63 is the identity. It throws without
subgroup arithmetic or on a subgroup wider than the wave. VulkanDevice
reports GroupNonUniformArithmetic and ShaderValidation checks it.
2026-10-08 12:10:32 +02:00
Adrià 30e89cc6a0 Merge pull request #1266 from Celegans12/fix/agc-oversized-descriptor-sets
fix(agc): allocate oversized descriptor sets from a dedicated pool
2026-10-08 12:09:59 +02:00
Adrià 915e3b753f Merge pull request #1264 from Celegans12/fix/shader-wave64-exec-host-lanes
fix(shader): mask EXEC copies to the host subgroup's lanes
2026-10-08 12:08:54 +02:00
Adrià c81c2b31e5 Merge pull request #1257 from Dextroid17/ci/guard-test-registration
ci: fail when a test executable is built that no test runs
2026-10-08 12:03:23 +02:00
Adrià FranchandClaude 464f673170 ci: keep the not-run list per platform
guest_formatting_tests runs only on Windows and windows_exception_tests only
exists there, so the stale-entry check failed the Windows job.

Co-Authored-By: Claude <[email protected]>
2026-10-08 12:02:39 +02:00
Adrià 3069680b70 Merge pull request #1130 from Celegans12/feat/agc-ordered-pixel-shader
feat(agc): implement primitive-ordered pixel shaders with fragment shader interlock
2026-10-08 12:01:03 +02:00
TideOPL 8b28f53a4d revert(libkernel): move the process time fix to its own pull request 2026-10-08 11:00:22 +01:00
TideOPLandClaude Opus 5.5 383770ff65 fix(libkernel): read the process start before the clock in process time
sceKernelGetProcessTime and sceKernelGetProcessTimeCounter subtracted
GetStartNanos() from GetMonotonicNanos() in one expression. GCC reads the
clock first, so on the first call in a process the start was captured
after it and the result wrapped to about 2^64.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 10:59:30 +01:00
Suryansh Prajapati 7a3ec9f015 fix(relinker): decode UD1 as a trap
UD1 (0F B9 /r) always raises #UD, like UD2, but DecodeInstruction
reported it as sequential. Reachability analysis then followed the
bytes after it, so an import reachable only through that fallthrough
was kept by the strict unused NID filter. UD1 keeps its ModRM, so a
RIP-relative operand is still reported.
2026-10-08 15:26:54 +05:30
Adrià FranchandClaude 2e0b7bb90e docs: record the s_sethalt 0 measurement in TechnicalDebt
Co-Authored-By: Claude <[email protected]>
2026-10-08 11:49:24 +02:00
popcoder565andClaude Opus 5.5 f11080ceef chore: move the s_sethalt debt entry below the libSceAudio3d entries
#1398 and #1399 both rewrite the sceRtcParseDateTime entry that the s_sethalt entry followed. It now follows the libSceAudio3d entries, which no open pull request edits, so either can merge first without a conflict.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 11:49:17 +02:00
popcoder565andClaude Opus 5.5 67b28480d8 chore: move the wave control decode test and s_sethalt debt entry off shared lines
#1372 adds its test after the vop1 decode tests and #1314 its debt entry after s_setkill, the places where this branch added its own. The wave control decode test now precedes the vop1 decode tests and the s_sethalt entry follows sceRtcParseDateTime, so either pull request can merge first without a conflict.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 11:49:17 +02:00
popcoder565 3216830bb0 test(agc): register agc_wave_control_decode beside its target
The test is added to ctest in its own BUILD_TESTING block, as agc_vop1_sdwa_move_decode is, instead of in the shared test list that #1187 also extends.
2026-10-08 11:49:17 +02:00
popcoder565 a5717b6613 feat(shader): decode halt, trap return, code end, GWS and ordered count instructions
s_sethalt with SIMM16[0] clear is a no-op; s_sethalt 1, s_sendmsghalt, a reached s_code_end, s_rfe_b64, the ds_gws_* instructions and ds_ordered_count throw with the reason at translation. Linear decoding stops at s_code_end like at s_endpgm, so code padded with s_code_end after a final backward branch decodes. Encodings from LLVM SOPInstructions.td and DSInstructions.td, checked against the gfx10 MC tests; semantics from the RDNA 2 ISA guide.
2026-10-08 11:49:06 +02:00
TideOPL 74a4d47133 Merge remote-tracking branch 'origin/main' into pr1076
# Conflicts:
#	core/libs/prx/libScePad/Export.cpp
2026-10-08 10:46:36 +01:00
Adrià FranchandClaude 0208dea491 ci: fail when a KNOWN_UNRUN test is run by ctest
agc_driver_bda_device_tests is registered on main, so its entry hid any
future loss of that registration.

Co-Authored-By: Claude <[email protected]>
2026-10-08 11:40:34 +02:00
Dextroid17 5d6ec8ee1f fix(ci): read only linked executables out of the build graph
The Windows job failed the check with two names that are not test
executables. `libhost_thread_local_test_library` is a support library
whose RUNTIME_OUTPUT_DIRECTORY puts it in the test directory; on Linux
its output is a library artifact and never lands there, which is why the
Linux job stayed green. `windows_exception_tests` is a MINGW-only test
executable that no `add_test` registers.

Ninja prints the rule beside each target, and CMake links an executable
with `CXX_EXECUTABLE_LINKER__<target>_<config>` and a shared library with
`CXX_SHARED_LIBRARY_LINKER__...`, on every platform. Requiring EXECUTABLE
in the rule leaves the library out and keeps the Linux count at 362.

`windows_exception_tests` is a real instance of the class this check
looks for, so record it beside the other five rather than fail the job
that found it.
2026-10-08 11:40:34 +02:00
Dextroid17 28d9b1a49b fix(ci): read the test executable list on Windows as well
The Windows job failed on the new step with
"no test executables found under build". Ninja prints the target names
with the platform separator, so the Windows build graph lists
tests\name_tests.exe where Linux lists tests/name_tests, and the reader
matched neither the backslash nor the .exe suffix.

Accept both separators and a .exe suffix. Verified by driving the
function with recorded Ninja output for both platforms, which now
return the same names, and by re-running the check against the Linux
tree, which still reports 362 test executables and the same five.
2026-10-08 11:40:34 +02:00
Dextroid17 dd5c052dc5 ci: fail when a test executable is built that no test runs
A test executable can be declared with add_test_executable and never
registered with add_test. It is then built and never run, and ctest
reports a full pass over what it knows, so nothing in CI says so.

Measured on main, five test executables are in this state: the driver's
mesh and recorder tests, the guest formatting tests, the video out flip
tests and the BDA device tests.

tools/check_test_registration.py compares the test executables CMake
builds, read from the build graph, against the add_test calls in the
generated CTestTestfile.cmake files, which are written at configure time
and so do not depend on the build having finished. It fails on a test
executable that nothing runs, and records those five by name so the job
stays green until they are dealt with.

Both jobs run it right after configure, before anything is built.
2026-10-08 11:40:34 +02:00
Adrià 73ac9ef7f4 Merge pull request #1218 from hashaam1217/feat/relinker-rip-relative-stubs
feat(relinker): relocate RIP-relative operands into --to-intel stubs
2026-10-08 11:40:17 +02:00
Adrià b36718214c Merge pull request #1206 from CnRJay/feat/http-ssl-and-callbacks
feat(libSceHttp): accept the SSL version, SSL error and redirect and cookie callback calls
2026-10-08 11:38:43 +02:00
Dean 87a67a52f0 Merge pull request #626 from oneandonlydean/perf/agc-pin-workers-linux
perf(agc): pin the queue workers to the performance cores on Linux by default
2026-10-08 22:36:52 +13:00
Dean 7bbbfe16e7 Merge pull request #1387 from Dextroid17/fix/storage-keep-cpu-range
fix(agc): decide an edge unit's CPU keep from the pages the unit overlaps
2026-10-08 22:36:48 +13:00
Dean 99b92d974f Merge pull request #1382 from gjonn/fix/agc-block-compressed-thick-volumes
fix(agc): lay out block-compressed thick volumes in blocks
2026-10-08 22:36:43 +13:00
Dean 1bd8f07ccd Merge pull request #1317 from Dextroid17/fix/name-both-self-container-magics
fix(relinker): name the second SELF container magic as a SELF input
2026-10-08 22:36:28 +13:00
Dean b25c6cce04 Merge pull request #1362 from gjonn/fix/agc-int-sel-send-data
fix(libSceAgcDriver): do not raise an interrupt for RELEASE_MEM send-data-after-write-confirm
2026-10-08 22:36:24 +13:00
Dean d026063af2 Merge pull request #1327 from gjonn/fix/kernel-ampr-event-filter
fix(libkernel): report AMPR completion events with the AMPR filter
2026-10-08 22:36:19 +13:00
Dean 6145263e38 Merge pull request #1340 from gjonn/fix/videoout-ignore-reserved-buffer-pointers
fix(libSceVideoOut): ignore the reserved buffer pointers
2026-10-08 22:36:14 +13:00
Dean f100d1d67a Merge pull request #1373 from gjonn/feat/kernel-select-net-sockets
feat(libkernel): implement select over libSceNet sockets
2026-10-08 22:36:09 +13:00
Dean 8763483811 Merge pull request #1370 from gjonn/fix/kernel-fixed-map-replaces-overlap
fix(libkernel): replace partly overlapped allocations with a fixed mapping
2026-10-08 22:35:53 +13:00
Dean 6bdd6ef6cd Merge pull request #853 from meh7an/perf/agc-proc-table-before-context-copies
perf(agc): fill the device proc table before objects copy the context
2026-10-08 22:35:49 +13:00
Dean 9e5ade70fb Merge pull request #1381 from overlordxrz-source/fix/relinker-decoder-0f-no-modrm
fix(relinker): decode 0F A8-AA without a ModRM and MOV CR/DR without a memory operand
2026-10-08 22:35:44 +13:00
Dean a753d0de45 Merge pull request #1303 from overlordxrz-source/fix/relinker-evex-grp3-immediate
fix(relinker): do not add the F6/F7 TEST immediate to EVEX instructions
2026-10-08 22:35:39 +13:00
Adrià b680d5adac Merge pull request #1198 from Sanjaysrinivas/feat/shader-conditional-exchange
feat(shader): add LDS conditional exchange
2026-10-08 11:34:31 +02:00
Adrià 6e037e9899 Merge pull request #1244 from ebarr24/codex/luna-libc-memory
fix(libc): reject overflowing large heap block sizes
2026-10-08 11:31:07 +02:00
Adrià 0802d02713 Merge pull request #1242 from hashaam1217/fix/program-header-entry-size
fix(relinker): reject a program header entry size other than 56 bytes
2026-10-08 11:28:29 +02:00
Adrià 96614df544 Merge pull request #1239 from awake-devel/fix/agc-release-host-imports
fix(agc): release host imports before the device is destroyed
2026-10-08 11:27:40 +02:00
Celegans12 e1d4e699be feat(agc): implement primitive-ordered pixel shaders with fragment shader interlock
DecodeState and the draw precheck rejected DB_SHADER_CONTROL bit 16,
PRIMITIVE_ORDERED_PIXEL_SHADER (POPS), which runs the ordered section
of overlapping pixels' shaders in primitive order. The bit now reaches
the recompiler as a pixel stage field, and such a pixel shader declares
PixelInterlockOrderedEXT and runs its whole body between
OpBeginInvocationInterlockEXT and OpEndInvocationInterlockEXT; an
invocation that a BDA read fault kills ends the interlock first. The
POPS collision SGPRs read 0, so a title skips its POPS wait and runs
its per-collision loop once. An image_load still reads a sampled
binding, which misses an earlier overlapping primitive's image_store in
the same draw. The device enables VK_EXT_fragment_shader_interlock when
it has fragmentShaderPixelInterlock; without it the recompile throws,
as does a nonzero POPS_OVERLAP_NUM_SAMPLES. The field is part of the
recompile cache key, the draw key and the serialized request (version 10).
2026-10-08 11:18:46 +02:00
Adrià 3e32797cca Merge pull request #1204 from CyanBook/feat/json2-value-clear
feat(libSceJson2): implement sce::Json::Value::clear
2026-10-08 11:17:57 +02:00
Adrià 3ce729fe86 Merge pull request #1182 from MichonGoddijn231849/feat/compute-scratch
feat(agc): compute dispatches with scratch memory
2026-10-08 11:15:45 +02:00
Adrià 296d68a31d Merge pull request #1238 from hashaam1217/fix/windows-overlapping-load-segments
fix(relinker): reject overlapping PT_LOAD segments before sizing the Windows image
2026-10-08 11:14:58 +02:00
Adrià 55f4714d55 Merge pull request #1178 from MichonGoddijn231849/fix/spi-ps-input-reset-values
fix(agc): SPI_PS_INPUT_ENA/ADDR start at their reset value
2026-10-08 11:11:33 +02:00
Adrià 71a0eab968 Merge pull request #1233 from hashaam1217/feat/windows-tls-register-loads
feat(relinker): load Windows guest TLS values through register addresses
2026-10-08 11:11:10 +02:00