A PS5 measurement already recorded in the debt note shows queue 0x58 succeeds; raise the exclusive SubmissionQueueEnd and cover it in agc_driver_tests.
ab4a949f07 ended the "sceMbus remaining declarations" entry with "All
protected stub bodies remain unchanged." It was written on top of
afbd9b882 (#8305), which had already made sceMbusAcquireControlList
return 0x809B00FF and sceMbusTerm return 0, and the same entry says both
return constants. Drop the sentence.
The explicit binary exponent stopped accumulating near 1e9 while the
digits add 4 per character without bound, so a subject with a few
hundred million digits was classified against the wrong exponent:
0x1 followed by 3e8 zeros and p-1200000005000 kept errno, and a long
zero fraction with p+1000000000000 underflowed instead of overflowing.
Saturate the explicit exponent at 2^62, beyond what any addressable
digit run can offset, so the sum never overflows or changes sign.
Record that _Stod and _Stodx follow the title libc.prx rule for
hexadecimal underflow, unverified for libSceLibcInternal.
Refs #9691
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Keep only the gaps: the rule is measured on one title-bundled libc.prx,
and on Linux glibc 2.35's strtod rounds some hexadecimal subnormal
results a unit low.
Refs #9691
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Classify hexadecimal strtod and wcstod input from its own digits rather
than a long double approximation. As measured on God of War Ragnarok's
bundled libc.prx, ERANGE is set only on overflow or when the exact value
is below 2^-1074, and a value between 2^-1075 and 2^-1074 becomes the
smallest subnormal only from 2^-1075 * (1 + 2^-52) up.
Refs #9691
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A directory in place of the temporary state file makes the save fail; the unlock
has to report it, leave trophy 0 locked, and succeed once the directory is gone.
sceNpTrophyUnlockTrophy inserted the id into the in-memory set and then saved the
state file. A save that threw (the state directory or the rename failed) left the
trophy unlocked in memory but not on disk, so a retry answered
TROPHY_ALREADY_UNLOCKED and the unlock was lost at the next start. The new set is
now built on a copy, written, and only then installed.
SaveState also never looked at the stream after writing, so a failed write (for
example a full disk) was ignored and the truncated temporary file was renamed over
the good state file. It now flushes, checks the stream, removes the partial
temporary file and throws.
An anonymous shm descriptor is recognised as shared memory only on
Linux, where the memfd link name is matched; on Windows the anonymous
%TEMP% object is not registered in the shared-descriptor table, so the
descriptor is not recognised and fpathconf never reaches the EOPNOTSUPP
branch. A named descriptor is recognised on both platforms, so the
check now opens a named object and unlinks it, keeping the same branch
coverage without a Linux-only assumption.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
_fpathconf_nid_postfix only treated FIFOs and sockets as descriptors without
a vnode, so a kqueue or shm_open descriptor fell through to the UFS constants
(LINK_MAX 32767, NAME_MAX 255, PIPE_BUF 512). FreeBSD 11.4 kern_fpathconf
(kern_descrip.c:1411-1429) answers _PC_ASYNC_IO for every descriptor and
returns EOPNOTSUPP for a no-vnode descriptor that is not a pipe or socket.
Return EOPNOTSUPP for kqueue and shared-memory descriptors.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
masked_store_lowering failed twice under Rosetta on GitHub's macOS x86_64
runner (runs 40216485859 and 40438653738) with only "Masked store stub
changed the flags", while the stored bytes, faults, vector and general
registers, red zone and RSP all matched. The message now names the form,
width, addressing mode, offset, mask pattern, fault count and the flags
before and after, so the next occurrence shows which flags change and
whether the probe faulted.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceKernelRmdir decided whether the last component was a symbolic link with
std::filesystem::is_symlink, which follows the link with WinLibs libstdc++ on
Windows. A dangling or self-referencing file link then looked missing on
Windows 10 (ENOENT instead of ENOTDIR), and a directory link to an empty
directory looked like that directory, so rmdir removed the link and
returned 0. The last component is now classified with FillLinkStat, the
same lstat path lstat_nid_postfix uses, matching FreeBSD 11 kern_rmdirat,
which returns ENOTDIR for any non-directory vnode found without following
the last link.
Fixes#12079
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Follow FreeBSD 11.4 sys_kenv: KENV_GET, KENV_SET, KENV_UNSET and KENV_DUMP over
an in-memory kernel environment of at most 512 variables, with the 128-byte
name and value limits, ENOENT, EINVAL, ENAMETOOLONG and EFAULT.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
sceMoveClose returns INVALID_HANDLE for a handle that is not open since 808d67e715 (#8252), and sceMoveOpen returns ALREADY_OPENED for an open slot since c478789949 (#8252) and throws only for users other than the initial user since 95ea06e80b (#8125). The sentence came from 8a1bd363ef (#9137), which left both bodies alone; the rest of the entry already describes them.
The work-memory entry said the bodies of all its queries remain
unimplemented, but sceHmdGetDistortionWorkMemoryAlign and Size return
0x400 and 0x20000 since db2575839 (#8307), and their
sceHmdDistortionGetWorkMemory* aliases since fa916ae7bc (#8256). Only
capture start, separate-mode open, crash-report cancellation and the
mirroring aspect debug setter still throw.
The device and sensor query entry said its protected bodies are
unchanged, but sceHmdGetFieldOfView, sceHmdGetInertialSensorData and
sceHmdGetAssyError answer without a headset since fe6aba89a8 and
a569d075ec (#8256), before 7b97d7552c (#9137) wrote the entry. Only the
internal device-information, distortion-parameter, status-report and
DFU-status queries still throw.
A registry and a needed-libraries file of 200000 opening brackets have to end in
an audit error with exit code 2 and the read-error message, not a traceback.
The command has to exit with 2 and say the file is nested too deeply, without a
traceback, instead of exiting with the code that means different outputs.
tools/test_web.py launched archive-root, archive-windows and archive.test but not
archive-reserved.test.mjs, which covers the superscript Windows device names
(COM1 with a superscript digit, LPT2 and so on) added with 3397e873bc. No
workflow, script or CTest entry referenced it, so a regression in validPath for
those names went unnoticed. It runs next to the other archive tests now.
read_registry and read_needed_registry catch OSError, UnicodeDecodeError and
JSONDecodeError, but a registry nested a few hundred thousand levels deep raises
RecursionError. main returns 2 for an AuditError and 1 for missing imports, so
the traceback ended with exit code 1 and a corrupt registry looked like a failed
import audit. RecursionError is now caught with the other read errors and
reported as an AuditError, so the exit code is 2.
read_report passes the file to json.loads, and a report nested a few hundred
thousand levels deep raised RecursionError, which main does not catch. The
command ended in a traceback with exit code 1, the code the tool documents as
'different outputs', so a corrupt file looked like a hardware difference. The
error is now a ValueError naming the file, and main reports it with exit code 2
like every other invalid report.
rename and sceKernelRename now look the source up before they reject a
dot destination, as FreeBSD 11.4's kern_renameat does, so a missing
source onto dir/. fails with ENOENT. guest_filesystem covers it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>