cpu_lwp_fork() is the machine-dependent portion of
fork1() which finishes a fork operation, with child lwp
l2 nearly set up. It copies and updates the PCB and trap frame from the parent
l1, making the child ready to run.
cpu_lwp_fork() rigs the child's kernel stack so that it will start in
proc_trampoline().
proc_trampoline() does not have a normal calling sequence and is entered by
cpu_switch(). If an alternate user-level stack is requested (with non-zero values in both the
stack and
stacksize arguments), the user stack pointer is set up accordingly.
After being entered by
cpu_switch() and while running in user context (within the kernel)
proc_trampoline() will invoke the function
func with the argument
arg. If a kernel thread is being created, the return path and argument are specified with
func and
arg. If a user process is being created,
fork1() will pass
child_return() and
l2 to
cpu_lwp_fork() as
func and
arg respectively. This causes the newly-created child process to go directly to user level with an apparent return value of 0 from
fork(2), while the parent process returns normally.