CPU_LWP_FORK(9) | Kernel Developer's Manual | CPU_LWP_FORK(9)

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

# SEE ALSO

fork(2), cpu_switchto(9), fork1(9)

April 26, 2018 | NetBSD 9.2