Results that land in a unit whose store ran while its blocks were
watched, after those blocks left the watch while nothing was pending,
have neither saved bytes nor a watch: the unwatch hook found nothing to
save and the write-back refuses as before (#7017). The entry named only
the range that leaves the watch without the hook running over it.
A MarkWritten whose fresh collect fails (a no-access or unwatchable
resident page inside the 64 KiB block span) took the span out of the
write watch without running the unwatch hook, so pending storage-image
results over it kept no saved guest bytes and their write-back refused:
storing storage image results pending over memory outside the write
watch without the guest bytes saved before them is not implemented
(#7017, Palworld PPSA23126 among others).
The hook now runs over the block span before the blocks leave the
watch, as Unwatch and the import fallback do, with the tracker lock
released for it like #6308 does for imports. The debt entry drops the
failed collect from the unsaved cases.
The check makes a collect fail over a no-access arena page and requires
the hook to have covered the block; it needs the WindowsMappings
protection failure, so it runs in the Windows-only section of the write
tracking test.
Align scePlayGoDialogGetResult unfinished error code with the other common dialog modules across the tree (0x80B80005, COMMON_DIALOG_ERROR_NOT_FINISHED) instead of 0x80ED0005. Update GuestPlayGoDialog test and technical debt entry accordingly.
Validate that the dialog is in finished state before returning results in scePlayGoDialogGetResult, returning ERROR_INVALID_STATE when called while initialized, and cover this case in GuestPlayGoDialog.
On Windows, localtime_s moves a time outside the host range into it by
subtracting whole 400-year cycles, computed as
cycles * CALENDAR_CYCLE_SECONDS. For times within about 7.2e9 seconds of
INT64_MIN that product overflows int64, which is undefined behaviour:
built with -fsanitize=undefined -fsanitize-trap=all, guest_time_conversion
traps there on its INT64_MIN case.
Take the remainder of the time by the cycle length instead. It is the
same value for every input that did not overflow, so results do not
change, and the extreme inputs still fail the year range check.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
DispatchWriteRanges decoded the T# of every written storage image
element before checking its base address, and DecodeTextureResource
throws on a null base, so a dispatch that writes a null storage image
slot threw instead of contributing no range. On main the
APS5_PIPELINE_DISPATCH item path reaches it.
Check IsNullTextureResource first and skip the element, as
DrawWriteRanges does for draws. The draw write ranges test now also
runs DispatchWriteRanges on its written-plus-null image program.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01PqKN8pgLXDvWRPSucJTLU7
A ds_ordered_count with offset1 bit 4 set swaps the first active lane's value into the GDS counter instead of adding it. Emit it as one device-scope atomic exchange through the same path as the ordered add, and return the counter's previous value to every active lane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A wake set after the previous wait returned left the per-thread
auto-reset event signalled, so the next short sleep returned from its
wait at once and spun to its deadline. With APS5_COARSE_TIMED_WAITS or
a request under 50 us the sleep now takes TimedWait::SleepNanos as on
main.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Transition dialog status to finished in sceLoginDialogClose, matching the behavior in libSceSigninDialog, and add unit test coverage in GuestLoginDialog.
Transition dialog status to finished in sceNpAuthAuthorizedAppDialogClose, matching the behavior in libSceSigninDialog, and add unit test coverage in GuestNpAuthAuthorizedAppDialog.
#7924 adds its check between CheckInetPtonEx and CheckUsleep, where
these checks were, so the two pull requests conflicted in
GuestSceNet.cpp. The checks now sit after CheckAddressText.
Co-Authored-By: Claude Opus 5.5 <[email protected]>