Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: proc.h,v 1.373 2023/10/04 20:52:07 ad Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2006, 2007, 2008, 2020, 2023 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Andrew Doran.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*-
     33  * Copyright (c) 1986, 1989, 1991, 1993
     34  *	The Regents of the University of California.  All rights reserved.
     35  * (c) UNIX System Laboratories, Inc.
     36  * All or some portions of this file are derived from material licensed
     37  * to the University of California by American Telephone and Telegraph
     38  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
     39  * the permission of UNIX System Laboratories, Inc.
     40  *
     41  * Redistribution and use in source and binary forms, with or without
     42  * modification, are permitted provided that the following conditions
     43  * are met:
     44  * 1. Redistributions of source code must retain the above copyright
     45  *    notice, this list of conditions and the following disclaimer.
     46  * 2. Redistributions in binary form must reproduce the above copyright
     47  *    notice, this list of conditions and the following disclaimer in the
     48  *    documentation and/or other materials provided with the distribution.
     49  * 3. Neither the name of the University nor the names of its contributors
     50  *    may be used to endorse or promote products derived from this software
     51  *    without specific prior written permission.
     52  *
     53  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     54  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     56  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     57  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     58  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     59  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     60  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     63  * SUCH DAMAGE.
     64  *
     65  *	@(#)proc.h	8.15 (Berkeley) 5/19/95
     66  */
     67 
     68 #ifndef _SYS_PROC_H_
     69 #define	_SYS_PROC_H_
     70 
     71 #include <sys/lwp.h>
     72 
     73 #if defined(_KMEMUSER) || defined(_KERNEL)
     74 
     75 #if defined(_KERNEL_OPT)
     76 #include "opt_multiprocessor.h"
     77 #include "opt_kstack.h"
     78 #include "opt_lockdebug.h"
     79 #endif
     80 
     81 #include <machine/proc.h>		/* Machine-dependent proc substruct */
     82 #include <machine/pcb.h>
     83 #include <sys/aio.h>
     84 #include <sys/idtype.h>
     85 #include <sys/rwlock.h>
     86 #include <sys/mqueue.h>
     87 #include <sys/mutex.h>
     88 #include <sys/condvar.h>
     89 #include <sys/queue.h>
     90 #include <sys/radixtree.h>
     91 #include <sys/signalvar.h>
     92 #include <sys/siginfo.h>
     93 #include <sys/event.h>
     94 #include <sys/specificdata.h>
     95 
     96 #ifdef _KERNEL
     97 #include <sys/resourcevar.h>
     98 #else
     99 #include <sys/time.h>
    100 #include <sys/resource.h>
    101 #endif
    102 
    103 /*
    104  * One structure allocated per session.
    105  */
    106 struct session {
    107 	int		s_count;	/* Ref cnt; pgrps in session */
    108 	u_int		s_flags;
    109 #define	S_LOGIN_SET	1		/* s_login set in this session */
    110 	struct proc	*s_leader;	/* Session leader */
    111 	struct vnode	*s_ttyvp;	/* Vnode of controlling terminal */
    112 	struct tty	*s_ttyp;	/* Controlling terminal */
    113 	char		s_login[MAXLOGNAME]; /* Setlogin() name */
    114 	pid_t		s_sid;		/* Session ID (pid of leader) */
    115 };
    116 
    117 /*
    118  * One structure allocated per process group.
    119  */
    120 struct pgrp {
    121 	LIST_HEAD(, proc) pg_members;	/* Pointer to pgrp members */
    122 	struct session	*pg_session;	/* Pointer to session */
    123 	pid_t		pg_id;		/* Pgrp id */
    124 	int		pg_jobc;	/*
    125 					 * Number of processes qualifying
    126 					 * pgrp for job control
    127 					 */
    128 };
    129 
    130 /*
    131  * Autoloadable syscall definition
    132  */
    133 struct sc_autoload {
    134 	u_int		al_code;
    135 	const char	*al_module;
    136 };
    137 
    138 /*
    139  * One structure allocated per emulation.
    140  */
    141 struct exec_package;
    142 struct ras;
    143 struct kauth_cred;
    144 
    145 struct emul {
    146 	const char	*e_name;	/* Symbolic name */
    147 	const char	*e_path;	/* Extra emulation path (NULL if none)*/
    148 #ifndef __HAVE_MINIMAL_EMUL
    149 	int		e_flags;	/* Miscellaneous flags, see above */
    150 					/* Syscall handling function */
    151 	const int	*e_errno;	/* Errno array */
    152 	int		e_nosys;	/* Offset of the nosys() syscall */
    153 	int		e_nsysent;	/* Number of system call entries */
    154 #endif
    155 	struct sysent	*e_sysent;	/* System call array */
    156 	const uint32_t	*e_nomodbits;	/* sys_nosys/sys_nomodule flags
    157 					 * for syscall_disestablish() */
    158 	const char * const *e_syscallnames; /* System call name array */
    159 	struct sc_autoload *e_sc_autoload; /* List of autoloadable syscalls */
    160 					/* Signal sending function */
    161 	void		(*e_sendsig)(const struct ksiginfo *,
    162 					  const sigset_t *);
    163 	void		(*e_trapsignal)(struct lwp *, struct ksiginfo *);
    164 	char		*e_sigcode;	/* Start of sigcode */
    165 	char		*e_esigcode;	/* End of sigcode */
    166 					/* Set registers before execution */
    167 	struct uvm_object **e_sigobject;/* shared sigcode object */
    168 	void		(*e_setregs)(struct lwp *, struct exec_package *,
    169 					  vaddr_t);
    170 
    171 					/* Per-process hooks */
    172 	void		(*e_proc_exec)(struct proc *, struct exec_package *);
    173 	void		(*e_proc_fork)(struct proc *, struct lwp *, int);
    174 	void		(*e_proc_exit)(struct proc *);
    175 	void		(*e_lwp_fork)(struct lwp *, struct lwp *);
    176 	void		(*e_lwp_exit)(struct lwp *);
    177 
    178 #ifdef __HAVE_SYSCALL_INTERN
    179 	void		(*e_syscall_intern)(struct proc *);
    180 #else
    181 	void		(*e_syscall)(void);
    182 #endif
    183 					/* Emulation specific sysctl data */
    184 	struct sysctlnode *e_sysctlovly;
    185 
    186 	vaddr_t		(*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t,
    187 			     int);
    188 
    189 	/* Emulation-specific hook for userspace page faults */
    190 	int		(*e_usertrap)(struct lwp *, vaddr_t, void *);
    191 
    192 	size_t		e_ucsize;	/* size of ucontext_t */
    193 	void		(*e_startlwp)(void *);
    194 
    195 	/* Dtrace syscall probe */
    196 	void 		(*e_dtrace_syscall)(uint32_t, register_t,
    197 			    const struct sysent *, const void *,
    198 			    const register_t *, int);
    199 
    200 	/* Emulation specific support for ktracing signal posts */
    201 	void		(*e_ktrpsig)(int, sig_t, const sigset_t *,
    202 			    const struct ksiginfo *);
    203 };
    204 
    205 /*
    206  * Emulation miscellaneous flags
    207  */
    208 #define	EMUL_HAS_SYS___syscall	0x001	/* Has SYS___syscall */
    209 
    210 /*
    211  * Description of a process.
    212  *
    213  * This structure contains the information needed to manage a thread of
    214  * control, known in UN*X as a process; it has references to substructures
    215  * containing descriptions of things that the process uses, but may share
    216  * with related processes.  The process structure and the substructures
    217  * are always addressible except for those marked "(PROC ONLY)" below,
    218  * which might be addressible only on a processor on which the process
    219  * is running.
    220  *
    221  * Field markings and the corresponding locks:
    222  *
    223  * a:	p_auxlock
    224  * k:	ktrace_mutex
    225  * l:	proc_lock
    226  * t:	p_stmutex
    227  * p:	p_lock
    228  * (:	updated atomically
    229  * ::	unlocked, stable
    230  */
    231 struct vmspace;
    232 
    233 struct proc {
    234 	LIST_ENTRY(proc) p_list;	/* l: List of all processes */
    235 	kmutex_t	*p_lock;	/* :: general mutex */
    236 	kcondvar_t	p_waitcv;	/* p: wait, stop CV on children */
    237 	kcondvar_t	p_lwpcv;	/* p: wait, stop CV on LWPs */
    238 
    239 	/* Substructures: */
    240 	struct kauth_cred *p_cred;	/* p: Master copy of credentials */
    241 	struct filedesc	*p_fd;		/* :: Ptr to open files structure */
    242 	struct cwdinfo	*p_cwdi;	/* :: cdir/rdir/cmask info */
    243 	struct pstats	*p_stats;	/* :: Accounting/stats (PROC ONLY) */
    244 	struct plimit	*p_limit;	/* :: Process limits */
    245 	struct vmspace	*p_vmspace;	/* :: Address space */
    246 	struct sigacts	*p_sigacts;	/* :: Process sigactions */
    247 	struct aioproc	*p_aio;		/* p: Asynchronous I/O data */
    248 	u_int		p_mqueue_cnt;	/* (: Count of open message queues */
    249 	specificdata_reference
    250 			p_specdataref;	/*    subsystem proc-specific data */
    251 
    252 	int		p_exitsig;	/* l: signal to send to parent on exit */
    253 	int		p_flag;		/* p: PK_* flags */
    254 	int		p_sflag;	/* p: PS_* flags */
    255 	int		p_stflag;	/* t: PST_* flags */
    256 	short		p_slflag;	/* l, p: PSL_* flags */
    257 	char		p_stat;		/* l: S* process status. */
    258 	char		p_lflag;	/* l: PL_* flags */
    259 	char		p_trace_enabled;/* p: cached by syscall_intern() */
    260 	char		p_pad1[3];	/*  unused */
    261 
    262 	pid_t		p_pid;		/* :: Process identifier. */
    263 	LIST_ENTRY(proc) p_pglist;	/* l: List of processes in pgrp. */
    264 	struct proc 	*p_pptr;	/* l: Pointer to parent process. */
    265 	LIST_ENTRY(proc) p_sibling;	/* l: List of sibling processes. */
    266 	LIST_HEAD(, proc) p_children;	/* l: List of children. */
    267 	LIST_HEAD(, lwp) p_lwps;	/* p: List of LWPs. */
    268 	struct ras	*p_raslist;	/* a: List of RAS entries */
    269 
    270 /* The following fields are all zeroed upon creation in fork. */
    271 #define	p_startzero	p_nlwps
    272 
    273 	int 		p_nlwps;	/* p: Number of LWPs */
    274 	int 		p_nzlwps;	/* p: Number of zombie LWPs */
    275 	int		p_nrlwps;	/* p: Number running/sleeping LWPs */
    276 	int		p_nlwpwait;	/* p: Number of LWPs in lwp_wait1() */
    277 	int		p_ndlwps;	/* p: Number of detached LWPs */
    278 	u_int		p_nstopchild;	/* l: Count of stopped/dead children */
    279 	u_int		p_waited;	/* l: parent has waited on child */
    280 	struct lwp	*p_zomblwp;	/* p: detached LWP to be reaped */
    281 	struct lwp	*p_vforklwp;	/* p: parent LWP waiting at vfork() */
    282 
    283 	/* scheduling */
    284 	void		*p_sched_info;	/* p: Scheduler-specific structure */
    285 	fixpt_t		p_estcpu;	/* p: Time avg. value of p_cpticks */
    286 	fixpt_t		p_estcpu_inherited; /* p: cpu inherited from children */
    287 	unsigned int	p_forktime;
    288 	fixpt_t         p_pctcpu;       /* p: %cpu from dead LWPs */
    289 
    290 	struct proc	*p_opptr;	/* l: save parent during ptrace. */
    291 	struct ptimers	*p_timers;	/*    Timers: real, virtual, profiling */
    292 	struct bintime 	p_rtime;	/* p: real time */
    293 	u_quad_t 	p_uticks;	/* t: Statclock hits in user mode */
    294 	u_quad_t 	p_sticks;	/* t: Statclock hits in system mode */
    295 	u_quad_t 	p_iticks;	/* t: Statclock hits processing intr */
    296 	uint64_t	p_xutime;	/* p: utime exposed to userspace */
    297 	uint64_t	p_xstime;	/* p: stime exposed to userspace */
    298 
    299 	int		p_traceflag;	/* k: Kernel trace points */
    300 	void		*p_tracep;	/* k: Trace private data */
    301 	struct vnode 	*p_textvp;	/* :: Vnode of executable */
    302 
    303 	struct emul	*p_emul;	/* :: emulation information */
    304 	void		*p_emuldata;	/* :: per-proc emul data, or NULL */
    305 	const struct execsw *p_execsw;	/* :: exec package information */
    306 	struct klist	p_klist;	/* p: knotes attached to proc */
    307 
    308 	LIST_HEAD(, lwp) p_sigwaiters;	/* p: LWPs waiting for signals */
    309 	sigpend_t	p_sigpend;	/* p: pending signals */
    310 	struct lcproc	*p_lwpctl;	/* p, a: _lwp_ctl() information */
    311 	pid_t		p_ppid;		/* :: cached parent pid */
    312 	pid_t		p_oppid;	/* :: cached original parent pid */
    313 	char		*p_path;	/* :: full pathname of executable */
    314 
    315 /*
    316  * End area that is zeroed on creation
    317  */
    318 #define	p_endzero	p_startcopy
    319 
    320 /*
    321  * The following fields are all copied upon creation in fork.
    322  */
    323 #define	p_startcopy	p_sigctx
    324 
    325 	struct sigctx 	p_sigctx;	/* p: Shared signal state */
    326 
    327 	u_char		p_nice;		/* p: Process "nice" value */
    328 	char		p_comm[MAXCOMLEN+1];
    329 					/* p: basename of last exec file */
    330 	struct pgrp 	*p_pgrp;	/* l: Pointer to process group */
    331 
    332 	vaddr_t		p_psstrp;	/* :: address of process's ps_strings */
    333 	u_int		p_pax;		/* :: PAX flags */
    334 	int		p_xexit;	/* p: exit code */
    335 /*
    336  * End area that is copied on creation
    337  */
    338 #define	p_endcopy	p_xsig
    339 	u_short		p_xsig;		/* p: stop signal */
    340 	u_short		p_acflag;	/* p: Acc. flags; see struct lwp also */
    341 	struct mdproc	p_md;		/* p: Any machine-dependent fields */
    342 	vaddr_t		p_stackbase;	/* :: ASLR randomized stack base */
    343 	struct kdtrace_proc *p_dtrace;	/* :: DTrace-specific data. */
    344 /*
    345  * Locks in their own cache line towards the end.
    346  */
    347 	kmutex_t	p_auxlock	/* :: secondary, longer term lock */
    348 	    __aligned(COHERENCY_UNIT);
    349 	kmutex_t	p_stmutex;	/* :: mutex on profiling state */
    350 	krwlock_t	p_reflock;	/* :: lock for debugger, procfs */
    351 };
    352 
    353 #define	p_rlimit	p_limit->pl_rlimit
    354 #define	p_session	p_pgrp->pg_session
    355 #define	p_pgid		p_pgrp->pg_id
    356 
    357 #endif	/* _KMEMUSER || _KERNEL */
    358 
    359 /*
    360  * Status values.
    361  */
    362 #define	SIDL		1		/* Process being created by fork */
    363 #define	SACTIVE		2		/* Process is not stopped */
    364 #define	SDYING		3		/* About to die */
    365 #define	SSTOP		4		/* Process debugging or suspension */
    366 #define	SZOMB		5		/* Awaiting collection by parent */
    367 #define	SDEAD	 	6		/* Almost a zombie */
    368 
    369 #define	P_ZOMBIE(p)	\
    370     ((p)->p_stat == SZOMB || (p)->p_stat == SDYING || (p)->p_stat == SDEAD)
    371 
    372 /*
    373  * These flags are kept in p_flag and are protected by p_lock.  Access from
    374  * process context only.
    375  */
    376 #define	PK_ADVLOCK	0x00000001 /* Process may hold a POSIX advisory lock */
    377 #define	PK_SYSTEM	0x00000002 /* System process (kthread) */
    378 #define	PK_SYSVSEM	0x00000004 /* Used SysV semaphores */
    379 #define	PK_SUGID	0x00000100 /* Had set id privileges since last exec */
    380 #define	PK_KMEM		0x00000200 /* Has kmem access */
    381 #define	PK_EXEC		0x00004000 /* Process called exec */
    382 #define	PK_NOCLDWAIT	0x00020000 /* No zombies if child dies */
    383 #define	PK_32		0x00040000 /* 32-bit process (used on 64-bit kernels) */
    384 #define	PK_CLDSIGIGN	0x00080000 /* Process is ignoring SIGCHLD */
    385 #define	PK_MARKER	0x80000000 /* Is a dummy marker process */
    386 
    387 /*
    388  * These flags are kept in p_sflag and are protected by p_lock.  Access from
    389  * process context only.
    390  */
    391 #define	PS_NOCLDSTOP	0x00000008 /* No SIGCHLD when children stop */
    392 #define	PS_RUMP_LWPEXIT	0x00000400 /* LWPs in RUMP kernel should exit for GC */
    393 #define	PS_WCORE	0x00001000 /* Process needs to dump core */
    394 #define	PS_WEXIT	0x00002000 /* Working on exiting */
    395 #define	PS_STOPFORK	0x00800000 /* Child will be stopped on fork(2) */
    396 #define	PS_STOPEXEC	0x01000000 /* Will be stopped on exec(2) */
    397 #define	PS_STOPEXIT	0x02000000 /* Will be stopped at process exit */
    398 #define	PS_COREDUMP	0x20000000 /* Process core-dumped */
    399 #define	PS_CONTINUED	0x40000000 /* Process is continued */
    400 #define	PS_STOPPING	0x80000000 /* Transitioning SACTIVE -> SSTOP */
    401 
    402 /*
    403  * These flags are kept in p_slflag and are protected by the proc_lock
    404  * and p_lock.  Access from process context only.
    405  */
    406 #define	PSL_TRACEFORK	0x00000001 /* traced process wants fork events */
    407 #define	PSL_TRACEVFORK	0x00000002 /* traced process wants vfork events */
    408 #define	PSL_TRACEVFORK_DONE	\
    409 			0x00000004 /* traced process wants vfork done events */
    410 #define	PSL_TRACELWP_CREATE	\
    411 			0x00000008 /* traced process wants LWP create events */
    412 #define	PSL_TRACELWP_EXIT	\
    413 			0x00000010 /* traced process wants LWP exit events */
    414 #define	PSL_TRACEPOSIX_SPAWN	\
    415 			0x00000020 /* traced process wants posix_spawn events */
    416 
    417 #define	PSL_TRACED	0x00000040 /* Debugged process being traced */
    418 #define	PSL_TRACEDCHILD 0x00000080 /* Report process birth */
    419 #define	PSL_CHTRACED	0x00000100 /* Child has been traced & reparented */
    420 #define	PSL_SYSCALL	0x00000200 /* process has PT_SYSCALL enabled */
    421 #define	PSL_SYSCALLEMU	0x00000400 /* cancel in-progress syscall */
    422 
    423 /*
    424  * Kept in p_stflag and protected by p_stmutex.
    425  */
    426 #define	PST_PROFIL	0x00000020 /* Has started profiling */
    427 
    428 /*
    429  * Kept in p_lflag and protected by the proc_lock.  Access
    430  * from process context only.
    431  */
    432 #define	PL_CONTROLT	0x00000001 /* Has a controlling terminal */
    433 #define	PL_PPWAIT	0x00000002 /* Parent is waiting for child exec/exit */
    434 #define	PL_SIGCOMPAT	0x00000004 /* Has used compat signal trampoline */
    435 #define	PL_ORPHANPG	0x00000008 /* Member of an orphaned pgrp */
    436 
    437 #if defined(_KMEMUSER) || defined(_KERNEL)
    438 
    439 /*
    440  * Macro to compute the exit signal to be delivered.
    441  */
    442 #define	P_EXITSIG(p)	\
    443     (((p)->p_slflag & PSL_TRACED) ? SIGCHLD : p->p_exitsig)
    444 /*
    445  * Compute a wait(2) 16 bit exit status code
    446  */
    447 #define P_WAITSTATUS(p) W_EXITCODE((p)->p_xexit, ((p)->p_xsig | \
    448     (((p)->p_sflag & PS_COREDUMP) ? WCOREFLAG : 0)))
    449 
    450 LIST_HEAD(proclist, proc);		/* A list of processes */
    451 
    452 /*
    453  * This structure associates a proclist with its lock.
    454  */
    455 struct proclist_desc {
    456 	struct proclist	*pd_list;	/* The list */
    457 	/*
    458 	 * XXX Add a pointer to the proclist's lock eventually.
    459 	 */
    460 };
    461 
    462 #ifdef _KERNEL
    463 
    464 /*
    465  * We use process IDs <= PID_MAX until there are > 16k processes.
    466  * NO_PGID is used to represent "no process group" for a tty.
    467  */
    468 #define	PID_MAX		30000
    469 #define	NO_PGID		((pid_t)-1)
    470 
    471 #define	SESS_LEADER(p)	((p)->p_session->s_leader == (p))
    472 
    473 /*
    474  * Flags passed to fork1().
    475  */
    476 #define	FORK_PPWAIT	0x0001		/* Block parent until child exit */
    477 #define	FORK_SHAREVM	0x0002		/* Share vmspace with parent */
    478 #define	FORK_SHARECWD	0x0004		/* Share cdir/rdir/cmask */
    479 #define	FORK_SHAREFILES	0x0008		/* Share file descriptors */
    480 #define	FORK_SHARESIGS	0x0010		/* Share signal actions */
    481 #define	FORK_NOWAIT	0x0020		/* Make init the parent of the child */
    482 #define	FORK_CLEANFILES	0x0040		/* Start with a clean descriptor set */
    483 #define	FORK_SYSTEM	0x0080		/* Fork a kernel thread */
    484 
    485 extern struct proc	proc0;		/* Process slot for swapper */
    486 extern u_int		nprocs;		/* Current number of procs */
    487 extern int		maxproc;	/* Max number of procs */
    488 #define	vmspace_kernel()	(proc0.p_vmspace)
    489 
    490 extern kmutex_t		proc_lock;
    491 extern struct proclist	allproc;	/* List of all processes */
    492 extern struct proclist	zombproc;	/* List of zombie processes */
    493 
    494 extern struct proc	*initproc;	/* Process slots for init, pager */
    495 
    496 extern const struct proclist_desc proclists[];
    497 
    498 int		proc_find_locked(struct lwp *, struct proc **, pid_t);
    499 proc_t *	proc_find_raw(pid_t);
    500 proc_t *	proc_find(pid_t);		/* Find process by ID */
    501 proc_t *	proc_find_lwpid(pid_t);		/* Find process by LWP ID */
    502 struct lwp *	proc_find_lwp(proc_t *, pid_t);	/* Find LWP in proc by ID */
    503 struct lwp *	proc_find_lwp_unlocked(proc_t *, pid_t);
    504 						/* Find LWP, acquire proc */
    505 struct lwp *	proc_find_lwp_acquire_proc(pid_t, proc_t **);
    506 struct pgrp *	pgrp_find(pid_t);		/* Find process group by ID */
    507 
    508 void	procinit(void);
    509 void	procinit_sysctl(void);
    510 int	proc_enterpgrp(struct proc *, pid_t, pid_t, bool);
    511 void	proc_leavepgrp(struct proc *);
    512 void	proc_sesshold(struct session *);
    513 void	proc_sessrele(struct session *);
    514 void	fixjobc(struct proc *, struct pgrp *, int);
    515 
    516 int	tsleep(wchan_t, pri_t, const char *, int);
    517 int	mtsleep(wchan_t, pri_t, const char *, int, kmutex_t *);
    518 void	wakeup(wchan_t);
    519 int	kpause(const char *, bool, int, kmutex_t *);
    520 void	exit1(struct lwp *, int, int) __dead;
    521 int	kill1(struct lwp *l, pid_t pid, ksiginfo_t *ksi, register_t *retval);
    522 int	do_sys_wait(int *, int *, int, struct rusage *);
    523 int	do_sys_waitid(idtype_t, id_t, int *, int *, int, struct wrusage *,
    524 	    siginfo_t *);
    525 
    526 struct proc *proc_alloc(void);
    527 void	proc0_init(void);
    528 pid_t	proc_alloc_pid(struct proc *);
    529 void	proc_free_pid(pid_t);
    530 pid_t	proc_alloc_lwpid(struct proc *, struct lwp *);
    531 void	proc_free_lwpid(struct proc *, pid_t);
    532 void	proc_free_mem(struct proc *);
    533 void	exit_lwps(struct lwp *l);
    534 int	fork1(struct lwp *, int, int, void *, size_t,
    535 	    void (*)(void *), void *, register_t *);
    536 int	pgid_in_session(struct proc *, pid_t);
    537 void	cpu_lwp_fork(struct lwp *, struct lwp *, void *, size_t,
    538 	    void (*)(void *), void *);
    539 void	cpu_lwp_free(struct lwp *, int);
    540 void	cpu_lwp_free2(struct lwp *);
    541 void	cpu_spawn_return(struct lwp*);
    542 
    543 #ifdef __HAVE_SYSCALL_INTERN
    544 void	syscall_intern(struct proc *);
    545 #endif
    546 
    547 void	md_child_return(struct lwp *);
    548 void	child_return(void *);
    549 
    550 int	proc_isunder(struct proc *, struct lwp *);
    551 int	proc_uidmatch(kauth_cred_t, kauth_cred_t);
    552 
    553 int	proc_vmspace_getref(struct proc *, struct vmspace **);
    554 void	proc_crmod_leave(kauth_cred_t, kauth_cred_t, bool);
    555 void	proc_crmod_enter(void);
    556 int	proc_getauxv(struct proc *, void **, size_t *);
    557 
    558 int	proc_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
    559 void	proc_specific_key_delete(specificdata_key_t);
    560 void	proc_initspecific(struct proc *);
    561 void	proc_finispecific(struct proc *);
    562 void *	proc_getspecific(struct proc *, specificdata_key_t);
    563 void	proc_setspecific(struct proc *, specificdata_key_t, void *);
    564 int	proc_compare(const struct proc *, const struct lwp *,
    565     const struct proc *, const struct lwp *);
    566 
    567 /*
    568  * Special handlers for delivering EVFILT_PROC notifications.  These
    569  * exist to handle some of the special locking considerations around
    570  * processes.
    571  */
    572 void	knote_proc_exec(struct proc *);
    573 void	knote_proc_fork(struct proc *, struct proc *);
    574 void	knote_proc_exit(struct proc *);
    575 
    576 int	proclist_foreach_call(struct proclist *,
    577     int (*)(struct proc *, void *arg), void *);
    578 
    579 static __inline struct proc *
    580 _proclist_skipmarker(struct proc *p0)
    581 {
    582 	struct proc *p = p0;
    583 
    584 	while (p != NULL && p->p_flag & PK_MARKER)
    585 		p = LIST_NEXT(p, p_list);
    586 
    587 	return p;
    588 }
    589 
    590 #define PROC_PTRSZ(p) (((p)->p_flag & PK_32) ? sizeof(int) : sizeof(void *))
    591 #define PROC_REGSZ(p) (((p)->p_flag & PK_32) ? \
    592     sizeof(process_reg32) : sizeof(struct reg))
    593 #define PROC_FPREGSZ(p) (((p)->p_flag & PK_32) ? \
    594     sizeof(process_fpreg32) : sizeof(struct fpreg))
    595 #define PROC_DBREGSZ(p) (((p)->p_flag & PK_32) ? \
    596     sizeof(process_dbreg32) : sizeof(struct dbreg))
    597 
    598 #ifndef PROC_MACHINE_ARCH
    599 #define PROC_MACHINE_ARCH(p) machine_arch
    600 #endif
    601 
    602 /*
    603  * PROCLIST_FOREACH: iterate on the given proclist, skipping PK_MARKER ones.
    604  */
    605 #define	PROCLIST_FOREACH(var, head)					\
    606 	for ((var) = LIST_FIRST(head);					\
    607 		((var) = _proclist_skipmarker(var)) != NULL;		\
    608 		(var) = LIST_NEXT(var, p_list))
    609 
    610 #ifdef KSTACK_CHECK_MAGIC
    611 void	kstack_setup_magic(const struct lwp *);
    612 void	kstack_check_magic(const struct lwp *);
    613 #else
    614 #define	kstack_setup_magic(x)
    615 #define	kstack_check_magic(x)
    616 #endif
    617 
    618 extern struct emul emul_netbsd;
    619 
    620 #endif	/* _KERNEL */
    621 
    622 /*
    623  * Kernel stack parameters.
    624  *
    625  * KSTACK_LOWEST_ADDR: return the lowest address of the LWP's kernel stack,
    626  * excluding red-zone.
    627  *
    628  * KSTACK_SIZE: the size kernel stack for a LWP, excluding red-zone.
    629  *
    630  * if <machine/proc.h> provides the MD definition, it will be used.
    631  */
    632 #ifndef KSTACK_LOWEST_ADDR
    633 #define	KSTACK_LOWEST_ADDR(l)	((void *)ALIGN((struct pcb *)((l)->l_addr) + 1))
    634 #endif
    635 #ifndef KSTACK_SIZE
    636 #define	KSTACK_SIZE		(USPACE - ALIGN(sizeof(struct pcb)))
    637 #endif
    638 
    639 #endif	/* _KMEMUSER || _KERNEL */
    640 
    641 #endif	/* !_SYS_PROC_H_ */
    642