mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
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.
29 lines
2.1 KiB
Markdown
29 lines
2.1 KiB
Markdown
# 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](TechnicalDebt.md) (only by a human), the end of `#endif`, and the end of namespace.
|
|
|
|
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
|
|
|
|
There's no need to add image files to the repository. You can add images to the [gist](https://gist.github.com/boykopovar/0e53f2e1426f29ecd41e3b51540b8a90) 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](../../core/libs/prx/libc/include/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](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.
|