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
)
)
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.