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.
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.
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, notHostWrite. - 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.