January 29, 2006 CPU_LWP_FORK 9

### NAME

cpu_lwp_fork, child_return, proc_trampoline - finish a fork operation

### SYNOPSIS

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

### SEE ALSO

fork(2), cpu_switch(9), fork1(9)