| CPU_LWP_FORK(9) | Kernel Developer's Manual | CPU_LWP_FORK(9) | 
cpu_lwp_fork, child_return,
  lwp_trampoline —
#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);
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.
| April 26, 2018 | NetBSD 9.3 |