Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / proc.h @ 13

History | View | Annotate | Download (20 KB)

1
/*        $NetBSD: proc.h,v 1.323 2015/09/24 14:33:31 christos 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
#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/rwlock.h>
85
#include <sys/mqueue.h>
86
#include <sys/mutex.h>
87
#include <sys/condvar.h>
88
#include <sys/queue.h>
89
#include <sys/signalvar.h>
90
#include <sys/siginfo.h>
91
#include <sys/event.h>
92
#include <sys/specificdata.h>
93

    
94
#ifndef _KERNEL
95
#include <sys/time.h>
96
#include <sys/resource.h>
97
#endif
98

    
99
/*
100
 * One structure allocated per session.
101
 */
102
struct session {
103
        int                s_count;        /* Ref cnt; pgrps in session */
104
        u_int                s_flags;
105
#define        S_LOGIN_SET        1                /* s_login set in this session */
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) */
111
};
112

    
113
/*
114
 * One structure allocated per process group.
115
 */
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
                                         */
124
};
125

    
126
/*
127
 * One structure allocated per emulation.
128
 */
129
struct exec_package;
130
struct ras;
131
struct kauth_cred;
132

    
133
struct emul {
134
        const char        *e_name;        /* Symbolic name */
135
        const char        *e_path;        /* Extra emulation path (NULL if none)*/
136
#ifndef __HAVE_MINIMAL_EMUL
137
        int                e_flags;        /* Miscellaneous flags, see above */
138
                                        /* Syscall handling function */
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 */
142
#endif
143
        struct sysent        *e_sysent;        /* System call array */
144
        const char * const *e_syscallnames; /* System call name array */
145
                                        /* Signal sending function */
146
        void                (*e_sendsig)(const struct ksiginfo *,
147
                                          const sigset_t *);
148
        void                (*e_trapsignal)(struct lwp *, struct ksiginfo *);
149
        int                (*e_tracesig)(struct proc *, int);
150
        char                *e_sigcode;        /* Start of sigcode */
151
        char                *e_esigcode;        /* End of sigcode */
152
                                        /* Set registers before execution */
153
        struct uvm_object **e_sigobject;/* shared sigcode object */
154
        void                (*e_setregs)(struct lwp *, struct exec_package *,
155
                                          vaddr_t);
156

    
157
                                        /* Per-process hooks */
158
        void                (*e_proc_exec)(struct proc *, struct exec_package *);
159
        void                (*e_proc_fork)(struct proc *, struct lwp *, int);
160
        void                (*e_proc_exit)(struct proc *);
161
        void                (*e_lwp_fork)(struct lwp *, struct lwp *);
162
        void                (*e_lwp_exit)(struct lwp *);
163

    
164
#ifdef __HAVE_SYSCALL_INTERN
165
        void                (*e_syscall_intern)(struct proc *);
166
#else
167
        void                (*e_syscall)(void);
168
#endif
169
                                        /* Emulation specific sysctl data */
170
        struct sysctlnode *e_sysctlovly;
171
        int                (*e_fault)(struct proc *, vaddr_t, int);
172

    
173
        vaddr_t                (*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t);
174

    
175
        /* Emulation-specific hook for userspace page faults */
176
        int                (*e_usertrap)(struct lwp *, vaddr_t, void *);
177

    
178
        size_t                e_ucsize;        /* size of ucontext_t */
179
        void                (*e_startlwp)(void *);
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);
185
};
186

    
187
/*
188
 * Emulation miscelaneous flags
189
 */
190
#define        EMUL_HAS_SYS___syscall        0x001        /* Has SYS___syscall */
191

    
192
/*
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.
202
 *
203
 * Field markings and the corresponding locks:
204
 *
205
 * a:        p_auxlock
206
 * k:        ktrace_mutex
207
 * l:        proc_lock
208
 * t:        p_stmutex
209
 * p:        p_lock
210
 * (:        updated atomically
211
 * ::        unlocked, stable
212
 */
213
struct vmspace;
214

    
215
struct proc {
216
        LIST_ENTRY(proc) p_list;        /* l: List of all processes */
217

    
218
        kmutex_t        p_auxlock;        /* :: secondary, longer term lock */
219
        kmutex_t        *p_lock;        /* :: general mutex */
220
        kmutex_t        p_stmutex;        /* :: mutex on profiling state */
221
        krwlock_t        p_reflock;        /* p: lock for debugger, procfs */
222
        kcondvar_t        p_waitcv;        /* p: wait, stop CV on children */
223
        kcondvar_t        p_lwpcv;        /* p: wait, stop CV on LWPs */
224

    
225
        /* Substructures: */
226
        struct kauth_cred *p_cred;        /* p: Master copy of credentials */
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 */
233
        struct aioproc        *p_aio;                /* p: Asynchronous I/O data */
234
        u_int                p_mqueue_cnt;        /* (: Count of open message queues */
235
        specificdata_reference
236
                        p_specdataref;        /*    subsystem proc-specific data */
237

    
238
        int                p_exitsig;        /* l: signal to send to parent on exit */
239
        int                p_flag;                /* p: PK_* flags */
240
        int                p_sflag;        /* p: PS_* flags */
241
        int                p_slflag;        /* s, l: PSL_* flags */
242
        int                p_lflag;        /* l: PL_* flags */
243
        int                p_stflag;        /* t: PST_* flags */
244
        char                p_stat;                /* p: S* process status. */
245
        char                p_trace_enabled;/* p: cached by syscall_intern() */
246
        char                p_pad1[2];        /*  unused */
247

    
248
        pid_t                p_pid;                /* :: Process identifier. */
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. */
252
        LIST_HEAD(, proc) p_children;        /* l: List of children. */
253
        LIST_HEAD(, lwp) p_lwps;        /* p: List of LWPs. */
254
        struct ras        *p_raslist;        /* a: List of RAS entries */
255

    
256
/* The following fields are all zeroed upon creation in fork. */
257
#define        p_startzero        p_nlwps
258

    
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 */
265
        u_int                p_nstopchild;        /* l: Count of stopped/dead children */
266
        u_int                p_waited;        /* l: parent has waited on child */
267
        struct lwp        *p_zomblwp;        /* p: detached LWP to be reaped */
268
        struct lwp        *p_vforklwp;        /* p: parent LWP waiting at vfork() */
269

    
270
        /* scheduling */
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 */
274
        unsigned int        p_forktime;
275
        fixpt_t         p_pctcpu;       /* p: %cpu from dead LWPs */
276

    
277
        struct proc        *p_opptr;        /* l: save parent during ptrace. */
278
        struct ptimers        *p_timers;        /*    Timers: real, virtual, profiling */
279
        struct bintime         p_rtime;        /* p: real time */
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 */
286
        struct vnode         *p_textvp;        /* :: Vnode of executable */
287

    
288
        struct emul        *p_emul;        /* :: emulation information */
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 */
292

    
293
        LIST_HEAD(, lwp) p_sigwaiters;        /* p: LWPs waiting for signals */
294
        sigpend_t        p_sigpend;        /* p: pending signals */
295
        struct lcproc        *p_lwpctl;        /* p, a: _lwp_ctl() information */
296
        pid_t                p_ppid;                /* :: cached parent pid */
297
        pid_t                 p_fpid;                /* :: forked pid */
298

    
299
/*
300
 * End area that is zeroed on creation
301
 */
302
#define        p_endzero        p_startcopy
303

    
304
/*
305
 * The following fields are all copied upon creation in fork.
306
 */
307
#define        p_startcopy        p_sigctx
308

    
309
        struct sigctx         p_sigctx;        /* p: Shared signal state */
310

    
311
        u_char                p_nice;                /* p: Process "nice" value */
312
        char                p_comm[MAXCOMLEN+1];
313
                                        /* p: basename of last exec file */
314
        struct pgrp         *p_pgrp;        /* l: Pointer to process group */
315

    
316
        vaddr_t                p_psstrp;        /* :: address of process's ps_strings */
317
        u_int                p_pax;                /* :: PAX flags */
318

    
319
/*
320
 * End area that is copied on creation
321
 */
322
#define        p_endcopy        p_xstat
323

    
324
        u_short                p_xstat;        /* p: Exit status for wait; also stop signal */
325
        u_short                p_acflag;        /* p: Acc. flags; see struct lwp also */
326
        struct mdproc        p_md;                /* p: Any machine-dependent fields */
327
        vaddr_t                p_stackbase;        /* :: ASLR randomized stack base */
328
        struct kdtrace_proc *p_dtrace;        /* :: DTrace-specific data. */
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
#endif        /* _KMEMUSER || _KERNEL */
336

    
337
/*
338
 * Status values.
339
 */
340
#define        SIDL                1                /* Process being created by fork */
341
#define        SACTIVE                2                /* Process is not stopped */
342
#define        SDYING                3                /* About to die */
343
#define        SSTOP                4                /* Process debugging or suspension */
344
#define        SZOMB                5                /* Awaiting collection by parent */
345
#define        SDEAD                 6                /* Almost a zombie */
346

    
347
#define        P_ZOMBIE(p)        \
348
    ((p)->p_stat == SZOMB || (p)->p_stat == SDYING || (p)->p_stat == SDEAD)
349

    
350
/*
351
 * These flags are kept in p_flag and are protected by p_lock.  Access from
352
 * process context only.
353
 */
354
#define        PK_ADVLOCK        0x00000001 /* Process may hold a POSIX advisory lock */
355
#define        PK_SYSTEM        0x00000002 /* System process (kthread) */
356
#define        PK_SYSVSEM        0x00000004 /* Used SysV semaphores */
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 */
363

    
364
/*
365
 * These flags are kept in p_sflag and are protected by p_lock.  Access from
366
 * process context only.
367
 */
368
#define        PS_NOCLDSTOP        0x00000008 /* No SIGCHLD when children stop */
369
#define        PS_RUMP_LWPEXIT        0x00000400 /* LWPs in RUMP kernel should exit for GC */
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
/*
379
 * These flags are kept in p_sflag and are protected by the proc_lock
380
 * and p_lock.  Access from process context only.
381
 */
382
#define        PSL_TRACEFORK        0x00000001 /* traced process wants fork events */
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 */
387
#define        PSL_SYSCALLEMU        0x08000000 /* cancel in-progress syscall */
388

    
389
/*
390
 * Kept in p_stflag and protected by p_stmutex.
391
 */
392
#define        PST_PROFIL        0x00000020 /* Has started profiling */
393

    
394
/*
395
 * The final set are protected by the proc_lock.  Access
396
 * from process context only.
397
 */
398
#define        PL_CONTROLT        0x00000002 /* Has a controlling terminal */
399
#define        PL_PPWAIT        0x00000010 /* Parent is waiting for child exec/exit */
400
#define        PL_SIGCOMPAT        0x00000200 /* Has used compat signal trampoline */
401
#define        PL_ORPHANPG        0x20000000 /* Member of an orphaned pgrp */
402

    
403
#if defined(_KMEMUSER) || defined(_KERNEL)
404

    
405
/*
406
 * Macro to compute the exit signal to be delivered.
407
 */
408
#define        P_EXITSIG(p)        \
409
    (((p)->p_slflag & (PSL_TRACED|PSL_FSTRACE)) ? SIGCHLD : p->p_exitsig)
410

    
411
LIST_HEAD(proclist, proc);                /* A list of processes */
412

    
413
/*
414
 * This structure associates a proclist with its lock.
415
 */
416
struct proclist_desc {
417
        struct proclist        *pd_list;        /* The list */
418
        /*
419
         * XXX Add a pointer to the proclist's lock eventually.
420
         */
421
};
422

    
423
#ifdef _KERNEL
424

    
425
/*
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.
428
 */
429
#define        PID_MAX                30000
430
#define        NO_PGID                ((pid_t)-1)
431

    
432
#define        SESS_LEADER(p)        ((p)->p_session->s_leader == (p))
433

    
434
/*
435
 * Flags passed to fork1().
436
 */
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 */
445

    
446
extern struct proc        proc0;                /* Process slot for swapper */
447
extern u_int                nprocs;                /* Current number of procs */
448
extern int                maxproc;        /* Max number of procs */
449
#define        vmspace_kernel()        (proc0.p_vmspace)
450

    
451
extern kmutex_t                *proc_lock;
452
extern struct proclist        allproc;        /* List of all processes */
453
extern struct proclist        zombproc;        /* List of zombie processes */
454

    
455
extern struct proc        *initproc;        /* Process slots for init, pager */
456

    
457
extern const struct proclist_desc proclists[];
458

    
459
extern struct pool        ptimer_pool;        /* Memory pool for ptimers */
460

    
461
int                proc_find_locked(struct lwp *, struct proc **, pid_t);
462
proc_t *        proc_find_raw(pid_t);
463
proc_t *        proc_find(pid_t);                /* Find process by ID */
464
struct pgrp *        pgrp_find(pid_t);                /* Find process group by ID */
465

    
466
void        procinit(void);
467
void        procinit_sysctl(void);
468
int        proc_enterpgrp(struct proc *, pid_t, pid_t, bool);
469
void        proc_leavepgrp(struct proc *);
470
void        proc_sesshold(struct session *);
471
void        proc_sessrele(struct session *);
472
void        fixjobc(struct proc *, struct pgrp *, int);
473

    
474
int        tsleep(wchan_t, pri_t, const char *, int);
475
int        mtsleep(wchan_t, pri_t, const char *, int, kmutex_t *);
476
void        wakeup(wchan_t);
477
int        kpause(const char *, bool, int, kmutex_t *);
478
void        exit1(struct lwp *, int) __dead;
479
int        kill1(struct lwp *l, pid_t pid, ksiginfo_t *ksi, register_t *retval);
480
int        do_sys_wait(int *, int *, int, struct rusage *);
481
struct proc *proc_alloc(void);
482
void        proc0_init(void);
483
pid_t        proc_alloc_pid(struct proc *);
484
void        proc_free_pid(pid_t);
485
void        proc_free_mem(struct proc *);
486
void        exit_lwps(struct lwp *l);
487
int        fork1(struct lwp *, int, int, void *, size_t,
488
            void (*)(void *), void *, register_t *, struct proc **);
489
int        pgid_in_session(struct proc *, pid_t);
490
void        cpu_lwp_fork(struct lwp *, struct lwp *, void *, size_t,
491
            void (*)(void *), void *);
492
void        cpu_lwp_free(struct lwp *, int);
493
void        cpu_lwp_free2(struct lwp *);
494
void        cpu_spawn_return(struct lwp*);
495

    
496
#ifdef __HAVE_SYSCALL_INTERN
497
void        syscall_intern(struct proc *);
498
#endif
499

    
500
void        child_return(void *);
501

    
502
int        proc_isunder(struct proc *, struct lwp *);
503
void        proc_stop(struct proc *, int, int);
504
int        proc_uidmatch(kauth_cred_t, kauth_cred_t);
505

    
506
int        proc_vmspace_getref(struct proc *, struct vmspace **);
507
void        proc_crmod_leave(kauth_cred_t, kauth_cred_t, bool);
508
void        proc_crmod_enter(void);
509

    
510
int        proc_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
511
void        proc_specific_key_delete(specificdata_key_t);
512
void        proc_initspecific(struct proc *);
513
void        proc_finispecific(struct proc *);
514
void *        proc_getspecific(struct proc *, specificdata_key_t);
515
void        proc_setspecific(struct proc *, specificdata_key_t, void *);
516
int        proc_compare(const struct proc *, const struct lwp *,
517
    const struct proc *, const struct lwp *);
518

    
519
int        proclist_foreach_call(struct proclist *,
520
    int (*)(struct proc *, void *arg), void *);
521

    
522
static inline struct proc *
523
_proclist_skipmarker(struct proc *p0)
524
{
525
        struct proc *p = p0;
526

    
527
        while (p != NULL && p->p_flag & PK_MARKER)
528
                p = LIST_NEXT(p, p_list);
529

    
530
        return p;
531
}
532

    
533
/*
534
 * PROCLIST_FOREACH: iterate on the given proclist, skipping PK_MARKER ones.
535
 */
536
#define        PROCLIST_FOREACH(var, head)                                        \
537
        for ((var) = LIST_FIRST(head);                                        \
538
                ((var) = _proclist_skipmarker(var)) != NULL;                \
539
                (var) = LIST_NEXT(var, p_list))
540

    
541
#ifdef KSTACK_CHECK_MAGIC
542
void        kstack_setup_magic(const struct lwp *);
543
void        kstack_check_magic(const struct lwp *);
544
#else
545
#define        kstack_setup_magic(x)
546
#define        kstack_check_magic(x)
547
#endif
548

    
549
extern struct emul emul_netbsd;
550

    
551
#endif        /* _KERNEL */
552

    
553
/*
554
 * Kernel stack parameters.
555
 *
556
 * KSTACK_LOWEST_ADDR: return the lowest address of the LWP's kernel stack,
557
 * excluding red-zone.
558
 *
559
 * KSTACK_SIZE: the size kernel stack for a LWP, excluding red-zone.
560
 *
561
 * if <machine/proc.h> provides the MD definition, it will be used.
562
 */
563
#ifndef KSTACK_LOWEST_ADDR
564
#define        KSTACK_LOWEST_ADDR(l)        ((void *)ALIGN((struct pcb *)((l)->l_addr) + 1))
565
#endif
566
#ifndef KSTACK_SIZE
567
#define        KSTACK_SIZE                (USPACE - ALIGN(sizeof(struct pcb)))
568
#endif
569

    
570
#endif        /* _KMEMUSER || _KERNEL */
571

    
572
#endif        /* !_SYS_PROC_H_ */