[BACK]Return to proc.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / sys

Annotation of src/sys/sys/proc.h, Revision 1.322

1.322   ! martin      1: /*     $NetBSD: proc.h,v 1.321 2015/03/07 16:34:55 christos Exp $      */
1.233     ad          2:
                      3: /*-
1.270     ad          4:  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
1.233     ad          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:  */
1.29      cgd        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.
1.168     agc        49:  * 3. Neither the name of the University nor the names of its contributors
1.29      cgd        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:  *
1.59      fvdl       65:  *     @(#)proc.h      8.15 (Berkeley) 5/19/95
1.29      cgd        66:  */
                     67:
                     68: #ifndef _SYS_PROC_H_
                     69: #define        _SYS_PROC_H_
1.57      mrg        70:
1.319     dsl        71: #include <sys/lwp.h>
                     72:
                     73: #if defined(_KMEMUSER) || defined(_KERNEL)
                     74:
1.131     mrg        75: #if defined(_KERNEL_OPT)
1.83      thorpej    76: #include "opt_multiprocessor.h"
1.139     yamt       77: #include "opt_kstack.h"
1.224     yamt       78: #include "opt_lockdebug.h"
1.83      thorpej    79: #endif
                     80:
1.122     lukem      81: #include <machine/proc.h>              /* Machine-dependent proc substruct */
1.318     msaitoh    82: #include <machine/pcb.h>
1.245     rmind      83: #include <sys/aio.h>
1.233     ad         84: #include <sys/rwlock.h>
1.254     rmind      85: #include <sys/mqueue.h>
1.233     ad         86: #include <sys/mutex.h>
                     87: #include <sys/condvar.h>
1.32      mycroft    88: #include <sys/queue.h>
1.118     jdolecek   89: #include <sys/signalvar.h>
1.170     christos   90: #include <sys/siginfo.h>
1.147     jdolecek   91: #include <sys/event.h>
1.228     thorpej    92: #include <sys/specificdata.h>
1.29      cgd        93:
1.220     yamt       94: #ifndef _KERNEL
                     95: #include <sys/time.h>
                     96: #include <sys/resource.h>
                     97: #endif
                     98:
1.29      cgd        99: /*
                    100:  * One structure allocated per session.
                    101:  */
1.122     lukem     102: struct session {
                    103:        int             s_count;        /* Ref cnt; pgrps in session */
1.159     dsl       104:        u_int           s_flags;
                    105: #define        S_LOGIN_SET     1               /* s_login set in this session */
1.122     lukem     106:        struct proc     *s_leader;      /* Session leader */
                    107:        struct vnode    *s_ttyvp;       /* Vnode of controlling terminal */
                    108:        struct tty      *s_ttyp;        /* Controlling terminal */
                    109:        char            s_login[MAXLOGNAME]; /* Setlogin() name */
                    110:        pid_t           s_sid;          /* Session ID (pid of leader) */
1.29      cgd       111: };
                    112:
                    113: /*
                    114:  * One structure allocated per process group.
                    115:  */
1.122     lukem     116: struct pgrp {
                    117:        LIST_HEAD(, proc) pg_members;   /* Pointer to pgrp members */
                    118:        struct session  *pg_session;    /* Pointer to session */
                    119:        pid_t           pg_id;          /* Pgrp id */
                    120:        int             pg_jobc;        /*
                    121:                                         * Number of processes qualifying
                    122:                                         * pgrp for job control
                    123:                                         */
1.29      cgd       124: };
                    125:
                    126: /*
1.40      christos  127:  * One structure allocated per emulation.
                    128:  */
                    129: struct exec_package;
1.144     gmcgarry  130: struct ras;
1.221     elad      131: struct kauth_cred;
1.40      christos  132:
1.122     lukem     133: struct emul {
                    134:        const char      *e_name;        /* Symbolic name */
                    135:        const char      *e_path;        /* Extra emulation path (NULL if none)*/
1.130     manu      136: #ifndef __HAVE_MINIMAL_EMUL
1.129     manu      137:        int             e_flags;        /* Miscellaneous flags, see above */
1.116     mycroft   138:                                        /* Syscall handling function */
1.122     lukem     139:        const int       *e_errno;       /* Errno array */
                    140:        int             e_nosys;        /* Offset of the nosys() syscall */
                    141:        int             e_nsysent;      /* Number of system call entries */
1.116     mycroft   142: #endif
1.282     ad        143:        struct sysent   *e_sysent;      /* System call array */
1.122     lukem     144:        const char * const *e_syscallnames; /* System call name array */
1.120     jdolecek  145:                                        /* Signal sending function */
1.196     perry     146:        void            (*e_sendsig)(const struct ksiginfo *,
                    147:                                          const sigset_t *);
1.233     ad        148:        void            (*e_trapsignal)(struct lwp *, struct ksiginfo *);
1.196     perry     149:        int             (*e_tracesig)(struct proc *, int);
1.122     lukem     150:        char            *e_sigcode;     /* Start of sigcode */
                    151:        char            *e_esigcode;    /* End of sigcode */
1.134     jdolecek  152:                                        /* Set registers before execution */
1.169     chs       153:        struct uvm_object **e_sigobject;/* shared sigcode object */
1.196     perry     154:        void            (*e_setregs)(struct lwp *, struct exec_package *,
1.294     matt      155:                                          vaddr_t);
1.106     jdolecek  156:
1.112     jdolecek  157:                                        /* Per-process hooks */
1.196     perry     158:        void            (*e_proc_exec)(struct proc *, struct exec_package *);
1.298     chs       159:        void            (*e_proc_fork)(struct proc *, struct lwp *, int);
1.196     perry     160:        void            (*e_proc_exit)(struct proc *);
                    161:        void            (*e_lwp_fork)(struct lwp *, struct lwp *);
                    162:        void            (*e_lwp_exit)(struct lwp *);
1.112     jdolecek  163:
1.116     mycroft   164: #ifdef __HAVE_SYSCALL_INTERN
1.196     perry     165:        void            (*e_syscall_intern)(struct proc *);
1.116     mycroft   166: #else
1.196     perry     167:        void            (*e_syscall)(void);
1.116     mycroft   168: #endif
1.180     atatat    169:                                        /* Emulation specific sysctl data */
                    170:        struct sysctlnode *e_sysctlovly;
1.217     drochner  171:        int             (*e_fault)(struct proc *, vaddr_t, int);
1.198     fvdl      172:
                    173:        vaddr_t         (*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t);
1.200     fvdl      174:
                    175:        /* Emulation-specific hook for userspace page faults */
                    176:        int             (*e_usertrap)(struct lwp *, vaddr_t, void *);
1.218     cube      177:
1.233     ad        178:        size_t          e_ucsize;       /* size of ucontext_t */
1.239     cube      179:        void            (*e_startlwp)(void *);
1.321     christos  180:
                    181:        /* Dtrace syscall probe */
                    182:        void            (*e_dtrace_syscall)(uint32_t, register_t,
                    183:                            const struct sysent *, const void *,
                    184:                            const register_t *, int);
1.40      christos  185: };
                    186:
1.197     perry     187: /*
1.127     manu      188:  * Emulation miscelaneous flags
                    189:  */
1.122     lukem     190: #define        EMUL_HAS_SYS___syscall  0x001   /* Has SYS___syscall */
1.114     mycroft   191:
1.40      christos  192: /*
1.29      cgd       193:  * Description of a process.
                    194:  *
                    195:  * This structure contains the information needed to manage a thread of
                    196:  * control, known in UN*X as a process; it has references to substructures
                    197:  * containing descriptions of things that the process uses, but may share
                    198:  * with related processes.  The process structure and the substructures
                    199:  * are always addressible except for those marked "(PROC ONLY)" below,
                    200:  * which might be addressible only on a processor on which the process
                    201:  * is running.
1.175     dsl       202:  *
1.307     rmind     203:  * Field markings and the corresponding locks:
1.223     ad        204:  *
1.268     ad        205:  * a:  p_auxlock
1.233     ad        206:  * k:  ktrace_mutex
1.272     ad        207:  * l:  proc_lock
1.233     ad        208:  * t:  p_stmutex
1.273     ad        209:  * p:  p_lock
1.307     rmind     210:  * (:  updated atomically
1.270     ad        211:  * ::  unlocked, stable
1.29      cgd       212:  */
1.308     uebayasi  213: struct vmspace;
                    214:
1.122     lukem     215: struct proc {
1.272     ad        216:        LIST_ENTRY(proc) p_list;        /* l: List of all processes */
1.122     lukem     217:
1.268     ad        218:        kmutex_t        p_auxlock;      /* :: secondary, longer term lock */
1.273     ad        219:        kmutex_t        *p_lock;        /* :: general mutex */
1.233     ad        220:        kmutex_t        p_stmutex;      /* :: mutex on profiling state */
1.260     ad        221:        krwlock_t       p_reflock;      /* p: lock for debugger, procfs */
1.273     ad        222:        kcondvar_t      p_waitcv;       /* p: wait, stop CV on children */
                    223:        kcondvar_t      p_lwpcv;        /* p: wait, stop CV on LWPs */
1.317     rmind     224:
1.122     lukem     225:        /* Substructures: */
1.233     ad        226:        struct kauth_cred *p_cred;      /* p: Master copy of credentials */
1.270     ad        227:        struct filedesc *p_fd;          /* :: Ptr to open files structure */
                    228:        struct cwdinfo  *p_cwdi;        /* :: cdir/rdir/cmask info */
                    229:        struct pstats   *p_stats;       /* :: Accounting/stats (PROC ONLY) */
                    230:        struct plimit   *p_limit;       /* :: Process limits */
                    231:        struct vmspace  *p_vmspace;     /* :: Address space */
                    232:        struct sigacts  *p_sigacts;     /* :: Process sigactions */
1.245     rmind     233:        struct aioproc  *p_aio;         /* p: Asynchronous I/O data */
1.307     rmind     234:        u_int           p_mqueue_cnt;   /* (: Count of open message queues */
1.228     thorpej   235:        specificdata_reference
1.270     ad        236:                        p_specdataref;  /*    subsystem proc-specific data */
1.228     thorpej   237:
1.233     ad        238:        int             p_exitsig;      /* l: signal to send to parent on exit */
1.289     yamt      239:        int             p_flag;         /* p: PK_* flags */
1.273     ad        240:        int             p_sflag;        /* p: PS_* flags */
1.233     ad        241:        int             p_slflag;       /* s, l: PSL_* flags */
                    242:        int             p_lflag;        /* l: PL_* flags */
                    243:        int             p_stflag;       /* t: PST_* flags */
1.273     ad        244:        char            p_stat;         /* p: S* process status. */
                    245:        char            p_trace_enabled;/* p: cached by syscall_intern() */
1.270     ad        246:        char            p_pad1[2];      /*  unused */
1.122     lukem     247:
1.270     ad        248:        pid_t           p_pid;          /* :: Process identifier. */
1.176     dsl       249:        LIST_ENTRY(proc) p_pglist;      /* l: List of processes in pgrp. */
                    250:        struct proc     *p_pptr;        /* l: Pointer to parent process. */
                    251:        LIST_ENTRY(proc) p_sibling;     /* l: List of sibling processes. */
1.233     ad        252:        LIST_HEAD(, proc) p_children;   /* l: List of children. */
1.273     ad        253:        LIST_HEAD(, lwp) p_lwps;        /* p: List of LWPs. */
1.268     ad        254:        struct ras      *p_raslist;     /* a: List of RAS entries */
1.29      cgd       255:
1.153     thorpej   256: /* The following fields are all zeroed upon creation in fork. */
                    257: #define        p_startzero     p_nlwps
                    258:
1.273     ad        259:        int             p_nlwps;        /* p: Number of LWPs */
                    260:        int             p_nzlwps;       /* p: Number of zombie LWPs */
                    261:        int             p_nrlwps;       /* p: Number running/sleeping LWPs */
                    262:        int             p_nlwpwait;     /* p: Number of LWPs in lwp_wait1() */
                    263:        int             p_ndlwps;       /* p: Number of detached LWPs */
                    264:        int             p_nlwpid;       /* p: Next LWP ID */
1.272     ad        265:        u_int           p_nstopchild;   /* l: Count of stopped/dead children */
                    266:        u_int           p_waited;       /* l: parent has waited on child */
1.273     ad        267:        struct lwp      *p_zomblwp;     /* p: detached LWP to be reaped */
1.317     rmind     268:        struct lwp      *p_vforklwp;    /* p: parent LWP waiting at vfork() */
1.29      cgd       269:
1.153     thorpej   270:        /* scheduling */
1.273     ad        271:        void            *p_sched_info;  /* p: Scheduler-specific structure */
                    272:        fixpt_t         p_estcpu;       /* p: Time avg. value of p_cpticks */
                    273:        fixpt_t         p_estcpu_inherited; /* p: cpu inherited from children */
1.210     yamt      274:        unsigned int    p_forktime;
1.273     ad        275:        fixpt_t         p_pctcpu;       /* p: %cpu from dead LWPs */
1.197     perry     276:
1.233     ad        277:        struct proc     *p_opptr;       /* l: save parent during ptrace. */
                    278:        struct ptimers  *p_timers;      /*    Timers: real, virtual, profiling */
1.273     ad        279:        struct bintime  p_rtime;        /* p: real time */
1.233     ad        280:        u_quad_t        p_uticks;       /* t: Statclock hits in user mode */
                    281:        u_quad_t        p_sticks;       /* t: Statclock hits in system mode */
                    282:        u_quad_t        p_iticks;       /* t: Statclock hits processing intr */
                    283:
                    284:        int             p_traceflag;    /* k: Kernel trace points */
                    285:        void            *p_tracep;      /* k: Trace private data */
1.270     ad        286:        struct vnode    *p_textvp;      /* :: Vnode of executable */
1.233     ad        287:
1.283     ad        288:        struct emul     *p_emul;        /* :: emulation information */
1.270     ad        289:        void            *p_emuldata;    /* :: per-proc emul data, or NULL */
                    290:        const struct execsw *p_execsw;  /* :: exec package information */
                    291:        struct klist    p_klist;        /* p: knotes attached to proc */
1.197     perry     292:
1.273     ad        293:        LIST_HEAD(, lwp) p_sigwaiters;  /* p: LWPs waiting for signals */
                    294:        sigpend_t       p_sigpend;      /* p: pending signals */
1.270     ad        295:        struct lcproc   *p_lwpctl;      /* p, a: _lwp_ctl() information */
1.277     ad        296:        pid_t           p_ppid;         /* :: cached parent pid */
1.310     christos  297:        pid_t           p_fpid;         /* :: forked pid */
1.29      cgd       298:
1.122     lukem     299: /*
                    300:  * End area that is zeroed on creation
                    301:  */
1.29      cgd       302: #define        p_endzero       p_startcopy
                    303:
1.122     lukem     304: /*
                    305:  * The following fields are all copied upon creation in fork.
                    306:  */
1.233     ad        307: #define        p_startcopy     p_sigctx
1.122     lukem     308:
1.273     ad        309:        struct sigctx   p_sigctx;       /* p: Shared signal state */
1.29      cgd       310:
1.273     ad        311:        u_char          p_nice;         /* p: Process "nice" value */
1.233     ad        312:        char            p_comm[MAXCOMLEN+1];
                    313:                                        /* p: basename of last exec file */
                    314:        struct pgrp     *p_pgrp;        /* l: Pointer to process group */
                    315:
1.301     joerg     316:        vaddr_t         p_psstrp;       /* :: address of process's ps_strings */
1.279     ad        317:        u_int           p_pax;          /* :: PAX flags */
1.29      cgd       318:
1.197     perry     319: /*
1.122     lukem     320:  * End area that is copied on creation
                    321:  */
1.153     thorpej   322: #define        p_endcopy       p_xstat
1.122     lukem     323:
1.273     ad        324:        u_short         p_xstat;        /* p: Exit status for wait; also stop signal */
1.223     ad        325:        u_short         p_acflag;       /* p: Acc. flags; see struct lwp also */
1.270     ad        326:        struct mdproc   p_md;           /* p: Any machine-dependent fields */
                    327:        vaddr_t         p_stackbase;    /* :: ASLR randomized stack base */
1.295     darran    328:        struct kdtrace_proc *p_dtrace;  /* :: DTrace-specific data. */
1.29      cgd       329: };
                    330:
1.233     ad        331: #define        p_rlimit        p_limit->pl_rlimit
1.29      cgd       332: #define        p_session       p_pgrp->pg_session
                    333: #define        p_pgid          p_pgrp->pg_id
                    334:
1.319     dsl       335: #endif /* _KMEMUSER || _KERNEL */
                    336:
1.91      thorpej   337: /*
                    338:  * Status values.
                    339:  */
1.122     lukem     340: #define        SIDL            1               /* Process being created by fork */
1.153     thorpej   341: #define        SACTIVE         2               /* Process is not stopped */
1.233     ad        342: #define        SDYING          3               /* About to die */
1.122     lukem     343: #define        SSTOP           4               /* Process debugging or suspension */
                    344: #define        SZOMB           5               /* Awaiting collection by parent */
1.233     ad        345: #define        SDEAD           6               /* Almost a zombie */
1.79      thorpej   346:
1.233     ad        347: #define        P_ZOMBIE(p)     \
                    348:     ((p)->p_stat == SZOMB || (p)->p_stat == SDYING || (p)->p_stat == SDEAD)
1.29      cgd       349:
1.233     ad        350: /*
1.273     ad        351:  * These flags are kept in p_flag and are protected by p_lock.  Access from
1.233     ad        352:  * process context only.
                    353:  */
1.237     pavel     354: #define        PK_ADVLOCK      0x00000001 /* Process may hold a POSIX advisory lock */
                    355: #define        PK_SYSTEM       0x00000002 /* System process (kthread) */
1.274     ad        356: #define        PK_SYSVSEM      0x00000004 /* Used SysV semaphores */
1.237     pavel     357: #define        PK_SUGID        0x00000100 /* Had set id privileges since last exec */
                    358: #define        PK_EXEC         0x00004000 /* Process called exec */
                    359: #define        PK_NOCLDWAIT    0x00020000 /* No zombies if child dies */
                    360: #define        PK_32           0x00040000 /* 32-bit process (used on 64-bit kernels) */
                    361: #define        PK_CLDSIGIGN    0x00080000 /* Process is ignoring SIGCHLD */
                    362: #define        PK_MARKER       0x80000000 /* Is a dummy marker process */
1.29      cgd       363:
1.233     ad        364: /*
1.273     ad        365:  * These flags are kept in p_sflag and are protected by p_lock.  Access from
                    366:  * process context only.
1.233     ad        367:  */
                    368: #define        PS_NOCLDSTOP    0x00000008 /* No SIGCHLD when children stop */
1.316     rmind     369: #define        PS_RUMP_LWPEXIT 0x00000400 /* LWPs in RUMP kernel should exit for GC */
1.233     ad        370: #define        PS_WCORE        0x00001000 /* Process needs to dump core */
                    371: #define        PS_WEXIT        0x00002000 /* Working on exiting */
                    372: #define        PS_STOPFORK     0x00800000 /* Child will be stopped on fork(2) */
                    373: #define        PS_STOPEXEC     0x01000000 /* Will be stopped on exec(2) */
                    374: #define        PS_STOPEXIT     0x02000000 /* Will be stopped at process exit */
                    375: #define        PS_NOTIFYSTOP   0x10000000 /* Notify parent of successful STOP */
                    376: #define        PS_STOPPING     0x80000000 /* Transitioning SACTIVE -> SSTOP */
                    377:
                    378: /*
1.272     ad        379:  * These flags are kept in p_sflag and are protected by the proc_lock
1.273     ad        380:  * and p_lock.  Access from process context only.
1.233     ad        381:  */
1.310     christos  382: #define        PSL_TRACEFORK   0x00000001 /* traced process wants fork events */
1.233     ad        383: #define        PSL_TRACED      0x00000800 /* Debugged process being traced */
                    384: #define        PSL_FSTRACE     0x00010000 /* Debugger process being traced by procfs */
                    385: #define        PSL_CHTRACED    0x00400000 /* Child has been traced & reparented */
                    386: #define        PSL_SYSCALL     0x04000000 /* process has PT_SYSCALL enabled */
1.309     jmcneill  387: #define        PSL_SYSCALLEMU  0x08000000 /* cancel in-progress syscall */
1.233     ad        388:
                    389: /*
                    390:  * Kept in p_stflag and protected by p_stmutex.
                    391:  */
                    392: #define        PST_PROFIL      0x00000020 /* Has started profiling */
                    393:
                    394: /*
1.272     ad        395:  * The final set are protected by the proc_lock.  Access
1.233     ad        396:  * from process context only.
                    397:  */
                    398: #define        PL_CONTROLT     0x00000002 /* Has a controlling terminal */
1.280     ad        399: #define        PL_PPWAIT       0x00000010 /* Parent is waiting for child exec/exit */
1.283     ad        400: #define        PL_SIGCOMPAT    0x00000200 /* Has used compat signal trampoline */
1.272     ad        401: #define        PL_ORPHANPG     0x20000000 /* Member of an orphaned pgrp */
1.219     christos  402:
1.319     dsl       403: #if defined(_KMEMUSER) || defined(_KERNEL)
                    404:
1.29      cgd       405: /*
1.78      thorpej   406:  * Macro to compute the exit signal to be delivered.
1.76      thorpej   407:  */
1.233     ad        408: #define        P_EXITSIG(p)    \
                    409:     (((p)->p_slflag & (PSL_TRACED|PSL_FSTRACE)) ? SIGCHLD : p->p_exitsig)
1.76      thorpej   410:
1.122     lukem     411: LIST_HEAD(proclist, proc);             /* A list of processes */
1.64      thorpej   412:
                    413: /*
                    414:  * This structure associates a proclist with its lock.
                    415:  */
                    416: struct proclist_desc {
1.122     lukem     417:        struct proclist *pd_list;       /* The list */
1.64      thorpej   418:        /*
                    419:         * XXX Add a pointer to the proclist's lock eventually.
                    420:         */
                    421: };
                    422:
1.38      jtc       423: #ifdef _KERNEL
1.156     thorpej   424:
1.29      cgd       425: /*
1.162     dsl       426:  * We use process IDs <= PID_MAX until there are > 16k processes.
                    427:  * NO_PGID is used to represent "no process group" for a tty.
1.29      cgd       428:  */
                    429: #define        PID_MAX         30000
1.163     jdolecek  430: #define        NO_PGID         ((pid_t)-1)
1.29      cgd       431:
1.122     lukem     432: #define        SESS_LEADER(p)  ((p)->p_session->s_leader == (p))
1.54      thorpej   433:
                    434: /*
                    435:  * Flags passed to fork1().
                    436:  */
1.255     dsl       437: #define        FORK_PPWAIT     0x0001          /* Block parent until child exit */
                    438: #define        FORK_SHAREVM    0x0002          /* Share vmspace with parent */
                    439: #define        FORK_SHARECWD   0x0004          /* Share cdir/rdir/cmask */
                    440: #define        FORK_SHAREFILES 0x0008          /* Share file descriptors */
                    441: #define        FORK_SHARESIGS  0x0010          /* Share signal actions */
                    442: #define        FORK_NOWAIT     0x0020          /* Make init the parent of the child */
                    443: #define        FORK_CLEANFILES 0x0040          /* Start with a clean descriptor set */
                    444: #define        FORK_SYSTEM     0x0080          /* Fork a kernel thread */
1.41      mycroft   445:
1.122     lukem     446: extern struct proc     proc0;          /* Process slot for swapper */
1.262     ad        447: extern u_int           nprocs;         /* Current number of procs */
                    448: extern int             maxproc;        /* Max number of procs */
1.213     yamt      449: #define        vmspace_kernel()        (proc0.p_vmspace)
1.29      cgd       450:
1.272     ad        451: extern kmutex_t                *proc_lock;
1.122     lukem     452: extern struct proclist allproc;        /* List of all processes */
                    453: extern struct proclist zombproc;       /* List of zombie processes */
1.79      thorpej   454:
1.122     lukem     455: extern struct proc     *initproc;      /* Process slots for init, pager */
1.61      thorpej   456:
1.64      thorpej   457: extern const struct proclist_desc proclists[];
                    458:
1.153     thorpej   459: extern struct pool     ptimer_pool;    /* Memory pool for ptimers */
1.29      cgd       460:
1.297     rmind     461: proc_t *       proc_find_raw(pid_t);
                    462: proc_t *       proc_find(pid_t);               /* Find process by ID */
                    463: struct pgrp *  pgrp_find(pid_t);               /* Find process group by ID */
1.288     rmind     464:
                    465: void   procinit(void);
1.300     pooka     466: void   procinit_sysctl(void);
1.288     rmind     467: int    proc_enterpgrp(struct proc *, pid_t, pid_t, bool);
                    468: void   proc_leavepgrp(struct proc *);
                    469: void   proc_sesshold(struct session *);
                    470: void   proc_sessrele(struct session *);
1.167     itojun    471: void   fixjobc(struct proc *, struct pgrp *, int);
1.287     rmind     472:
1.314     rmind     473: int    tsleep(wchan_t, pri_t, const char *, int);
1.244     ad        474: int    mtsleep(wchan_t, pri_t, const char *, int, kmutex_t *);
1.233     ad        475: void   wakeup(wchan_t);
1.240     thorpej   476: int    kpause(const char *, bool, int, kmutex_t *);
1.264     perry     477: void   exit1(struct lwp *, int) __dead;
1.322   ! martin    478: int    kill1(struct lwp *l, pid_t pid, ksiginfo_t *ksi, register_t *retval);
1.293     rmind     479: int    do_sys_wait(int *, int *, int, struct rusage *);
1.162     dsl       480: struct proc *proc_alloc(void);
1.204     junyoung  481: void   proc0_init(void);
1.298     chs       482: pid_t  proc_alloc_pid(struct proc *);
                    483: void   proc_free_pid(pid_t);
1.265     ad        484: void   proc_free_mem(struct proc *);
1.153     thorpej   485: void   exit_lwps(struct lwp *l);
                    486: int    fork1(struct lwp *, int, int, void *, size_t,
1.122     lukem     487:            void (*)(void *), void *, register_t *, struct proc **);
1.161     dsl       488: int    pgid_in_session(struct proc *, pid_t);
1.153     thorpej   489: void   cpu_lwp_fork(struct lwp *, struct lwp *, void *, size_t,
1.122     lukem     490:            void (*)(void *), void *);
1.186     jdolecek  491: void   cpu_lwp_free(struct lwp *, int);
1.233     ad        492: void   cpu_lwp_free2(struct lwp *);
1.315     martin    493: void   cpu_spawn_return(struct lwp*);
1.122     lukem     494:
1.202     christos  495: #ifdef __HAVE_SYSCALL_INTERN
                    496: void   syscall_intern(struct proc *);
                    497: #endif
                    498:
1.122     lukem     499: void   child_return(void *);
                    500:
1.209     christos  501: int    proc_isunder(struct proc *, struct lwp *);
1.233     ad        502: void   proc_stop(struct proc *, int, int);
1.291     elad      503: int    proc_uidmatch(kauth_cred_t, kauth_cred_t);
1.122     lukem     504:
1.213     yamt      505: int    proc_vmspace_getref(struct proc *, struct vmspace **);
1.240     thorpej   506: void   proc_crmod_leave(kauth_cred_t, kauth_cred_t, bool);
1.233     ad        507: void   proc_crmod_enter(void);
1.213     yamt      508:
1.228     thorpej   509: int    proc_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
                    510: void   proc_specific_key_delete(specificdata_key_t);
1.287     rmind     511: void   proc_initspecific(struct proc *);
                    512: void   proc_finispecific(struct proc *);
1.228     thorpej   513: void * proc_getspecific(struct proc *, specificdata_key_t);
                    514: void   proc_setspecific(struct proc *, specificdata_key_t, void *);
1.311     christos  515: int    proc_compare(const struct proc *, const struct lwp *,
                    516:     const struct proc *, const struct lwp *);
1.228     thorpej   517:
1.195     yamt      518: int    proclist_foreach_call(struct proclist *,
                    519:     int (*)(struct proc *, void *arg), void *);
                    520:
1.287     rmind     521: static inline struct proc *
1.195     yamt      522: _proclist_skipmarker(struct proc *p0)
                    523: {
                    524:        struct proc *p = p0;
                    525:
1.237     pavel     526:        while (p != NULL && p->p_flag & PK_MARKER)
1.195     yamt      527:                p = LIST_NEXT(p, p_list);
                    528:
                    529:        return p;
                    530: }
1.296     yamt      531:
                    532: /*
                    533:  * PROCLIST_FOREACH: iterate on the given proclist, skipping PK_MARKER ones.
                    534:  */
1.195     yamt      535: #define        PROCLIST_FOREACH(var, head)                                     \
                    536:        for ((var) = LIST_FIRST(head);                                  \
                    537:                ((var) = _proclist_skipmarker(var)) != NULL;            \
                    538:                (var) = LIST_NEXT(var, p_list))
                    539:
1.303     mrg       540: #ifdef KSTACK_CHECK_MAGIC
                    541: void   kstack_setup_magic(const struct lwp *);
                    542: void   kstack_check_magic(const struct lwp *);
                    543: #else
                    544: #define        kstack_setup_magic(x)
                    545: #define        kstack_check_magic(x)
                    546: #endif
                    547:
                    548: extern struct emul emul_netbsd;
                    549:
                    550: #endif /* _KERNEL */
                    551:
1.139     yamt      552: /*
1.299     rmind     553:  * Kernel stack parameters.
                    554:  *
                    555:  * KSTACK_LOWEST_ADDR: return the lowest address of the LWP's kernel stack,
                    556:  * excluding red-zone.
                    557:  *
                    558:  * KSTACK_SIZE: the size kernel stack for a LWP, excluding red-zone.
1.290     yamt      559:  *
                    560:  * if <machine/proc.h> provides the MD definition, it will be used.
                    561:  */
1.139     yamt      562: #ifndef KSTACK_LOWEST_ADDR
1.299     rmind     563: #define        KSTACK_LOWEST_ADDR(l)   ((void *)ALIGN((struct pcb *)((l)->l_addr) + 1))
1.139     yamt      564: #endif
                    565: #ifndef KSTACK_SIZE
1.299     rmind     566: #define        KSTACK_SIZE             (USPACE - ALIGN(sizeof(struct pcb)))
                    567: #endif
                    568:
1.303     mrg       569: #endif /* _KMEMUSER || _KERNEL */
1.98      thorpej   570:
1.29      cgd       571: #endif /* !_SYS_PROC_H_ */

CVSweb <webmaster@jp.NetBSD.org>