The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/proc.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: ed0a3edaf47a1e7b8b6132653ddafd5d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.