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.282 2008/10/22 11:14:33 ad Exp $    */
    2 
    3 /*-
    4  * Copyright (c) 2006, 2007, 2008 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 #if defined(_KERNEL_OPT)
   72 #include "opt_multiprocessor.h"
   73 #include "opt_kstack.h"
   74 #include "opt_lockdebug.h"
   75 #endif
   76 
   77 #include <machine/proc.h>               /* Machine-dependent proc substruct */
   78 #include <sys/aio.h>
   79 #include <sys/rwlock.h>
   80 #include <sys/mqueue.h>
   81 #include <sys/mutex.h>
   82 #include <sys/condvar.h>
   83 #include <sys/lwp.h>
   84 #include <sys/queue.h>
   85 #include <sys/signalvar.h>
   86 #include <sys/siginfo.h>
   87 #include <sys/event.h>
   88 #include <sys/specificdata.h>
   89 
   90 #ifndef _KERNEL
   91 #include <sys/time.h>
   92 #include <sys/resource.h>
   93 #endif
   94 
   95 /*
   96  * One structure allocated per session.
   97  */
   98 struct session {
   99         int             s_count;        /* Ref cnt; pgrps in session */
  100         u_int           s_flags;
  101 #define S_LOGIN_SET     1               /* s_login set in this session */
  102         struct proc     *s_leader;      /* Session leader */
  103         struct vnode    *s_ttyvp;       /* Vnode of controlling terminal */
  104         struct tty      *s_ttyp;        /* Controlling terminal */
  105         char            s_login[MAXLOGNAME]; /* Setlogin() name */
  106         pid_t           s_sid;          /* Session ID (pid of leader) */
  107 };
  108 
  109 /*
  110  * One structure allocated per process group.
  111  */
  112 struct pgrp {
  113         LIST_HEAD(, proc) pg_members;   /* Pointer to pgrp members */
  114         struct session  *pg_session;    /* Pointer to session */
  115         pid_t           pg_id;          /* Pgrp id */
  116         int             pg_jobc;        /*
  117                                          * Number of processes qualifying
  118                                          * pgrp for job control
  119                                          */
  120 };
  121 
  122 /*
  123  * One structure allocated per emulation.
  124  */
  125 struct exec_package;
  126 struct ps_strings;
  127 struct ras;
  128 struct kauth_cred;
  129 
  130 struct emul {
  131         const char      *e_name;        /* Symbolic name */
  132         const char      *e_path;        /* Extra emulation path (NULL if none)*/
  133 #ifndef __HAVE_MINIMAL_EMUL
  134         int             e_flags;        /* Miscellaneous flags, see above */
  135                                         /* Syscall handling function */
  136         const int       *e_errno;       /* Errno array */
  137         int             e_nosys;        /* Offset of the nosys() syscall */
  138         int             e_nsysent;      /* Number of system call entries */
  139 #endif
  140         struct sysent   *e_sysent;      /* System call array */
  141         const char * const *e_syscallnames; /* System call name array */
  142                                         /* Signal sending function */
  143         void            (*e_sendsig)(const struct ksiginfo *,
  144                                           const sigset_t *);
  145         void            (*e_trapsignal)(struct lwp *, struct ksiginfo *);
  146         int             (*e_tracesig)(struct proc *, int);
  147         char            *e_sigcode;     /* Start of sigcode */
  148         char            *e_esigcode;    /* End of sigcode */
  149                                         /* Set registers before execution */
  150         struct uvm_object **e_sigobject;/* shared sigcode object */
  151         void            (*e_setregs)(struct lwp *, struct exec_package *,
  152                                           u_long);
  153 
  154                                         /* Per-process hooks */
  155         void            (*e_proc_exec)(struct proc *, struct exec_package *);
  156         void            (*e_proc_fork)(struct proc *, struct proc *, int);
  157         void            (*e_proc_exit)(struct proc *);
  158         void            (*e_lwp_fork)(struct lwp *, struct lwp *);
  159         void            (*e_lwp_exit)(struct lwp *);
  160 
  161 #ifdef __HAVE_SYSCALL_INTERN
  162         void            (*e_syscall_intern)(struct proc *);
  163 #else
  164         void            (*e_syscall)(void);
  165 #endif
  166                                         /* Emulation specific sysctl data */
  167         struct sysctlnode *e_sysctlovly;
  168         int             (*e_fault)(struct proc *, vaddr_t, int);
  169 
  170         vaddr_t         (*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t);
  171 
  172         /* Emulation-specific hook for userspace page faults */
  173         int             (*e_usertrap)(struct lwp *, vaddr_t, void *);
  174 
  175         /* SA-related information */
  176         const struct sa_emul *e_sa;
  177 
  178         size_t          e_ucsize;       /* size of ucontext_t */
  179         void            (*e_startlwp)(void *);
  180 };
  181 
  182 /*
  183  * Emulation miscelaneous flags
  184  */
  185 #define EMUL_HAS_SYS___syscall  0x001   /* Has SYS___syscall */
  186 
  187 /*
  188  * Description of a process.
  189  *
  190  * This structure contains the information needed to manage a thread of
  191  * control, known in UN*X as a process; it has references to substructures
  192  * containing descriptions of things that the process uses, but may share
  193  * with related processes.  The process structure and the substructures
  194  * are always addressible except for those marked "(PROC ONLY)" below,
  195  * which might be addressible only on a processor on which the process
  196  * is running.
  197  *
  198  * Field markings and the corresponding locks (not yet fully implemented,
  199  * more a statement of intent):
  200  *
  201  * a:   p_auxlock
  202  * k:   ktrace_mutex
  203  * l:   proc_lock
  204  * t:   p_stmutex
  205  * p:   p_lock
  206  * q:   mqlist_mtx
  207  * ::   unlocked, stable
  208  */
  209 struct proc {
  210         LIST_ENTRY(proc) p_list;        /* l: List of all processes */
  211 
  212         kmutex_t        p_auxlock;      /* :: secondary, longer term lock */
  213         kmutex_t        *p_lock;        /* :: general mutex */
  214         kmutex_t        p_stmutex;      /* :: mutex on profiling state */
  215         krwlock_t       p_reflock;      /* p: lock for debugger, procfs */
  216         kcondvar_t      p_waitcv;       /* p: wait, stop CV on children */
  217         kcondvar_t      p_lwpcv;        /* p: wait, stop CV on LWPs */
  218       
  219         /* Substructures: */
  220         struct kauth_cred *p_cred;      /* p: Master copy of credentials */
  221         struct filedesc *p_fd;          /* :: Ptr to open files structure */
  222         struct cwdinfo  *p_cwdi;        /* :: cdir/rdir/cmask info */
  223         struct pstats   *p_stats;       /* :: Accounting/stats (PROC ONLY) */
  224         struct plimit   *p_limit;       /* :: Process limits */
  225         struct vmspace  *p_vmspace;     /* :: Address space */
  226         struct sigacts  *p_sigacts;     /* :: Process sigactions */
  227         struct aioproc  *p_aio;         /* p: Asynchronous I/O data */
  228         u_int           p_mqueue_cnt;   /* q: Count of open mqueues */
  229         specificdata_reference
  230                         p_specdataref;  /*    subsystem proc-specific data */
  231 
  232         int             p_exitsig;      /* l: signal to send to parent on exit */
  233         int             p_flag;         /* p: P_* flags */
  234         int             p_sflag;        /* p: PS_* flags */
  235         int             p_slflag;       /* s, l: PSL_* flags */
  236         int             p_lflag;        /* l: PL_* flags */
  237         int             p_stflag;       /* t: PST_* flags */
  238         char            p_stat;         /* p: S* process status. */
  239         char            p_trace_enabled;/* p: cached by syscall_intern() */
  240         char            p_pad1[2];      /*  unused */
  241 
  242         pid_t           p_pid;          /* :: Process identifier. */
  243         LIST_ENTRY(proc) p_pglist;      /* l: List of processes in pgrp. */
  244         struct proc     *p_pptr;        /* l: Pointer to parent process. */
  245         LIST_ENTRY(proc) p_sibling;     /* l: List of sibling processes. */
  246         LIST_HEAD(, proc) p_children;   /* l: List of children. */
  247         LIST_HEAD(, lwp) p_lwps;        /* p: List of LWPs. */
  248         struct ras      *p_raslist;     /* a: List of RAS entries */
  249 
  250 /* The following fields are all zeroed upon creation in fork. */
  251 #define p_startzero     p_nlwps
  252 
  253         int             p_nlwps;        /* p: Number of LWPs */
  254         int             p_nzlwps;       /* p: Number of zombie LWPs */
  255         int             p_nrlwps;       /* p: Number running/sleeping LWPs */
  256         int             p_nlwpwait;     /* p: Number of LWPs in lwp_wait1() */
  257         int             p_ndlwps;       /* p: Number of detached LWPs */
  258         int             p_nlwpid;       /* p: Next LWP ID */
  259         u_int           p_nstopchild;   /* l: Count of stopped/dead children */
  260         u_int           p_waited;       /* l: parent has waited on child */
  261         struct lwp      *p_zomblwp;     /* p: detached LWP to be reaped */
  262 
  263         struct sadata   *p_sa;          /* p: Scheduler activation info */
  264 
  265         /* scheduling */
  266         void            *p_sched_info;  /* p: Scheduler-specific structure */
  267         fixpt_t         p_estcpu;       /* p: Time avg. value of p_cpticks */
  268         fixpt_t         p_estcpu_inherited; /* p: cpu inherited from children */
  269         unsigned int    p_forktime;
  270         fixpt_t         p_pctcpu;       /* p: %cpu from dead LWPs */
  271 
  272         struct proc     *p_opptr;       /* l: save parent during ptrace. */
  273         struct ptimers  *p_timers;      /*    Timers: real, virtual, profiling */
  274         struct bintime  p_rtime;        /* p: real time */
  275         u_quad_t        p_uticks;       /* t: Statclock hits in user mode */
  276         u_quad_t        p_sticks;       /* t: Statclock hits in system mode */
  277         u_quad_t        p_iticks;       /* t: Statclock hits processing intr */
  278 
  279         int             p_traceflag;    /* k: Kernel trace points */
  280         int             p_timerpend;    /* p: Pending itimer to run */
  281         void            *p_tracep;      /* k: Trace private data */
  282         struct vnode    *p_textvp;      /* :: Vnode of executable */
  283 
  284         void         (*p_userret)(void);/* p: return-to-user hook */
  285         const struct emul *p_emul;      /* :: emulation information */
  286         void            *p_emuldata;    /* :: per-proc emul data, or NULL */
  287         const struct execsw *p_execsw;  /* :: exec package information */
  288         struct klist    p_klist;        /* p: knotes attached to proc */
  289 
  290         LIST_HEAD(, lwp) p_sigwaiters;  /* p: LWPs waiting for signals */
  291         sigstore_t      p_sigstore;     /* p: process-wide signal state */
  292         sigpend_t       p_sigpend;      /* p: pending signals */
  293         struct lcproc   *p_lwpctl;      /* p, a: _lwp_ctl() information */
  294         pid_t           p_ppid;         /* :: cached parent pid */
  295 
  296 /*
  297  * End area that is zeroed on creation
  298  */
  299 #define p_endzero       p_startcopy
  300 
  301 /*
  302  * The following fields are all copied upon creation in fork.
  303  */
  304 #define p_startcopy     p_sigctx
  305 
  306         struct sigctx   p_sigctx;       /* p: Shared signal state */
  307 
  308         u_char          p_nice;         /* p: Process "nice" value */
  309         char            p_comm[MAXCOMLEN+1];
  310                                         /* p: basename of last exec file */
  311         struct pgrp     *p_pgrp;        /* l: Pointer to process group */
  312 
  313         struct ps_strings *p_psstr;     /* :: address of process's ps_strings */
  314         size_t          p_psargv;       /* :: offset of ps_argvstr in above */
  315         size_t          p_psnargv;      /* :: offset of ps_nargvstr in above */
  316         size_t          p_psenv;        /* :: offset of ps_envstr in above */
  317         size_t          p_psnenv;       /* :: offset of ps_nenvstr in above */
  318         u_int           p_pax;          /* :: PAX flags */
  319 
  320 /*
  321  * End area that is copied on creation
  322  */
  323 #define p_endcopy       p_xstat
  324 
  325         u_short         p_xstat;        /* p: Exit status for wait; also stop signal */
  326         u_short         p_acflag;       /* p: Acc. flags; see struct lwp also */
  327         struct mdproc   p_md;           /* p: Any machine-dependent fields */
  328         vaddr_t         p_stackbase;    /* :: ASLR randomized stack base */
  329 };
  330 
  331 #define p_rlimit        p_limit->pl_rlimit
  332 #define p_session       p_pgrp->pg_session
  333 #define p_pgid          p_pgrp->pg_id
  334 
  335 /*
  336  * Status values.
  337  */
  338 #define SIDL            1               /* Process being created by fork */
  339 #define SACTIVE         2               /* Process is not stopped */
  340 #define SDYING          3               /* About to die */
  341 #define SSTOP           4               /* Process debugging or suspension */
  342 #define SZOMB           5               /* Awaiting collection by parent */
  343 #define SDEAD           6               /* Almost a zombie */
  344 
  345 #define P_ZOMBIE(p)     \
  346     ((p)->p_stat == SZOMB || (p)->p_stat == SDYING || (p)->p_stat == SDEAD)
  347 
  348 /*
  349  * These flags are kept in p_flag and are protected by p_lock.  Access from
  350  * process context only.
  351  */
  352 #define PK_ADVLOCK      0x00000001 /* Process may hold a POSIX advisory lock */
  353 #define PK_SYSTEM       0x00000002 /* System process (kthread) */
  354 #define PK_SYSVSEM      0x00000004 /* Used SysV semaphores */
  355 #define PK_SUGID        0x00000100 /* Had set id privileges since last exec */
  356 #define PK_EXEC         0x00004000 /* Process called exec */
  357 #define PK_NOCLDWAIT    0x00020000 /* No zombies if child dies */
  358 #define PK_32           0x00040000 /* 32-bit process (used on 64-bit kernels) */
  359 #define PK_CLDSIGIGN    0x00080000 /* Process is ignoring SIGCHLD */
  360 #define PK_MARKER       0x80000000 /* Is a dummy marker process */
  361 
  362 /*
  363  * These flags are kept in p_sflag and are protected by p_lock.  Access from
  364  * process context only.
  365  */
  366 #define PS_NOCLDSTOP    0x00000008 /* No SIGCHLD when children stop */
  367 #define PS_SA           0x00000400 /* Process using scheduler activations */
  368 #define PS_WCORE        0x00001000 /* Process needs to dump core */
  369 #define PS_WEXIT        0x00002000 /* Working on exiting */
  370 #define PS_STOPFORK     0x00800000 /* Child will be stopped on fork(2) */
  371 #define PS_STOPEXEC     0x01000000 /* Will be stopped on exec(2) */
  372 #define PS_STOPEXIT     0x02000000 /* Will be stopped at process exit */
  373 #define PS_NOTIFYSTOP   0x10000000 /* Notify parent of successful STOP */
  374 #define PS_NOSA         0x40000000 /* Do not enable SA */
  375 #define PS_STOPPING     0x80000000 /* Transitioning SACTIVE -> SSTOP */
  376 
  377 /*
  378  * These flags are kept in p_sflag and are protected by the proc_lock
  379  * and p_lock.  Access from process context only.
  380  */
  381 #define PSL_TRACED      0x00000800 /* Debugged process being traced */
  382 #define PSL_FSTRACE     0x00010000 /* Debugger process being traced by procfs */
  383 #define PSL_CHTRACED    0x00400000 /* Child has been traced & reparented */
  384 #define PSL_SYSCALL     0x04000000 /* process has PT_SYSCALL enabled */
  385 
  386 /*
  387  * Kept in p_stflag and protected by p_stmutex.
  388  */
  389 #define PST_PROFIL      0x00000020 /* Has started profiling */
  390 
  391 /*
  392  * The final set are protected by the proc_lock.  Access
  393  * from process context only.
  394  */
  395 #define PL_CONTROLT     0x00000002 /* Has a controlling terminal */
  396 #define PL_PPWAIT       0x00000010 /* Parent is waiting for child exec/exit */
  397 #define PL_ORPHANPG     0x20000000 /* Member of an orphaned pgrp */
  398 
  399 /*
  400  * Macro to compute the exit signal to be delivered.
  401  */
  402 #define P_EXITSIG(p)    \
  403     (((p)->p_slflag & (PSL_TRACED|PSL_FSTRACE)) ? SIGCHLD : p->p_exitsig)
  404 
  405 LIST_HEAD(proclist, proc);              /* A list of processes */
  406 
  407 /*
  408  * This structure associates a proclist with its lock.
  409  */
  410 struct proclist_desc {
  411         struct proclist *pd_list;       /* The list */
  412         /*
  413          * XXX Add a pointer to the proclist's lock eventually.
  414          */
  415 };
  416 
  417 #ifdef _KERNEL
  418 #include <sys/mallocvar.h>
  419 MALLOC_DECLARE(M_EMULDATA);
  420 MALLOC_DECLARE(M_PROC);
  421 MALLOC_DECLARE(M_SESSION);
  422 MALLOC_DECLARE(M_SUBPROC);      /* XXX - only used by sparc/sparc64 */
  423 
  424 /*
  425  * We use process IDs <= PID_MAX until there are > 16k processes.
  426  * NO_PGID is used to represent "no process group" for a tty.
  427  */
  428 #define PID_MAX         30000
  429 #define NO_PGID         ((pid_t)-1)
  430 
  431 #define SESS_LEADER(p)  ((p)->p_session->s_leader == (p))
  432 #define SESSHOLD(s)     ((s)->s_count++)
  433 #define SESSRELE(s)                                                     \
  434 do {                                                                    \
  435         if (--(s)->s_count == 0)                                        \
  436                 sessdelete(s);                                          \
  437 } while (/* CONSTCOND */ 0)
  438 
  439 
  440 /*
  441  * Flags passed to fork1().
  442  */
  443 #define FORK_PPWAIT     0x0001          /* Block parent until child exit */
  444 #define FORK_SHAREVM    0x0002          /* Share vmspace with parent */
  445 #define FORK_SHARECWD   0x0004          /* Share cdir/rdir/cmask */
  446 #define FORK_SHAREFILES 0x0008          /* Share file descriptors */
  447 #define FORK_SHARESIGS  0x0010          /* Share signal actions */
  448 #define FORK_NOWAIT     0x0020          /* Make init the parent of the child */
  449 #define FORK_CLEANFILES 0x0040          /* Start with a clean descriptor set */
  450 #define FORK_SYSTEM     0x0080          /* Fork a kernel thread */
  451 #define FORK_SHARELIMIT 0x0100          /* Share rlimit values */
  452 
  453 extern struct proc      proc0;          /* Process slot for swapper */
  454 extern u_int            nprocs;         /* Current number of procs */
  455 extern int              maxproc;        /* Max number of procs */
  456 #define vmspace_kernel()        (proc0.p_vmspace)
  457 
  458 extern kmutex_t         *proc_lock;
  459 extern struct proclist  allproc;        /* List of all processes */
  460 extern struct proclist  zombproc;       /* List of zombie processes */
  461 
  462 extern SLIST_HEAD(deadprocs, proc) deadprocs;   /* List of dead processes */
  463 extern struct simplelock deadproc_slock;
  464 
  465 extern struct proc      *initproc;      /* Process slots for init, pager */
  466 
  467 extern const struct proclist_desc proclists[];
  468 
  469 extern struct pool      ptimer_pool;    /* Memory pool for ptimers */
  470 
  471 struct proc *p_find(pid_t, uint);       /* Find process by id */
  472 struct pgrp *pg_find(pid_t, uint);      /* Find process group by id */
  473 /* Flags values for p_find() and pg_find(). */
  474 #define PFIND_ZOMBIE            1       /* look for zombies as well */
  475 #define PFIND_LOCKED            2       /* proclist locked on entry */
  476 #define PFIND_UNLOCK_FAIL       4       /* unlock proclist on failure */
  477 #define PFIND_UNLOCK_OK         8       /* unlock proclist on success */
  478 #define PFIND_UNLOCK            (PFIND_UNLOCK_OK | PFIND_UNLOCK_FAIL)
  479 /* For source compatibility. but UNLOCK_OK gives a stale answer... */
  480 #define pfind(pid) p_find((pid), PFIND_UNLOCK)
  481 #define pgfind(pgid) pg_find((pgid), PFIND_UNLOCK)
  482 
  483 struct simplelock;
  484 int     enterpgrp(struct proc *, pid_t, pid_t, int);
  485 void    leavepgrp(struct proc *);
  486 void    fixjobc(struct proc *, struct pgrp *, int);
  487 int     inferior(struct proc *, struct proc *);
  488 void    sessdelete(struct session *);
  489 void    yield(void);
  490 void    pgdelete(struct pgrp *);
  491 void    procinit(void);
  492 void    suspendsched(void);
  493 int     ltsleep(wchan_t, pri_t, const char *, int, volatile struct simplelock *);
  494 int     mtsleep(wchan_t, pri_t, const char *, int, kmutex_t *);
  495 void    wakeup(wchan_t);
  496 void    wakeup_one(wchan_t);
  497 int     kpause(const char *, bool, int, kmutex_t *);
  498 void    exit1(struct lwp *, int) __dead;
  499 int     do_sys_wait(struct lwp *, int *, int *, int, struct rusage *, int *);
  500 struct proc *proc_alloc(void);
  501 void    proc0_init(void);
  502 void    proc_free_pid(struct proc *);
  503 void    proc_free_mem(struct proc *);
  504 void    exit_lwps(struct lwp *l);
  505 int     fork1(struct lwp *, int, int, void *, size_t,
  506             void (*)(void *), void *, register_t *, struct proc **);
  507 int     pgid_in_session(struct proc *, pid_t);
  508 void    cpu_lwp_fork(struct lwp *, struct lwp *, void *, size_t,
  509             void (*)(void *), void *);
  510 #ifndef cpu_lwp_free
  511 void    cpu_lwp_free(struct lwp *, int);
  512 #ifndef cpu_lwp_free2
  513 void    cpu_lwp_free2(struct lwp *);
  514 #endif
  515 #endif
  516 
  517 #ifdef __HAVE_SYSCALL_INTERN
  518 void    syscall_intern(struct proc *);
  519 #endif
  520 
  521 void    child_return(void *);
  522 
  523 int     proc_isunder(struct proc *, struct lwp *);
  524 void    proc_stop(struct proc *, int, int);
  525 
  526 void    p_sugid(struct proc *);
  527 
  528 int     proc_vmspace_getref(struct proc *, struct vmspace **);
  529 void    proc_crmod_leave(kauth_cred_t, kauth_cred_t, bool);
  530 void    proc_crmod_enter(void);
  531 int     proc_addref(struct proc *);
  532 void    proc_delref(struct proc *);
  533 void    proc_drainrefs(struct proc *);
  534 
  535 int     proc_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
  536 void    proc_specific_key_delete(specificdata_key_t);
  537 void    proc_initspecific(struct proc *);
  538 void    proc_finispecific(struct proc *);
  539 void *  proc_getspecific(struct proc *, specificdata_key_t);
  540 void    proc_setspecific(struct proc *, specificdata_key_t, void *);
  541 
  542 int     proclist_foreach_call(struct proclist *,
  543     int (*)(struct proc *, void *arg), void *);
  544 static __inline struct proc *_proclist_skipmarker(struct proc *);
  545 
  546 static __inline struct proc *
  547 _proclist_skipmarker(struct proc *p0)
  548 {
  549         struct proc *p = p0;
  550 
  551         while (p != NULL && p->p_flag & PK_MARKER)
  552                 p = LIST_NEXT(p, p_list);
  553 
  554         return p;
  555 }
  556 #define PROCLIST_FOREACH(var, head)                                     \
  557         for ((var) = LIST_FIRST(head);                                  \
  558                 ((var) = _proclist_skipmarker(var)) != NULL;            \
  559                 (var) = LIST_NEXT(var, p_list))
  560 
  561 /* Compatibility with old, non-interlocked tsleep call */
  562 #define tsleep(chan, pri, wmesg, timo)                                  \
  563         ltsleep(chan, pri, wmesg, timo, NULL)
  564 
  565 #ifdef KSTACK_CHECK_MAGIC
  566 void kstack_setup_magic(const struct lwp *);
  567 void kstack_check_magic(const struct lwp *);
  568 #endif
  569 
  570 /*
  571  * kernel stack paramaters
  572  * XXX require sizeof(struct user)
  573  */
  574 /* the lowest address of kernel stack */
  575 #ifndef KSTACK_LOWEST_ADDR
  576 #define KSTACK_LOWEST_ADDR(l)   ((void *)ALIGN((l)->l_addr + 1))
  577 #endif
  578 /* size of kernel stack */
  579 #ifndef KSTACK_SIZE
  580 #define KSTACK_SIZE     (USPACE - ALIGN(sizeof(struct user)))
  581 #endif
  582 
  583 #endif  /* _KERNEL */
  584 #endif  /* !_SYS_PROC_H_ */

Cache object: f1b6a24c5fe30ab3fe1addc416aca54f


[ 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.