libstdc++ on Windows answers create_directory_symlink with
function_not_supported, so the fake sysfs could never be built there and
every device case was skipped. Inject the host volumes directly for the
device, map, getdents and hotplug cases, and keep the fake sysfs only
for the scan of mountinfo and sysfs, which is Linux's.
A requested directory such as C:/Windows or C:Windows carries a root name
on Windows, so appending it to the volume root replaced the root and the
map checked a directory outside the device. Join the validated names one
by one and refuse a name with a root path. The fake sysfs of the test no
longer uses colons, so its device cases can run on Windows too.
The CPU publish pass could pass with lead 0 or with the publish unchecked. A dedicated agc_driver_sparse_dma_buf_cpu_lead run (--require-cpu-lead) now fails unless the import is a dma-buf with lead 16384, the unit is watched, the CPU publish is nonzero and every word and guard is checked, and it fails instead of skipping when the device cannot. The default run keeps its existing checks, reports the skip with its reason and prints a coverage line.
A clock id with CPUCLOCK_PROCESS_BIT threw in clock_gettime and
clock_getres. FreeBSD 11 get_cputime reads the process's CPU time, or
fails with EINVAL when pget finds no such process, and kern_clock_getres
gives every CPU clock the CPU time resolution without a lookup. The
guest's own process clock now reads CLOCK_PROCESS_CPUTIME_ID, any other
fails with EINVAL, as kill already finds no other process.
AppKit, which SDL uses for windows, Metal surfaces, event pumping and game
controllers, works only on the main thread, and a guest never hands its
thread back. The macOS relinker emits a call to Aps5StartGuest as the
entry of a relinked executable; no library provided it.
- Aps5StartGuest runs the guest entry on a new thread with the stack size
of the main thread (at least 8 MiB) and serves the main dispatch queue
from the run loop of the main thread. The guest ends the process with
exit; a guest entry that returns aborts.
- Aps5RunOnMainThread runs a function on the main thread and waits for it,
or in place where the main thread is the caller or Aps5StartGuest was
never called.
- libSceVideoOut sends its SDL calls through OnMainThread, which carries
the exceptions back to the caller: the initialisation and shutdown of the
video and game controller subsystems, the window, its Vulkan surface and
drawable size, the event polling and the pad, mouse and keyboard input,
which are created and destroyed there. On the other platforms the
functions run in place.
- The flip test starts its tests through Aps5StartGuest on macOS, as a
relinked guest does.
Co-authored-by: mugurc <[email protected]>
List the FAT and exFAT volumes the host has mounted from USB mass-storage
devices (Linux mountinfo and sysfs, Windows volume IOCTLs and SetupAPI),
map each to /mnt/usb<id> and report mounts and unmounts to the registered
callbacks from a service thread that rescans the host once a second.
Device info, map requests and getdents scans follow the recovered records
of SharpProspero and shadPS4; unknown answers keep throwing.
The new export is declared next to its siblings in prx/libc/include/Api.hpp and GuestUnderflowError.cpp uses the canonical declarations instead of local externs, which public_headers rejects.
Only the main executable output was checked for being a directory. A
directory at a guest module, extra executable, registry, needed-library,
patch manifest, icon, desktop entry or diagnostics path failed only when
it was opened, in most cases after earlier outputs had been written.
checkOutputInputs now rejects an existing directory for every output
kind it checks, as 286cf28ec7 did for the main executable. Such runs
still exit 2, now before any output is written.
On PS5 firmware 13.60 pthread_mutex_setyieldloops_np and
scePthreadMutexSetyieldloops return EINVAL on a destroyed mutex, as the
other spin and yield loop calls already did here. The default counts
(2000 spins for an adaptive mutex, 0 otherwise, 0 yields) match.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
On PS5 firmware 13.60 a second sceAudioOut2Initialize returns 0x80268004,
also after sceAudioOutInit, and a second sceAudioOutInit returns
0x8026000e. sceAudioOutInit after sceAudioOut2Initialize still returns 0.
sceAudioOut2InitializeEx and sceAudioOut2LoInit keep returning 0; their
repeats were not measured.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
With --windows-fixed-base the PE writer bounded the end of a fixed
image by 0x7fffffffffff, so an image ending in the top 64 KiB relinked
with exit code 0 and then failed to load with
STATUS_CONFLICTING_ADDRESSES. On x64 Windows 8.1 and later the highest
user address is 0x7ffffffeffff (lpMaximumApplicationAddress), so the
exclusive end of a fixed image must not exceed 0x7fffffff0000. Such
images are now rejected with the existing user address space error;
every image that ends at or below the limit is written unchanged.
--windows replaced a guest GS memory instruction with UD2 and NOPs even
when a symbol, a relocation pointer, a lea target or a DT_INIT_ARRAY
entry started inside it, so that entry ran padding instead of the
original code. A trapped instruction that holds a collector entry root
after its first byte now fails with "GS trap would overwrite an
executable entry point" at the root's file offset, the rule that TLS
rewrites already follow. The branch check runs first, so a relative
branch into the instruction keeps its message, and outputs without such
a root are unchanged.