1 /* $OpenBSD: proc.h,v 1.361 2024/05/20 10:32:20 claudio Exp $ */
2 /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */
3
4 /*-
5 * Copyright (c) 1986, 1989, 1991, 1993
6 * The Regents of the University of California. All rights reserved.
7 * (c) UNIX System Laboratories, Inc.
8 * All or some portions of this file are derived from material licensed
9 * to the University of California by American Telephone and Telegraph
10 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
11 * the permission of UNIX System Laboratories, Inc.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)proc.h 8.8 (Berkeley) 1/21/94
38 */
39
40 #ifndef _SYS_PROC_H_
41 #define _SYS_PROC_H_
42
43 #include <machine/proc.h> /* Machine-dependent proc substruct. */
44 #include <sys/selinfo.h> /* For struct selinfo */
45 #include <sys/syslimits.h> /* For LOGIN_NAME_MAX */
46 #include <sys/queue.h>
47 #include <sys/timeout.h> /* For struct timeout */
48 #include <sys/event.h> /* For struct klist */
49 #include <sys/mutex.h> /* For struct mutex */
50 #include <sys/resource.h> /* For struct rusage */
51 #include <sys/rwlock.h> /* For struct rwlock */
52 #include <sys/sigio.h> /* For struct sigio */
53
54 #ifdef _KERNEL
55 #include <sys/atomic.h>
56 #define __need_process
57 #endif
58
59 /*
60 * One structure allocated per session.
61 */
62 struct process;
63 struct session {
64 int s_count; /* Ref cnt; pgrps in session. */
65 struct process *s_leader; /* Session leader. */
66 struct vnode *s_ttyvp; /* Vnode of controlling terminal. */
67 struct tty *s_ttyp; /* Controlling terminal. */
68 char s_login[LOGIN_NAME_MAX]; /* Setlogin() name. */
69 pid_t s_verauthppid;
70 uid_t s_verauthuid;
71 struct timeout s_verauthto;
72 };
73
74 void zapverauth(/* struct session */ void *);
75
76 /*
77 * One structure allocated per process group.
78 */
79 struct pgrp {
80 LIST_ENTRY(pgrp) pg_hash; /* Hash chain. */
81 LIST_HEAD(, process) pg_members;/* Pointer to pgrp members. */
82 struct session *pg_session; /* Pointer to session. */
83 struct sigiolst pg_sigiolst; /* List of sigio structures. */
84 pid_t pg_id; /* Pgrp id. */
85 int pg_jobc; /* # procs qualifying pgrp for job control */
86 };
87
88 /*
89 * time usage: accumulated times in ticks
90 * Once a second, each thread's immediate counts (p_[usi]ticks) are
91 * accumulated into these.
92 */
93 struct tusage {
94 struct timespec tu_runtime; /* Realtime. */
95 uint64_t tu_uticks; /* Statclock hits in user mode. */
96 uint64_t tu_sticks; /* Statclock hits in system mode. */
97 uint64_t tu_iticks; /* Statclock hits processing intr. */
98 };
99
100 /*
101 * Description of a process.
102 *
103 * These structures contain the information needed to manage a thread of
104 * control, known in UN*X as a process; it has references to substructures
105 * containing descriptions of things that the process uses, but may share
106 * with related processes.
107 *
108 * struct process is the higher level process containing information
109 * shared by all threads in a process, while struct proc contains the
110 * run-time information needed by threads.
111 */
112 #ifdef __need_process
113 struct futex;
114 LIST_HEAD(futex_list, futex);
115 struct proc;
116 struct tslpentry;
117 TAILQ_HEAD(tslpqueue, tslpentry);
118 struct unveil;
119
120 struct pinsyscall {
121 vaddr_t pn_start;
122 vaddr_t pn_end;
123 u_int *pn_pins; /* array of offsets indexed by syscall# */
124 int pn_npins; /* number of entries in table */
125 };
126
127 /*
128 * Locks used to protect struct members in this file:
129 * I immutable after creation
130 * a atomic operations
131 * K kernel lock
132 * m this process' `ps_mtx'
133 * p this process' `ps_lock'
134 * R rlimit_lock
135 * S scheduler lock
136 * T itimer_mtx
137 */
138 struct process {
139 /*
140 * ps_mainproc is the original thread in the process.
141 * It's only still special for the handling of
142 * some signal and ptrace behaviors that need to be fixed.
143 */
144 struct proc *ps_mainproc;
145 struct ucred *ps_ucred; /* Process owner's identity. */
146
147 LIST_ENTRY(process) ps_list; /* List of all processes. */
148 TAILQ_HEAD(,proc) ps_threads; /* [K|m] Threads in this process. */
149
150 LIST_ENTRY(process) ps_pglist; /* List of processes in pgrp. */
151 struct process *ps_pptr; /* Pointer to parent process. */
152 LIST_ENTRY(process) ps_sibling; /* List of sibling processes. */
153 LIST_HEAD(, process) ps_children;/* Pointer to list of children. */
154 LIST_ENTRY(process) ps_hash; /* Hash chain. */
155
156 /*
157 * An orphan is the child that has been re-parented to the
158 * debugger as a result of attaching to it. Need to keep
159 * track of them for parent to be able to collect the exit
160 * status of what used to be children.
161 */
162 LIST_ENTRY(process) ps_orphan; /* List of orphan processes. */
163 LIST_HEAD(, process) ps_orphans;/* Pointer to list of orphans. */
164
165 struct sigiolst ps_sigiolst; /* List of sigio structures. */
166 struct sigacts *ps_sigacts; /* [I] Signal actions, state */
167 struct vnode *ps_textvp; /* Vnode of executable. */
168 struct filedesc *ps_fd; /* Ptr to open files structure */
169 struct vmspace *ps_vmspace; /* Address space */
170 pid_t ps_pid; /* Process identifier. */
171
172 struct futex_list ps_ftlist; /* futexes attached to this process */
173 struct tslpqueue ps_tslpqueue; /* [p] queue of threads in thrsleep */
174 struct rwlock ps_lock; /* per-process rwlock */
175 struct mutex ps_mtx; /* per-process mutex */
176
177 /* The following fields are all zeroed upon creation in process_new. */
178 #define ps_startzero ps_klist
179 struct klist ps_klist; /* knotes attached to this process */
180 u_int ps_flags; /* [a] PS_* flags. */
181 int ps_siglist; /* Signals pending for the process. */
182
183 struct proc *ps_single; /* [m] Thread for single-threading. */
184 u_int ps_singlecnt; /* [m] Number of threads to suspend. */
185 u_int ps_exitcnt; /* [m] Number of threads in exit1. */
186
187 int ps_traceflag; /* Kernel trace points. */
188 struct vnode *ps_tracevp; /* Trace to vnode. */
189 struct ucred *ps_tracecred; /* Creds for writing trace */
190
191 u_int ps_xexit; /* Exit status for wait */
192 int ps_xsig; /* Stopping or killing signal */
193
194 pid_t ps_ppid; /* [a] Cached parent pid */
195 pid_t ps_oppid; /* [a] Save parent pid during ptrace. */
196 int ps_ptmask; /* Ptrace event mask */
197 struct ptrace_state *ps_ptstat;/* Ptrace state */
198
199 struct rusage *ps_ru; /* sum of stats for dead threads. */
200 struct tusage ps_tu; /* accumulated times. */
201 struct rusage ps_cru; /* sum of stats for reaped children */
202 struct itimerspec ps_timer[3]; /* [m] ITIMER_REAL timer */
203 /* [T] ITIMER_{VIRTUAL,PROF} timers */
204 struct timeout ps_rucheck_to; /* [] resource limit check timer */
205 time_t ps_nextxcpu; /* when to send next SIGXCPU, */
206 /* in seconds of process runtime */
207
208 u_int64_t ps_wxcounter;
209
210 struct unveil *ps_uvpaths; /* unveil vnodes and names */
211 ssize_t ps_uvvcount; /* count of unveil vnodes held */
212 size_t ps_uvncount; /* count of unveil names allocated */
213 int ps_uvdone; /* no more unveil is permitted */
214
215 /* End area that is zeroed on creation. */
216 #define ps_endzero ps_startcopy
217
218 /* The following fields are all copied upon creation in process_new. */
219 #define ps_startcopy ps_limit
220 struct plimit *ps_limit; /* [m,R] Process limits. */
221 struct pgrp *ps_pgrp; /* Pointer to process group. */
222
223 char ps_comm[_MAXCOMLEN]; /* command name, incl NUL */
224
225 vaddr_t ps_strings; /* User pointers to argv/env */
226 vaddr_t ps_auxinfo; /* User pointer to auxinfo */
227 vaddr_t ps_timekeep; /* User pointer to timekeep */
228 vaddr_t ps_sigcode; /* [I] User pointer to signal code */
229 vaddr_t ps_sigcoderet; /* [I] User ptr to sigreturn retPC */
230 u_long ps_sigcookie; /* [I] */
231 u_int ps_rtableid; /* [a] Process routing table/domain. */
232 char ps_nice; /* Process "nice" value. */
233
234 struct uprof { /* profile arguments */
235 caddr_t pr_base; /* buffer base */
236 size_t pr_size; /* buffer size */
237 u_long pr_off; /* pc offset */
238 u_int pr_scale; /* pc scaling */
239 } ps_prof;
240
241 u_int32_t ps_acflag; /* Accounting flags. */
242
243 uint64_t ps_pledge; /* [m] pledge promises */
244 uint64_t ps_execpledge; /* [m] execpledge promises */
245
246 int64_t ps_kbind_cookie; /* [m] */
247 u_long ps_kbind_addr; /* [m] */
248 /* an address that can't be in userspace or kernelspace */
249 #define BOGO_PC (u_long)-1
250
251 struct pinsyscall ps_pin; /* static or ld.so */
252 struct pinsyscall ps_libcpin; /* libc.so, from pinsyscalls(2) */
253
254 /* End area that is copied on creation. */
255 #define ps_endcopy ps_threadcnt
256 u_int ps_threadcnt; /* [m] Number of threads. */
257
258 struct timespec ps_start; /* starting uptime. */
259 struct timeout ps_realit_to; /* [m] ITIMER_REAL timeout */
260 };
261
262 #define ps_session ps_pgrp->pg_session
263 #define ps_pgid ps_pgrp->pg_id
264
265 #endif /* __need_process */
266
267 /*
268 * These flags are kept in ps_flags.
269 */
270 #define PS_CONTROLT 0x00000001 /* Has a controlling terminal. */
271 #define PS_EXEC 0x00000002 /* Process called exec. */
272 #define PS_INEXEC 0x00000004 /* Process is doing an exec right now */
273 #define PS_EXITING 0x00000008 /* Process is exiting. */
274 #define PS_SUGID 0x00000010 /* Had set id privs since last exec. */
275 #define PS_SUGIDEXEC 0x00000020 /* last execve() was set[ug]id */
276 #define PS_PPWAIT 0x00000040 /* Parent waits for exec/exit. */
277 #define PS_ISPWAIT 0x00000080 /* Is parent of PPWAIT child. */
278 #define PS_PROFIL 0x00000100 /* Has started profiling. */
279 #define PS_TRACED 0x00000200 /* Being ptraced. */
280 #define PS_WAITED 0x00000400 /* Stopped proc was waited for. */
281 #define PS_COREDUMP 0x00000800 /* Busy coredumping */
282 #define PS_SINGLEEXIT 0x00001000 /* Other threads must die. */
283 #define PS_SINGLEUNWIND 0x00002000 /* Other threads must unwind. */
284 #define PS_NOZOMBIE 0x00004000 /* No signal or zombie at exit. */
285 #define PS_STOPPED 0x00008000 /* Just stopped, need sig to parent. */
286 #define PS_SYSTEM 0x00010000 /* No sigs, stats or swapping. */
287 #define PS_EMBRYO 0x00020000 /* New process, not yet fledged */
288 #define PS_ZOMBIE 0x00040000 /* Dead and ready to be waited for */
289 #define PS_NOBROADCASTKILL 0x00080000 /* Process excluded from kill -1. */
290 #define PS_PLEDGE 0x00100000 /* Has called pledge(2) */
291 #define PS_WXNEEDED 0x00200000 /* Process allowed to violate W^X */
292 #define PS_EXECPLEDGE 0x00400000 /* Has exec pledges */
293 #define PS_ORPHAN 0x00800000 /* Process is on an orphan list */
294 #define PS_CHROOT 0x01000000 /* Process is chrooted */
295 #define PS_NOBTCFI 0x02000000 /* No Branch Target CFI */
296 #define PS_ITIMER 0x04000000 /* Virtual interval timers running */
297 #define PS_PIN 0x08000000 /* ld.so or static syscall pin */
298 #define PS_LIBCPIN 0x10000000 /* libc.so syscall pin */
299
300 #define PS_BITS \
301 ("\20" "\01CONTROLT" "\02EXEC" "\03INEXEC" "\04EXITING" "\05SUGID" \
302 "\06SUGIDEXEC" "\07PPWAIT" "\010ISPWAIT" "\011PROFIL" "\012TRACED" \
303 "\013WAITED" "\014COREDUMP" "\015SINGLEEXIT" "\016SINGLEUNWIND" \
304 "\017NOZOMBIE" "\020STOPPED" "\021SYSTEM" "\022EMBRYO" "\023ZOMBIE" \
305 "\024NOBROADCASTKILL" "\025PLEDGE" "\026WXNEEDED" "\027EXECPLEDGE" \
306 "\030ORPHAN" "\031CHROOT" "\032NOBTCFI" "\033ITIMER")
307
308
309 struct kcov_dev;
310 struct lock_list_entry;
311 struct kqueue;
312
313 struct p_inentry {
314 u_long ie_serial;
315 vaddr_t ie_start;
316 vaddr_t ie_end;
317 };
318
319 /*
320 * Locks used to protect struct members in this file:
321 * I immutable after creation
322 * S scheduler lock
323 * U uidinfolk
324 * l read only reference, see lim_read_enter()
325 * o owned (modified only) by this thread
326 * m this proc's' `p->p_p->ps_mtx'
327 */
328 struct proc {
329 TAILQ_ENTRY(proc) p_runq; /* [S] current run/sleep queue */
330 LIST_ENTRY(proc) p_list; /* List of all threads. */
331
332 struct process *p_p; /* [I] The process of this thread. */
333 TAILQ_ENTRY(proc) p_thr_link; /* [K|m] Threads in a process linkage. */
334
335 TAILQ_ENTRY(proc) p_fut_link; /* Threads in a futex linkage. */
336 struct futex *p_futex; /* Current sleeping futex. */
337
338 /* substructures: */
339 struct filedesc *p_fd; /* copy of p_p->ps_fd */
340 struct vmspace *p_vmspace; /* [I] copy of p_p->ps_vmspace */
341 struct p_inentry p_spinentry; /* [o] cache for SP check */
342
343 int p_flag; /* P_* flags. */
344 u_char p_spare; /* unused */
345 char p_stat; /* [S] S* process status. */
346 u_char p_runpri; /* [S] Runqueue priority */
347 u_char p_descfd; /* if not 255, fdesc permits this fd */
348
349 pid_t p_tid; /* Thread identifier. */
350 LIST_ENTRY(proc) p_hash; /* Hash chain. */
351
352 /* The following fields are all zeroed upon creation in fork. */
353 #define p_startzero p_dupfd
354 int p_dupfd; /* Sideways return value from filedescopen. XXX */
355
356 /* scheduling */
357 int p_cpticks; /* Ticks of cpu time. */
358 const volatile void *p_wchan; /* [S] Sleep address. */
359 struct timeout p_sleep_to;/* timeout for tsleep() */
360 const char *p_wmesg; /* [S] Reason for sleep. */
361 fixpt_t p_pctcpu; /* [S] %cpu for this thread */
362 u_int p_slptime; /* [S] Time since last blocked. */
363 u_int p_uticks; /* Statclock hits in user mode. */
364 u_int p_sticks; /* Statclock hits in system mode. */
365 u_int p_iticks; /* Statclock hits processing intr. */
366 struct cpu_info * volatile p_cpu; /* [S] CPU we're running on. */
367
368 struct rusage p_ru; /* Statistics */
369 struct tusage p_tu; /* accumulated times. */
370
371 struct plimit *p_limit; /* [l] read ref. of p_p->ps_limit */
372 struct kcov_dev *p_kd; /* kcov device handle */
373 struct lock_list_entry *p_sleeplocks; /* WITNESS lock tracking */
374 struct kqueue *p_kq; /* [o] select/poll queue of evts */
375 unsigned long p_kq_serial; /* [o] to check against enqueued evts */
376
377 int p_siglist; /* [a] Signals arrived & not delivered*/
378
379 /* End area that is zeroed on creation. */
380 #define p_endzero p_startcopy
381
382 /* The following fields are all copied upon creation in fork. */
383 #define p_startcopy p_sigmask
384 sigset_t p_sigmask; /* [o] Current signal mask */
385
386 char p_name[_MAXCOMLEN]; /* thread name, incl NUL */
387 u_char p_slppri; /* [S] Sleeping priority */
388 u_char p_usrpri; /* [S] Priority based on p_estcpu & ps_nice */
389 u_int p_estcpu; /* [S] Time averaged val of p_cpticks */
390 int p_pledge_syscall; /* Cache of current syscall */
391
392 struct ucred *p_ucred; /* [o] cached credentials */
393 struct sigaltstack p_sigstk; /* sp & on stack state variable */
394
395 u_long p_prof_addr; /* tmp storage for profiling addr until AST */
396 u_long p_prof_ticks; /* tmp storage for profiling ticks until AST */
397
398 /* End area that is copied on creation. */
399 #define p_endcopy p_addr
400 struct user *p_addr; /* Kernel virtual addr of u-area */
401 struct mdproc p_md; /* Any machine-dependent fields. */
402
403 sigset_t p_oldmask; /* [o] Saved mask from before sigpause */
404 int p_sisig; /* For core dump/debugger XXX */
405 union sigval p_sigval; /* For core dump/debugger XXX */
406 long p_sitrapno; /* For core dump/debugger XXX */
407 int p_sicode; /* For core dump/debugger XXX */
408 };
409
410 /* Status values. */
411 #define SIDL 1 /* Thread being created by fork. */
412 #define SRUN 2 /* Currently runnable. */
413 #define SSLEEP 3 /* Sleeping on an address. */
414 #define SSTOP 4 /* Debugging or suspension. */
415 #define SZOMB 5 /* unused */
416 #define SDEAD 6 /* Thread is almost gone */
417 #define SONPROC 7 /* Thread is currently on a CPU. */
418
419 #define P_ZOMBIE(p) ((p)->p_stat == SDEAD)
420 #define P_HASSIBLING(p) ((p)->p_p->ps_threadcnt > 1)
421
422 /*
423 * These flags are per-thread and kept in p_flag
424 */
425 #define P_INKTR 0x00000001 /* In a ktrace op, don't recurse */
426 #define P_PROFPEND 0x00000002 /* SIGPROF needs to be posted */
427 #define P_ALRMPEND 0x00000004 /* SIGVTALRM needs to be posted */
428 #define P_SIGSUSPEND 0x00000008 /* Need to restore before-suspend mask*/
429 #define P_CANTSLEEP 0x00000010 /* insomniac thread */
430 #define P_WSLEEP 0x00000020 /* Working on going to sleep. */
431 #define P_SINTR 0x00000080 /* Sleep is interruptible. */
432 #define P_SYSTEM 0x00000200 /* No sigs, stats or swapping. */
433 #define P_TIMEOUT 0x00000400 /* Timing out during sleep. */
434 #define P_WEXIT 0x00002000 /* Working on exiting. */
435 #define P_OWEUPC 0x00008000 /* Owe proc an addupc() at next ast. */
436 #define P_SUSPSINGLE 0x00080000 /* Need to stop for single threading. */
437 #define P_CONTINUED 0x00800000 /* Proc has continued from a stopped state. */
438 #define P_THREAD 0x04000000 /* Only a thread, not a real process */
439 #define P_SUSPSIG 0x08000000 /* Stopped from signal. */
440 #define P_CPUPEG 0x40000000 /* Do not move to another cpu. */
441
442 #define P_BITS \
443 ("\20" "\01INKTR" "\02PROFPEND" "\03ALRMPEND" "\04SIGSUSPEND" \
444 "\05CANTSLEEP" "\06WSLEEP" "\010SINTR" "\012SYSTEM" "\013TIMEOUT" \
445 "\016WEXIT" "\020OWEUPC" "\024SUSPSINGLE" "\027XX" \
446 "\030CONTINUED" "\033THREAD" "\034SUSPSIG" "\035SOFTDEP" "\037CPUPEG")
447
448 #define THREAD_PID_OFFSET 100000
449
450 #ifdef _KERNEL
451
452 struct uidinfo {
453 LIST_ENTRY(uidinfo) ui_hash; /* [U] */
454 uid_t ui_uid; /* [I] */
455 long ui_proccnt; /* [U] proc structs */
456 long ui_lockcnt; /* [U] lockf structs */
457 };
458
459 struct uidinfo *uid_find(uid_t);
460 void uid_release(struct uidinfo *);
461
462 /*
463 * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t,
464 * as it is used to represent "no process group".
465 * We set PID_MAX to 99999 to keep it in 5 columns in ps
466 * When exposed to userspace, thread IDs have THREAD_PID_OFFSET
467 * added to keep them from overlapping the PID range. For them,
468 * we use a * a (0 .. 2^n] range for cheapness, picking 'n' such
469 * that 2^n + THREAD_PID_OFFSET and THREAD_PID_OFFSET have
470 * the same number of columns when printed.
471 */
472 #define PID_MAX 99999
473 #define TID_MASK 0x7ffff
474
475 #define NO_PID (PID_MAX+1)
476
477 #define SESS_LEADER(pr) ((pr)->ps_session->s_leader == (pr))
478 #define SESSHOLD(s) ((s)->s_count++)
479 #define SESSRELE(s) do { \
480 if (--(s)->s_count == 0) { \
481 timeout_del(&(s)->s_verauthto); \
482 pool_put(&session_pool, (s)); \
483 } \
484 } while (/* CONSTCOND */ 0)
485
486 /*
487 * Flags to fork1().
488 */
489 #define FORK_FORK 0x00000001
490 #define FORK_VFORK 0x00000002
491 #define FORK_IDLE 0x00000004
492 #define FORK_PPWAIT 0x00000008
493 #define FORK_SHAREFILES 0x00000010
494 #define FORK_SYSTEM 0x00000020
495 #define FORK_NOZOMBIE 0x00000040
496 #define FORK_SHAREVM 0x00000080
497 #define FORK_PTRACE 0x00000400
498
499 #define EXIT_NORMAL 0x00000001
500 #define EXIT_THREAD 0x00000002
501 #define EXIT_THREAD_NOCHECK 0x00000003
502
503 #define TIDHASH(tid) (&tidhashtbl[(tid) & tidhash])
504 extern LIST_HEAD(tidhashhead, proc) *tidhashtbl;
505 extern u_long tidhash;
506
507 #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash])
508 extern LIST_HEAD(pidhashhead, process) *pidhashtbl;
509 extern u_long pidhash;
510
511 #define PGRPHASH(pgid) (&pgrphashtbl[(pgid) & pgrphash])
512 extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl;
513 extern u_long pgrphash;
514
515 extern struct proc proc0; /* Process slot for swapper. */
516 extern struct process process0; /* Process slot for kernel threads. */
517 extern int nprocesses, maxprocess; /* Cur and max number of processes. */
518 extern int nthreads, maxthread; /* Cur and max number of threads. */
519
520 LIST_HEAD(proclist, proc);
521 LIST_HEAD(processlist, process);
522 extern struct processlist allprocess; /* List of all processes. */
523 extern struct processlist zombprocess; /* List of zombie processes. */
524 extern struct proclist allproc; /* List of all threads. */
525
526 extern struct process *initprocess; /* Process slot for init. */
527 extern struct proc *reaperproc; /* Thread slot for reaper. */
528 extern struct proc *syncerproc; /* filesystem syncer daemon */
529
530 extern struct pool process_pool; /* memory pool for processes */
531 extern struct pool proc_pool; /* memory pool for procs */
532 extern struct pool rusage_pool; /* memory pool for zombies */
533 extern struct pool ucred_pool; /* memory pool for ucreds */
534 extern struct pool session_pool; /* memory pool for sessions */
535 extern struct pool pgrp_pool; /* memory pool for pgrps */
536
537 void freepid(pid_t);
538
539 struct process *prfind(pid_t); /* Find process by id. */
540 struct process *zombiefind(pid_t); /* Find zombie process by id. */
541 struct proc *tfind(pid_t); /* Find thread by id. */
542 struct pgrp *pgfind(pid_t); /* Find process group by id. */
543 struct proc *tfind_user(pid_t, struct process *);
544 /* Find thread by userspace id. */
545 void proc_printit(struct proc *p, const char *modif,
546 int (*pr)(const char *, ...));
547
548 int chgproccnt(uid_t uid, int diff);
549 void enternewpgrp(struct process *, struct pgrp *, struct session *);
550 void enterthispgrp(struct process *, struct pgrp *);
551 int inferior(struct process *, struct process *);
552 void leavepgrp(struct process *);
553 void killjobc(struct process *);
554 void preempt(void);
555 void procinit(void);
556 void setpriority(struct proc *, uint32_t, uint8_t);
557 void setrunnable(struct proc *);
558 void endtsleep(void *);
559 int wakeup_proc(struct proc *, int);
560 void unsleep(struct proc *);
561 void reaper(void *);
562 __dead void exit1(struct proc *, int, int, int);
563 void exit2(struct proc *);
564 void cpu_fork(struct proc *_curp, struct proc *_child, void *_stack,
565 void *_tcb, void (*_func)(void *), void *_arg);
566 void cpu_exit(struct proc *);
567 void process_initialize(struct process *, struct proc *);
568 int fork1(struct proc *_curp, int _flags, void (*_func)(void *),
569 void *_arg, register_t *_retval, struct proc **_newprocp);
570 int thread_fork(struct proc *_curp, void *_stack, void *_tcb,
571 pid_t *_tidptr, register_t *_retval);
572 int groupmember(gid_t, struct ucred *);
573 void dorefreshcreds(struct process *, struct proc *);
574 void dosigsuspend(struct proc *, sigset_t);
575
576 static inline void
refreshcreds(struct proc * p)577 refreshcreds(struct proc *p)
578 {
579 struct process *pr = p->p_p;
580
581 /* this is an unlocked access to ps_ucred, but the result is benign */
582 if (pr->ps_ucred != p->p_ucred)
583 dorefreshcreds(pr, p);
584 }
585
586 #define SINGLE_SUSPEND 0x01 /* other threads to stop wherever they are */
587 #define SINGLE_UNWIND 0x02 /* other threads to unwind and stop */
588 #define SINGLE_EXIT 0x03 /* other threads to unwind and then exit */
589 #define SINGLE_MASK 0x0f
590 /* extra flags for single_thread_set */
591 #define SINGLE_DEEP 0x10 /* call is in deep */
592 #define SINGLE_NOWAIT 0x20 /* do not wait for other threads to stop */
593
594 int single_thread_set(struct proc *, int);
595 int single_thread_wait(struct process *, int);
596 void single_thread_clear(struct proc *, int);
597 int single_thread_check(struct proc *, int);
598
599 void child_return(void *);
600
601 int proc_cansugid(struct proc *);
602
603 struct cond {
604 unsigned int c_wait; /* [a] initialized and waiting */
605 };
606
607 #define COND_INITIALIZER() { .c_wait = 1 }
608
609 void proc_trampoline_mi(void);
610
611 /*
612 * functions to handle sets of cpus.
613 *
614 * For now we keep the cpus in ints so that we can use the generic
615 * atomic ops.
616 */
617 #define CPUSET_ASIZE(x) (((x) - 1)/32 + 1)
618 #define CPUSET_SSIZE CPUSET_ASIZE(MAXCPUS)
619 struct cpuset {
620 int cs_set[CPUSET_SSIZE];
621 };
622
623 void cpuset_init_cpu(struct cpu_info *);
624
625 void cpuset_clear(struct cpuset *);
626 void cpuset_add(struct cpuset *, struct cpu_info *);
627 void cpuset_del(struct cpuset *, struct cpu_info *);
628 int cpuset_isset(struct cpuset *, struct cpu_info *);
629 void cpuset_add_all(struct cpuset *);
630 void cpuset_copy(struct cpuset *, struct cpuset *);
631 void cpuset_union(struct cpuset *, struct cpuset *, struct cpuset *);
632 void cpuset_intersection(struct cpuset *t, struct cpuset *, struct cpuset *);
633 void cpuset_complement(struct cpuset *, struct cpuset *, struct cpuset *);
634 int cpuset_cardinality(struct cpuset *);
635 struct cpu_info *cpuset_first(struct cpuset *);
636
637 #endif /* _KERNEL */
638 #endif /* !_SYS_PROC_H_ */
639
640