An address-based build maps every readable registered range. A heap range past APS5_HOST_IMPORT_MIB (or refused by the driver) was copied by every such build: about 3200 ranges, 670 MiB and 500 ms per build on the story-mode load, which then stalled. Such ranges are now served by persistent host-cached mirrors, as the main image is, and the load reaches its next failure. - a heap mirror keeps no shadow; it keeps a write-tracking generation per 64 KiB block and a build copies only the blocks stamped since. The generation is stored by the copy, so a build that throws before it leaves no block marked current with stale bytes - the build gathers its heap mirrors, sorts them and collects each run of adjacent ranges once (a collect costs about 4 us whatever its size; ~3000 mirrors took 16 ms per build, now about 3 ms) - writable ranges are mirrored too: each build keeps the bytes its merged written ranges held at upload and write-back stores only what the GPU changed from them, so a CPU store made meanwhile stays; recorded work writing a range completes before a refresh reads it - the mirrors are limited by APS5_HEAP_MIRROR_MIB (24 GiB by default); a mirror past it, or one whose buffer the driver refuses, stops the process. Heap mirrors are not given to descriptor sub-ranges, image mirror serials or reusable direct regions - past APS5_ADDRESS_COPY_MAX_MIB (64 MiB by default) of committed bytes still copied, a build stops the process, naming the largest ranges and why each is copied (unreadable pages, an image mirror the driver refused, a range outside the write-watched arena, mirrors disabled) - a direct memory page mapped at several addresses is read-only in every view while its range stays writable: copies, descriptor regions and mirrors take every readable page, write-back stores the writable ones and fails on a GPU change inside a read-only page instead of dropping it - a store through the BDA table into a mirrored or copied range faults as before (only writable ranges imported in place are writable there); the fault now names the table range and that rule - the BDA resource tests run with a storage range limit that holds the fault buffer and cover a mirror's fill, reuse, per-block refill, an interrupted refresh, a descriptor store beside a concurrent CPU store, and the copy limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .github | ||
| 3rdparty | ||
| core | ||
| docs | ||
| tools | ||
| .gitignore | ||
| .gitmodules | ||
| CMakeLists.txt | ||
| LICENSE | ||
| README.md | ||
README.md
About
Tool for automatic executables porting to Linux and Windows.
Includes a relinker that converts executable to the target system's native format and implementations of system prx libraries suitable for dynamic linking. No emulation or separate runtime process.
Status
* System libraries: percentage of the functions known to the project so far (declared in core/libs/prx), not of every PS5 system function. The total grows as more functions are declared.
Dreaming Sarah (2D platformer) runs at a stable 60 fps on a GTX 1050 Ti / i5-7500 3.4GHz.
Unsupported or unexpected states strictly throw std::runtime_error. what() is printed to stderr and the process terminates.
The shader recompiler successfully produces SPIR-V (validated via Spirv-Tools when built with ANYPS5_ENABLE_SPIRV_TOOLS).
Technical debt of the project, code style conventions
Build
The relinker uses only the C++20 standard library and should build with any conforming compiler.
libc.prx implementations contain compiler-specific code. Linux builds work with GCC; on Windows, MinGW-w64 GCC 15.2.0 (winlibs-gcc15, x86_64-ucrt-posix-seh) is currently required.
The project targets maximum compiler portability. Support for additional compilers will be addressed after the first successful game launch.
Compatibility
See the game compatibility list for tested games and known issues.
Input mapping
SDL-mapped game controllers are supported, including analog sticks and triggers. Keyboard and mouse controls can be configured with an anyps5-input.ini file. See input mapping for the supported devices and configuration format.
Disclaimer
This project is intended for interoperability, research, preservation, and compatibility purposes. It does not include, distribute, or require copyrighted software, firmware, cryptographic keys, or proprietary libraries. Users are responsible for ensuring that any binaries used with this project are obtained and used in accordance with applicable laws and their respective license terms.
License
This project is licensed under the GNU General Public License version 2 only.