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 *
_proclist_skipmarker(struct proc * p0)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