The export turned YNw9Xk5iNWo from an unresolved import into a stub that throws. Dreaming Sarah (PPSA02929) calls it during start-up and now aborts with "YNw9Xk5iNWo not implemented" about 2 s in. Reverting until the function is implemented.
Since the cached address space keeps a read-only V# that only partly
overlaps its base regions (readsOverBase), a build's own regions can
overlap base regions. UploadPrepare merges overlapping own views, so a
merged region can begin before the base region that holds a view's first
byte. owner() still took whichever candidate began later, so Descriptor
bound such a view through one base region it does not fit:
guest buffer view 0x1f0494592c+0x1b2190 exceeds its GPU owner
0x1f04940000-0x1f04950000 (buffer 0, direct 1, mirror 0)
owner() now takes the range's end and prefers the candidate that holds
the whole range. When both or neither do, it keeps the previous rule.
Every caller already knew the end it passes.
Ninja Multi-Config writes one add_test per configuration and a final NOT_AVAILABLE one for the same name. The audit kept only the last, so every test executable was reported as never run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
AllocateHostStack passes MAP_STACK to mmap. The macOS SDK defines
MAP_NORESERVE but not MAP_STACK, so Export.cpp does not compile there.
Build the flags in a local variable and add MAP_STACK only where the
host defines it. Linux keeps the same flags.
TestRestartAfterPausedJumpKeepsClockRunning created the player without events, so auto-start could start the source before the test enabled its streams by hand, and EnableStream then failed. With an event callback the player leaves starting to the test, as in TestUnsyncedVideoKeepsUpWithAudio.
WindowsMappings keys each physical page's state (moved into the section,
saved bytes of an unmapped resident page) by the section handle value.
sceKernelReleaseDirectMemory frees the backing before it unmaps the views,
so ForgetSection ran while those views still existed and kept their slots.
After the views went, the slots stayed under a handle value that Windows
hands out again, and the next direct allocation whose section got that
value started with the old page state: its first mapping went to the
section instead of private memory, or received the old allocation's bytes.
Views now share ownership of their slot, ForgetSection drops every slot
of the section at once, and JIT shared memory forgets its section before
closing it too.
Accept SCE_NGS2_CUSTOM_MODULE_ID_USER_FX (0x1d) on custom submixer racks alongside UserFx2 (0x1f). When configuring a custom rack voice, support voice control parameter SCE_NGS2_CUSTOM_VOICE_PARAM_USER_FX (0x40001d00) to install custom submixer UserFx callbacks with user data. Run legacy UserFx callbacks during custom voice rendering and update sample presence flags accordingly.
Fixes runtime abort in Void Terrarium (PPSA03061):
terminate called after throwing an instance of 'std::runtime_error'
what(): NGS2: custom module id 0x1d is not implemented
FATAL: abort() (SIGABRT)
Closes#5055
Stale conflicts runs actions/stale with only-pr-labels: needs rebase.
actions/stale skips any PR without all only-labels before it looks at
remove-pr-stale-when-updated, so after a rebase removes needs rebase the
PR is never processed again and keeps its stale label for good. A step
before actions/stale now removes stale from open PRs that no longer
carry needs rebase.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
pr-intake runs once per opened PR, and each run lists every open PR by
the author. When an author opens several PRs within seconds, every run
sees all of them and closes its own, so a newcomer opening two PRs at
once loses both, and an author with one merge opening 21 loses all 21.
On opened events the limit now counts only lower-numbered PRs, so the
earliest ones stay open and only the PRs over the limit are closed.
Reopened events still count every open PR, as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
Map hw.model, hw.ncpu, hw.physmem, hw.realmem, kern.arandom and
kern.proc.pathname to their FreeBSD MIBs with the size handling of
FreeBSD's libc wrapper over name2oid, fail with ENOENT and ENAMETOOLONG
as name2oid does, and throw for null pointers, which FreeBSD's wrapper
dereferences, and for names sysctl does not serve.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The doc-link check matched C++ lambdas such as `[](int a)` inside fenced
code blocks and inline code, reporting bogus missing targets. Links now
require non-empty link text, and links() strips fenced blocks and inline
code spans first. docs() also skips added lines that sit inside a fence
of the full file.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Titles run natively, so a host CPU without an extension that compiled Zen 2 code uses faults with an illegal instruction deep inside a title (#3719: SHLX, BMI2). libkernel now reads CPUID and XCR0 when it loads on Linux and Windows, logs the host CPU's extensions and throws, naming the CPU and the missing extensions, before any title code runs.
Guest threads run on host stacks that Windows reserves (0x210000 bytes
by default) and commits on demand. Resident Evil Village protects one
thread's whole host stack with 0xc2 at startup while its lowest 0xd000
bytes are still only reserved, so the Windows mprotect emulation threw.
When such a stack sat inside the arena bounds as a host region, the call
took the arena commit path and failed to split a placeholder that was
never one.
Commit the reserved pages of a host range before protecting it, and only
use the arena commit for ranges the arena owns.
A fill turned into an image clear or an image copy invalidated the saved
guest bytes of every unit of each other image over its range. The flush
before it stores only the units it overlaps, so results still pending in
the other units lost their saved bytes, and storing them over memory
outside the write watch threw ("storing storage image results pending
over memory outside the write watch without the guest bytes saved before
them is not implemented").
Only the units over the filled or copied range lose their saved bytes now;
the others are compared with them at their store as before.
Add a unit test for the layout the relinker prints after a conversion:
the fixed header and library entries, extra executables in order, and
module paths merged into one sorted tree with directories marked and
duplicates collapsed.
select now checks pipe descriptors on Windows with the readiness test poll
already uses, so a pipe next to a libSceNet socket no longer throws.
RetroArch (PPSA99169) selects on libmicrohttpd's wake-up pipe beside its
listening socket. guest_select now runs on Windows too.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An import that leaves its range watched copies the whole range first, so
that each page the import resolves can be compared with its bytes when
the window closes (#3874). Ghost of Tsushima (PPSA02225) maps and
imports 4.9 GB of direct memory at start-up, and that copy is the
largest allocation the title makes.
Pages that are all zero are no longer copied. Each page of the range
gets a slot, the index of its copy, or none for a page that was all
zero, and such a page is compared with a zero page. Every page is
compared with the same bytes as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
XPSemu (PPSA97358) queries RLIMIT_NOFILE at start-up in QEMU's
os_setup_limits and stopped on the unsupported resource. It reports the
descriptor count after which AnyPS5 fails with EMFILE: the C runtime's
8192 low-level descriptors on Windows and the host limit on Linux.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A DMA_DATA fill with an immediate value is resolved as a packet store,
which is limited to 64 KiB. A larger fill was refused there, so the
queue worker drained the device and Execute filled the memory on the
CPU. Such a fill now goes through the fill kernels' store path
(Driver::storeBufferFill, moved unchanged out of Driver::fillBuffer):
FillBuffer into the host import, with the same CPU fallback.
Detect HDR output on the host: on Windows the monitor showing the window
must run in HDR10 (DXGI IDXGIOutput6), and on every host the window's
Vulkan surface must offer a 10-bit VK_COLOR_SPACE_HDR10_ST2084_EXT
swapchain with VK_EXT_swapchain_colorspace and VK_EXT_hdr_metadata. The
monitor's luminance comes from DXGI; hosts that report none get 1000
nits peak and full frame, 0 nits black.
While HDR output is available, sceVideoOutGetOutputStatus reports
dynamic range 2 and flag bit 0, sceSystemServiceGetHdrToneMapLuminance
reports the monitor's luminance, and every open port's output mode
event fires when that changes. PQ display buffers are presented
unchanged through an HDR10 swapchain with HDR metadata; any other
display buffer switches back to the SDR swapchain. Without HDR output
the PQ to SDR conversion uses the peak the title was last told as its
white level.
AI-assisted: yes