Return the id a graphics event was registered with in
sceAgcDriverAddEqEvent, which titles derive from their context
(PPSA12544: 0 or 1 for graphics, 0x20 + 8 * pipe + queue for compute) and
read back to dispatch the event. Other event filters, a null or
misaligned event and an id above 32 bits throw. The meaning is an
assumption and recorded in the technical debt.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
GuestAppContent now writes a param.json that declares downloadDataSize 0
and checks that sceAppContentDownloadDataGetAvailableSpaceKb returns OK
with 0 KB for /download0 (it threw before), and PARAMETER for a null
result. TechnicalDebt records that the console's behaviour for such a
title is unverified.
AI-assisted: yes
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceAppContentDownloadDataGetAvailableSpaceKb threw when param.json declares
no download data area. A title without one has no space there: Unity's
player (PPSA12544) queries it at startup, treats an error or 0 as no space
and logs 'persistentDataPath / DownloadData has no space available, check
"Download Data Area Size" in SDK Param Editor'. It now reports 0.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
check_conventions.py normalized link targets with os.path.normpath, which gives backslash paths on Windows, so every link added in docs failed the doc-link check and a silent stub listed in TechnicalDebt was not found. Links are repository-relative POSIX paths, so they are normalized with posixpath.
Address review: read a grain's buffers at the next push without spinning
under the context lock, keep the no-device model mixing at push time,
size the pad queue from the unplayed main grains again, use generic
names in comments and TechnicalDebt, and add audio_out2_timing (next-push
read, queue level beyond the cushion, priming after running dry).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The APC delivery was allocated after SuspendThread, so a target holding
the allocator lock deadlocked the raising thread; it is now allocated
before the suspend. The wait count a raise checks lived in the target's
thread_local storage and dangled once the thread exited; it is now a
member of PthreadPrivate, which TimedWait counts into through a
thread-local pointer bound when the thread starts, and a raise on a
thread that already finished returns ESRCH. TechnicalDebt gets one line
per unverified choice: Windows only, the FreeBSD ucontext layout, the
signal mask, the YMM upper halves, and delivery to threads outside
TimedWait.
AI-assisted: yes
Co-Authored-By: Claude Opus 5.5 <[email protected]>
ReadProgramHeaders stepped through the table by e_phentsize without
checking it. With 0 it read the first header e_phnum times, and with
any other size it read misaligned fields, so a damaged header failed
much later as "No PT_DYNAMIC segment found", after building up to
65535 copies of one segment. A non-empty table must now use 56-byte
entries, as the guest module reader already requires.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
PPSA03306 (Silt) loads the Unity plugin Media/Plugins/PSNCore.prx, which
imports scePlayerReviewDialogInitialize, Open, UpdateStatus, GetResult and
Terminate from libSceCdlgPlayerReview. No library provided it, so loading
the plugin failed with "Failed to load module ...\libs\libSceCdlgPlayerReview.prx".
The library follows libSceWebBrowserDialog: the dialog shows nothing, Open
finishes at once and GetResult reports that the user canceled. Terminate
also accepts a finished dialog. GetStatus and Close are added as well.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
WindowsLoadImage sized its data and page table from the end of the last
segment and checked for overlap while copying. A segment whose memory
size reached past the last segment's end wrote page flags past the
table before its overlap was found; the relinker crashed with SIGSEGV
on such an input. Overlap is now checked in a pass before sizing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A guest range mapped again at the same base and size (a fixed remap into
a registered range) kept its import, which still shows the pages pinned
or aliased before the remap. The GPU then read stale memory. Each import
now remembers its registry range (weakly, since a held range is a lease
the remap waits for) and is retired when the registry has a different
range at its base.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
tls_function_coverage ran its execution cases only on Windows; on
Linux it checked bytes. windows_image_runner.py maps the relinked PE,
points GS at a TEB whose TLS slot holds a block copied from the
template, runs the TLS callbacks for process attach with the Windows
argument registers and calls the guest entry. convert() uses it on
Linux x86-64 and expects 42, as on Windows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
mov r64 and mov r32 from fs:[mem], where mem has a base or an index
register, now relink for Windows (64 48 8b 03, mov rax, fs:[rbx], in
#217). The stub computes the offset with lea on the original address,
adds the thread pointer and loads.
These sites can be shorter than the 5-byte jump. A short site moves the
following sequential instructions into its stub and relocates
RIP-relative ones; a branch, a return or another TLS access after it
fails the relink. A TLS site shorter than a jump is now rejected instead
of overwriting the next instruction.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
git merge-tree takes trees with --merge-base only from git 2.45. On
older git, such as 2.43 on Ubuntu 24.04, the pairwise merge failed and
merge() read the first line of empty output, so --branch stopped with
an IndexError. The merged trees are now wrapped in commits on top of
the base, which git merge-tree accepts with --merge-base from 2.40, and
a failing git merge-tree raises with git's message.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
OpenAGC's include/agc_nids.h names three more of the raw-NID exports, and
each name hashes to its NID:
gQkqkLttcpw sceAgcAcb_gQkqkLttcpw -> sceAgcAcbAtomicGds_0900
dolOmWH+huQ sceAgcUnknownGetFusedShaderSize -> sceAgcGetFusedShaderSize_0080
V++UgBtQhn0 sceAgcGetDataPacketPayloadAddressUnk -> sceAgcGetDataPacketPayloadAddress_0090
Co-Authored-By: Claude Opus 5.5 <[email protected]>
`LibcHeapErrorReportForGame_nid_postfix` exports NID SlMztUijOSk, which no
NID list or emulator knows. The name is KytyPS5's label for al3JzFI9MQ0,
the NID of sceLibcInternalHeapErrorReportForGame, which libc already
exports from HeapDiagnostics.cpp.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Eight libSceAgc exports were published under a raw NID with a made-up
name. Each NID is the hash of a versioned SDK name (checked with
tools/nid_names.py compute_nid), so the functions now carry that name and
are exported from it directly:
23LRUSvYu1M sceAgcUnknownInitState -> sceAgcInit_0090
-KRzWekV120 sceAgcUnknown__MKRzWekV120 -> sceAgcDcbSetIndexSize_0600
Ikfdt-rIqCE sceAgcUnknown_Ikfdt_MrIqCE -> sceAgcJumpPatchSetTarget_0300
7Wa3aeJgeVU sceAgcUnknown_7Wa3aeJgeVU -> sceAgcBranchPatchSetThenTarget_0300
rP5xLdOf26k sceAgcUnknown_rP5xLdOf26k -> sceAgcBranchPatchSetElseTarget_0300
fd5Bp5tGTgo sceAgcUnknownFuseShaderHalves -> sceAgcFuseShaderHalves_0200
qj7QZpgr9Uw sceAgcDcbContextStateAnotherOp -> sceAgcDcbContextStateOp_0100
k0E7vkgqAuE sceAgcCreateInterpolantMappingVsPs -> sceAgcUpdateInterpolantMapping_0100
The exported NIDs are unchanged; the extra exports under the hashes of the
made-up names are gone. Behaviour is unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
importWindowTests pinned watched imports even where the driver decides
to compare them. On amdgpu (RADV) and Intel (ANV) the import probe finds
the pages written after a GPU access, so the driver never watches
imports there; under the pinned watch the storage image keeps the CPU's
blocks and the test fails. It fails the same way at d8c7c0cc, where it
was added. It now reports itself as not run when imports are compared,
like the unit shadow test.
minLodTests expected MIN_LOD 1.5 to blend levels 1 and 2. With
VK_EXT_image_view_min_lod the view minimum LOD is minLodFloat
(preferred) or minLodInteger (alternative); ANV takes the integer part
and reads level 1. Either result is accepted and the alternative is
reported.
The test device ranks Vulkan devices as VulkanDevice does instead of
taking the first one, so on a host with an iGPU it runs on the same GPU
as the runtime. Like VulkanDevice, it destroys the unit shadows before
the device: a test that failed with live slabs segfaulted at exit when
the registry freed them after vkDestroyDevice.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The hardware addresses a 1D array in the S and D swizzles differently
from a height-1 2D array, and addrlib allows only linear, Z and R
swizzles for 1D resources, so the other tile modes are rejected instead
of being sampled with a 2D array layout.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Both forward to std::hypot, which computes without intermediate
overflow and returns infinity when either argument is infinite, even
if the other is NaN. The math test checks those cases.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
amdgpu userptr, which RADV uses for VK_EXT_external_memory_host, refuses
file-backed VMAs (libdrm sets AMDGPU_GEM_USERPTR_ANONONLY). The executable's
writable PT_LOAD mappings are file-backed MAP_PRIVATE, so on RADV they are
never imported and become writable image mirrors that every address-based
build compares in full.
At load, libc replaces each rw-p mapping of /proc/self/exe with an anonymous
copy at the same address, before any guest code runs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The BDA device test was built only on request and never registered, so
it ran nowhere. Register it with the other AGC driver tests.
Pick the Vulkan device the way VulkanDevice does, a discrete GPU over an
integrated one, instead of the first enumerated device, so the test runs
on the same GPU as the runtime on hosts with an iGPU. Without a usable
device it exits 77, as OpenVulkanTestDevice does, unless
ANYPS5_REQUIRE_VULKAN is set.
On a CPU device the BDA execution tests are not run: llvmpipe loads
through the null pointer of a branch that is not taken and the process
segfaults (Mesa #16515, #16217). The contract, allocation and color
transfer tests still run there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
On Windows 10 a file with a mapped view cannot be deleted, and FreeType's
Windows stream keeps the face's file mapped, so removing SST-Bold.otf threw
and ended guest_system_font. Moving it out of the font directory leaves
nothing at the original path and works on every host.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The validator takes the geometryShader and sampleRateShading enables from the
context (set where #295 enables them), so a device without them refuses the
draw instead of creating a module that needs features it never enabled.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Pixel shaders that export a coverage mask write gl_SampleMask, an
int[1] (or uint[1]) output. The validator rejected array interface
types; it now spells them elem[N] and accepts SampleMask as int[1] or
uint[1].
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The recompiler emits SampleId and Layer fragment inputs (pixel ancillary
data) and a FragDepth output with the DepthReplacing execution mode
(depth export), but the validator refused them, so those draws were
skipped. They are now accepted, as are the Geometry and SampleRateShading
capabilities those inputs need in fragment shaders. The device enables
both features when it has them.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>