lib/posix-process: Define `libc` wrappers for `vfork`
It is impossible to write the libc wrapper of the `vfork` system call
in C since the child might end up reusing and overwriting the parent's
return address when it pops it and then calls `execve`, leaving the
parent to return to an invalid state - typically would overwrite it
with the return address from execve, making it look as if the parent
returned from execve.
Userspace libc's solve this by writing the libc wrapper as something
among the lines of:
popq %<register that the syscall guarantees to preserve>
movq $SYS_vfork, %rax
syscall
pushq %<register we popped return address into 3 lines above>
ret
On ARM64 as well as others, clone() with the flags
`SIGCHLD | CLONE_VM | CLONE_VFORK` is called instead but let's just
still use our `vfork` implementation since it essentially also does
the same exact thing.
However, as a Unikernel with function calls for system calls we do
not need to care about any of that, as our execenv prologue can store
and restore everything without touching the stack. Thus, we can write
our native libc wrappers as a basic jump/branch to said prologue.