On many operating systems, including macOS and Windows, the only ABI-stable interface is a userland-to-userland interface. Application code loads a shared library vended by the system and calls functions from that library like open() or CreateFileW(), in userland. These functions are in turn are usually thin wrappers around system calls with equivalent argument lists – but not always, and even when they are, it's only an implementation detail. Trying to call system calls directly without going through the wrappers risks incompatibility with future OS versions, e.g. [1].<p>On Linux, traditionally, the userland-kernel interface itself is ABI-stable. The userland code can be fully custom and doesn't even need to support dynamic linking. Syscall numbers and arguments are fixed, and application code can perform its own syscall instructions. You can then layer something like glibc on top of that, which provides its own syscall wrapper functions with a corresponding stable (userland-to-userland) ABI, but that's separate.<p>The vDSO has always been a step away from that. It's userland code, automatically mapped by the kernel, that provides its own system call wrappers. Applications are still allowed to make system calls manually, but they're encouraged to use the vDSO instead. Its original purpose was to allow certain functions such as gettimeofday() to be completed in userland rather than actually performing a syscall [2], but it's been used for a few other things. It's worked pretty well, but it does have the drawback that statically linked binaries no longer control all of the code in their address space. This, for instance, caused a problem with the Go runtime [3], which expected userland code to follow a certain stack discipline.<p>Anyway, this patch seems to me like a significant further step. Not just putting an RNG into the vDSO, which is more complicated than anything the vDSO currently does, but also essentially saying that you <i>must</i> use the vDSO's RNG to be secure (to quote the RFC, "userspace rolling its own RNG from a getrandom() seed is fraught"), and explicitly choosing not to provide stable APIs for custom userland RNGs to access the same entropy information.<p>I don't think that's necessarily a bad thing. It's not <i>that</i> complicated, and to me, macOS' and Windows' approach always seemed more sensible in the first place. But it's a step worth noting.<p>[1] <a href="https://github.com/jart/cosmopolitan/issues/426" rel="nofollow">https://github.com/jart/cosmopolitan/issues/426</a><p>[2] <a href="https://man7.org/linux/man-pages/man7/vdso.7.html" rel="nofollow">https://man7.org/linux/man-pages/man7/vdso.7.html</a><p>[3] <a href="https://marcan.st/2017/12/debugging-an-evil-go-runtime-bug/" rel="nofollow">https://marcan.st/2017/12/debugging-an-evil-go-runtime-bug/</a>