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.