Files
AnyPS5/docs/dev/CONVENTIONS.md
T
Dean Galvin 05d7bdb088 docs(dev): require a HostWrite bracket around host writes into guest memory
Kernel and native-library writes into guest pages the write watch left read-only fail with EFAULT on macOS and ERROR_NOACCESS on Windows (#7473). State the rule where contributors look and point the macOS write-watch debt entry at it.
2026-10-21 14:57:32 +13:00

2.1 KiB

Coding Conventions

C++ Naming Conventions

  • Interface names (classes containing only pure virtual methods with no implementation) start with I, as in C#.
  • Class names and public method names use PascalCase.
  • Private method and field names use camelCase.
  • Function argument names use camelCase.
  • Template parameter names follow the C# style: TKey, TValue, TIterator.

Comments in code can only be added to indicate areas of technical debt (only by a human), the end of #endif, and the end of namespace.

Conventional Commits

There's no need to add image files to the repository. You can add images to the gist comments and paste a link into the md file.

Host writes into guest memory

Host code that writes into guest memory through the kernel or a native library must hold a GuestArena::HostWrite (GuestArena.hpp) over the destination range for the whole write. This covers file reads (ReadFile, read, pread), socket receives, DeviceIoControl and other calls that fill a caller's buffer.

The write watch can leave guest pages read-only between collections: every watched page on macOS, and stable resident runs of at least 256 KiB on Windows (see the write-watch entries in debt/libc.md). A kernel-mode write into such a page doesn't fault into the watch. It fails instead, with EFAULT on macOS and ERROR_NOACCESS on Windows. HostWrite opens the pages and makes sure the write is recorded.

  • A write that completes later on another thread (overlapped I/O, completion ports, asynchronous reads) is bracketed where the bytes land, not where the request was issued.
  • Ordinary CPU stores from host C++ code need no bracket: the write watch records them (through a fault where the page is protected).
  • A GPU import of guest memory uses HostImportAccess, not HostWrite.
  • Third-party code that writes guest memory on its own (driver threads, library worker threads) can't be bracketed. List it in that library's debt file.