1.\" $NetBSD: cpu_lwp_fork.9,v 1.4 2010/04/13 05:41:53 jruoho Exp $ 2.\" 3.\" Copyright (c) 2002, 2005, 2006 The NetBSD Foundation, Inc. 4.\" All rights reserved. 5.\" 6.\" This code is derived from software contributed to The NetBSD Foundation 7.\" by Gregory McGarry; and Rui Paulo. 8.\" 9.\" Redistribution and use in source and binary forms, with or without 10.\" modification, are permitted provided that the following conditions 11.\" are met: 12.\" 1. Redistributions of source code must retain the above copyright 13.\" notice, this list of conditions and the following disclaimer. 14.\" 2. Redistributions in binary form must reproduce the above copyright 15.\" notice, this list of conditions and the following disclaimer in the 16.\" documentation and/or other materials provided with the distribution. 17.\" 18.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28.\" POSSIBILITY OF SUCH DAMAGE. 29.\" 30.Dd April 13, 2010 31.Dt CPU_LWP_FORK 9 32.Os 33.Sh NAME 34.Nm cpu_lwp_fork , 35.Nm child_return , 36.Nm proc_trampoline 37.Nd finish a fork operation 38.Sh SYNOPSIS 39.In sys/proc.h 40.Ft void 41.Fn cpu_lwp_fork "struct lwp *l1" "struct lwp *l2" "void *stack" \ 42"size_t stacksize" "void (*func)(void *)" "void *arg" 43.Ft void 44.Fn child_return "void *arg" 45.Sh DESCRIPTION 46.Fn cpu_lwp_fork 47is the machine-dependent portion of 48.Fn fork1 49which finishes a fork operation, with child lwp 50.Fa l2 51nearly set up. 52It copies and updates the PCB and trap frame from the parent 53.Fa l1 , 54making the child ready to run. 55.Pp 56.Fn cpu_lwp_fork 57rigs the child's kernel stack so that it will start in 58.Fn proc_trampoline . 59.Fn proc_trampoline 60does not have a normal calling sequence and is entered by 61.Fn cpu_switch . 62If an alternate user-level stack is requested (with non-zero values 63in both the 64.Fa stack 65and 66.Fa stacksize 67arguments), the user stack pointer is set up accordingly. 68.Pp 69After being entered by 70.Fn cpu_switch 71and while running in user context (within the kernel) 72.Fn proc_trampoline 73will invoke the function 74.Fa func 75with the argument 76.Fa arg . 77If a kernel thread is being created, the return path and argument 78are specified with 79.Fa func 80and 81.Fa arg . 82If a user process is being created, 83.Fn fork1 84will pass 85.Fn child_return 86and 87.Fa l2 88to 89.Fn cpu_lwp_fork 90as 91.Fa func 92and 93.Fa arg 94respectively. 95This causes the newly-created child process to go directly to user 96level with an apparent return value of 0 from 97.Xr fork 2 , 98while the parent process returns normally. 99.Sh SEE ALSO 100.Xr fork 2 , 101.Xr cpu_switchto 9 , 102.Xr fork1 9 103