NAME
cpu_lwp_fork,
child_return, lwp_trampoline
— finish a fork
operation
SYNOPSIS
#include
<sys/proc.h>
void
cpu_lwp_fork(struct
lwp *l1, struct lwp
*l2, void *stack,
size_t stacksize,
void (*func)(void *),
void *arg);
void
child_return(void
*arg);
DESCRIPTION
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
lwp_trampoline().
lwp_trampoline() does not have a normal calling
sequence and is entered by cpu_switchto(). 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_switchto()
and while running in user context (within the kernel)
lwp_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.