]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/sys/user.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / sys / user.h
1 /*-
2  * Copyright (c) 1982, 1986, 1989, 1991, 1993
3  *      The Regents of the University of California.
4  * Copyright (c) 2007 Robert N. M. Watson
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 4. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *      @(#)user.h      8.2 (Berkeley) 9/23/93
32  * $FreeBSD$
33  */
34
35 #ifndef _SYS_USER_H_
36 #define _SYS_USER_H_
37
38 #include <machine/pcb.h>
39 #ifndef _KERNEL
40 /* stuff that *used* to be included by user.h, or is now needed */
41 #include <sys/errno.h>
42 #include <sys/time.h>
43 #include <sys/resource.h>
44 #include <sys/ucred.h>
45 #include <sys/uio.h>
46 #include <sys/queue.h>
47 #include <sys/_lock.h>
48 #include <sys/_mutex.h>
49 #include <sys/proc.h>
50 #include <vm/vm.h>              /* XXX */
51 #include <vm/vm_param.h>        /* XXX */
52 #include <vm/pmap.h>            /* XXX */
53 #include <vm/vm_map.h>          /* XXX */
54 #endif /* !_KERNEL */
55 #ifndef _SYS_RESOURCEVAR_H_
56 #include <sys/resourcevar.h>
57 #endif
58 #ifndef _SYS_SIGNALVAR_H_
59 #include <sys/signalvar.h>
60 #endif
61 #ifndef _SYS_SOCKET_VAR_H_
62 #include <sys/socket.h>
63 #endif
64
65 /*
66  * KERN_PROC subtype ops return arrays of selected proc structure entries:
67  *
68  * This struct includes several arrays of spare space, with different arrays
69  * for different standard C-types.  When adding new variables to this struct,
70  * the space for byte-aligned data should be taken from the ki_sparestring,
71  * pointers from ki_spareptrs, word-aligned data from ki_spareints, and
72  * doubleword-aligned data from ki_sparelongs.  Make sure the space for new
73  * variables come from the array which matches the size and alignment of
74  * those variables on ALL hardware platforms, and then adjust the appropriate
75  * KI_NSPARE_* value(s) to match.
76  *
77  * Always verify that sizeof(struct kinfo_proc) == KINFO_PROC_SIZE on all
78  * platforms after you have added new variables.  Note that if you change
79  * the value of KINFO_PROC_SIZE, then many userland programs will stop
80  * working until they are recompiled!
81  *
82  * Once you have added the new field, you will need to add code to initialize
83  * it in two places: function fill_kinfo_proc in sys/kern/kern_proc.c and
84  * function kvm_proclist in lib/libkvm/kvm_proc.c .
85  */
86 #define KI_NSPARE_INT   9
87 #define KI_NSPARE_LONG  12
88 #define KI_NSPARE_PTR   6
89
90 #ifndef _KERNEL
91 #ifndef KINFO_PROC_SIZE
92 #error "Unknown architecture"
93 #endif
94 #endif /* !_KERNEL */
95
96 #define WMESGLEN        8               /* size of returned wchan message */
97 #define LOCKNAMELEN     8               /* size of returned lock name */
98 #define TDNAMLEN        16              /* size of returned thread name */
99 #define COMMLEN         19              /* size of returned ki_comm name */
100 #define KI_EMULNAMELEN  16              /* size of returned ki_emul */
101 #define KI_NGROUPS      16              /* number of groups in ki_groups */
102 #define LOGNAMELEN      17              /* size of returned ki_login */
103 #define LOGINCLASSLEN   17              /* size of returned ki_loginclass */
104
105 #ifndef BURN_BRIDGES
106 #define OCOMMLEN        TDNAMLEN        
107 #define ki_ocomm        ki_tdname
108 #endif
109
110 /* Flags for the process credential. */
111 #define KI_CRF_CAPABILITY_MODE  0x00000001
112 /*
113  * Steal a bit from ki_cr_flags to indicate that the cred had more than
114  * KI_NGROUPS groups.
115  */
116 #define KI_CRF_GRP_OVERFLOW     0x80000000
117
118 struct kinfo_proc {
119         int     ki_structsize;          /* size of this structure */
120         int     ki_layout;              /* reserved: layout identifier */
121         struct  pargs *ki_args;         /* address of command arguments */
122         struct  proc *ki_paddr;         /* address of proc */
123         struct  user *ki_addr;          /* kernel virtual addr of u-area */
124         struct  vnode *ki_tracep;       /* pointer to trace file */
125         struct  vnode *ki_textvp;       /* pointer to executable file */
126         struct  filedesc *ki_fd;        /* pointer to open file info */
127         struct  vmspace *ki_vmspace;    /* pointer to kernel vmspace struct */
128         void    *ki_wchan;              /* sleep address */
129         pid_t   ki_pid;                 /* Process identifier */
130         pid_t   ki_ppid;                /* parent process id */
131         pid_t   ki_pgid;                /* process group id */
132         pid_t   ki_tpgid;               /* tty process group id */
133         pid_t   ki_sid;                 /* Process session ID */
134         pid_t   ki_tsid;                /* Terminal session ID */
135         short   ki_jobc;                /* job control counter */
136         short   ki_spare_short1;        /* unused (just here for alignment) */
137         dev_t   ki_tdev;                /* controlling tty dev */
138         sigset_t ki_siglist;            /* Signals arrived but not delivered */
139         sigset_t ki_sigmask;            /* Current signal mask */
140         sigset_t ki_sigignore;          /* Signals being ignored */
141         sigset_t ki_sigcatch;           /* Signals being caught by user */
142         uid_t   ki_uid;                 /* effective user id */
143         uid_t   ki_ruid;                /* Real user id */
144         uid_t   ki_svuid;               /* Saved effective user id */
145         gid_t   ki_rgid;                /* Real group id */
146         gid_t   ki_svgid;               /* Saved effective group id */
147         short   ki_ngroups;             /* number of groups */
148         short   ki_spare_short2;        /* unused (just here for alignment) */
149         gid_t   ki_groups[KI_NGROUPS];  /* groups */
150         vm_size_t ki_size;              /* virtual size */
151         segsz_t ki_rssize;              /* current resident set size in pages */
152         segsz_t ki_swrss;               /* resident set size before last swap */
153         segsz_t ki_tsize;               /* text size (pages) XXX */
154         segsz_t ki_dsize;               /* data size (pages) XXX */
155         segsz_t ki_ssize;               /* stack size (pages) */
156         u_short ki_xstat;               /* Exit status for wait & stop signal */
157         u_short ki_acflag;              /* Accounting flags */
158         fixpt_t ki_pctcpu;              /* %cpu for process during ki_swtime */
159         u_int   ki_estcpu;              /* Time averaged value of ki_cpticks */
160         u_int   ki_slptime;             /* Time since last blocked */
161         u_int   ki_swtime;              /* Time swapped in or out */
162         u_int   ki_cow;                 /* number of copy-on-write faults */
163         u_int64_t ki_runtime;           /* Real time in microsec */
164         struct  timeval ki_start;       /* starting time */
165         struct  timeval ki_childtime;   /* time used by process children */
166         long    ki_flag;                /* P_* flags */
167         long    ki_kiflag;              /* KI_* flags (below) */
168         int     ki_traceflag;           /* Kernel trace points */
169         char    ki_stat;                /* S* process status */
170         signed char ki_nice;            /* Process "nice" value */
171         char    ki_lock;                /* Process lock (prevent swap) count */
172         char    ki_rqindex;             /* Run queue index */
173         u_char  ki_oncpu;               /* Which cpu we are on */
174         u_char  ki_lastcpu;             /* Last cpu we were on */
175         char    ki_tdname[TDNAMLEN+1];  /* thread name */
176         char    ki_wmesg[WMESGLEN+1];   /* wchan message */
177         char    ki_login[LOGNAMELEN+1]; /* setlogin name */
178         char    ki_lockname[LOCKNAMELEN+1]; /* lock name */
179         char    ki_comm[COMMLEN+1];     /* command name */
180         char    ki_emul[KI_EMULNAMELEN+1];  /* emulation name */
181         char    ki_loginclass[LOGINCLASSLEN+1]; /* login class */
182         /*
183          * When adding new variables, take space for char-strings from the
184          * front of ki_sparestrings, and ints from the end of ki_spareints.
185          * That way the spare room from both arrays will remain contiguous.
186          */
187         char    ki_sparestrings[50];    /* spare string space */
188         int     ki_spareints[KI_NSPARE_INT];    /* spare room for growth */
189         u_int   ki_cr_flags;            /* Credential flags */
190         int     ki_jid;                 /* Process jail ID */
191         int     ki_numthreads;          /* XXXKSE number of threads in total */
192         lwpid_t ki_tid;                 /* XXXKSE thread id */
193         struct  priority ki_pri;        /* process priority */
194         struct  rusage ki_rusage;       /* process rusage statistics */
195         /* XXX - most fields in ki_rusage_ch are not (yet) filled in */
196         struct  rusage ki_rusage_ch;    /* rusage of children processes */
197         struct  pcb *ki_pcb;            /* kernel virtual addr of pcb */
198         void    *ki_kstack;             /* kernel virtual addr of stack */
199         void    *ki_udata;              /* User convenience pointer */
200         struct  thread *ki_tdaddr;      /* address of thread */
201         /*
202          * When adding new variables, take space for pointers from the
203          * front of ki_spareptrs, and longs from the end of ki_sparelongs.
204          * That way the spare room from both arrays will remain contiguous.
205          */
206         void    *ki_spareptrs[KI_NSPARE_PTR];   /* spare room for growth */
207         long    ki_sparelongs[KI_NSPARE_LONG];  /* spare room for growth */
208         long    ki_sflag;               /* PS_* flags */
209         long    ki_tdflags;             /* XXXKSE kthread flag */
210 };
211 void fill_kinfo_proc(struct proc *, struct kinfo_proc *);
212 /* XXX - the following two defines are temporary */
213 #define ki_childstime   ki_rusage_ch.ru_stime
214 #define ki_childutime   ki_rusage_ch.ru_utime
215
216 /*
217  *  Legacy PS_ flag.  This moved to p_flag but is maintained for
218  *  compatibility.
219  */
220 #define PS_INMEM        0x00001         /* Loaded into memory. */
221
222 /* ki_sessflag values */
223 #define KI_CTTY         0x00000001      /* controlling tty vnode active */
224 #define KI_SLEADER      0x00000002      /* session leader */
225 #define KI_LOCKBLOCK    0x00000004      /* proc blocked on lock ki_lockname */
226
227 /*
228  * This used to be the per-process structure containing data that
229  * isn't needed in core when the process is swapped out, but now it
230  * remains only for the benefit of a.out core dumps.
231  */
232 struct user {
233         struct  pstats u_stats;         /* *p_stats */
234         struct  kinfo_proc u_kproc;     /* eproc */
235 };
236
237 /*
238  * The KERN_PROC_FILE sysctl allows a process to dump the file descriptor
239  * array of another process.
240  */
241 #define KF_ATTR_VALID   0x0001
242
243 #define KF_TYPE_NONE    0
244 #define KF_TYPE_VNODE   1
245 #define KF_TYPE_SOCKET  2
246 #define KF_TYPE_PIPE    3
247 #define KF_TYPE_FIFO    4
248 #define KF_TYPE_KQUEUE  5
249 #define KF_TYPE_CRYPTO  6
250 #define KF_TYPE_MQUEUE  7
251 #define KF_TYPE_SHM     8
252 #define KF_TYPE_SEM     9
253 #define KF_TYPE_PTS     10
254 /* no KF_TYPE_CAPABILITY (11), since capabilities wrap other file objects */
255 #define KF_TYPE_PROCDESC        12
256 #define KF_TYPE_UNKNOWN 255
257
258 #define KF_VTYPE_VNON   0
259 #define KF_VTYPE_VREG   1
260 #define KF_VTYPE_VDIR   2
261 #define KF_VTYPE_VBLK   3
262 #define KF_VTYPE_VCHR   4
263 #define KF_VTYPE_VLNK   5
264 #define KF_VTYPE_VSOCK  6
265 #define KF_VTYPE_VFIFO  7
266 #define KF_VTYPE_VBAD   8
267 #define KF_VTYPE_UNKNOWN        255
268
269 #define KF_FD_TYPE_CWD  -1      /* Current working directory */
270 #define KF_FD_TYPE_ROOT -2      /* Root directory */
271 #define KF_FD_TYPE_JAIL -3      /* Jail directory */
272 #define KF_FD_TYPE_TRACE        -4      /* ptrace vnode */
273 #define KF_FD_TYPE_TEXT -5      /* Text vnode */
274 #define KF_FD_TYPE_CTTY -6      /* Controlling terminal */
275
276 #define KF_FLAG_READ            0x00000001
277 #define KF_FLAG_WRITE           0x00000002
278 #define KF_FLAG_APPEND          0x00000004
279 #define KF_FLAG_ASYNC           0x00000008
280 #define KF_FLAG_FSYNC           0x00000010
281 #define KF_FLAG_NONBLOCK        0x00000020
282 #define KF_FLAG_DIRECT          0x00000040
283 #define KF_FLAG_HASLOCK         0x00000080
284 #define KF_FLAG_SHLOCK          0x00000100
285 #define KF_FLAG_EXLOCK          0x00000200
286 #define KF_FLAG_NOFOLLOW        0x00000400
287 #define KF_FLAG_CREAT           0x00000800
288 #define KF_FLAG_TRUNC           0x00001000
289 #define KF_FLAG_EXCL            0x00002000
290 #define KF_FLAG_EXEC            0x00004000
291 #define KF_FLAG_CAPABILITY      0x00008000
292
293 /*
294  * Old format.  Has variable hidden padding due to alignment.
295  * This is a compatability hack for pre-build 7.1 packages.
296  */
297 #if defined(__amd64__)
298 #define KINFO_OFILE_SIZE        1328
299 #endif
300 #if defined(__i386__)
301 #define KINFO_OFILE_SIZE        1324
302 #endif
303
304 struct kinfo_ofile {
305         int     kf_structsize;                  /* Size of kinfo_file. */
306         int     kf_type;                        /* Descriptor type. */
307         int     kf_fd;                          /* Array index. */
308         int     kf_ref_count;                   /* Reference count. */
309         int     kf_flags;                       /* Flags. */
310         /* XXX Hidden alignment padding here on amd64 */
311         off_t   kf_offset;                      /* Seek location. */
312         int     kf_vnode_type;                  /* Vnode type. */
313         int     kf_sock_domain;                 /* Socket domain. */
314         int     kf_sock_type;                   /* Socket type. */
315         int     kf_sock_protocol;               /* Socket protocol. */
316         char    kf_path[PATH_MAX];      /* Path to file, if any. */
317         struct sockaddr_storage kf_sa_local;    /* Socket address. */
318         struct sockaddr_storage kf_sa_peer;     /* Peer address. */
319 };
320
321 #if defined(__amd64__) || defined(__i386__)
322 #define KINFO_FILE_SIZE 1392
323 #endif
324
325 struct kinfo_file {
326         int             kf_structsize;          /* Variable size of record. */
327         int             kf_type;                /* Descriptor type. */
328         int             kf_fd;                  /* Array index. */
329         int             kf_ref_count;           /* Reference count. */
330         int             kf_flags;               /* Flags. */
331         int             kf_pad0;                /* Round to 64 bit alignment. */
332         int64_t         kf_offset;              /* Seek location. */
333         int             kf_vnode_type;          /* Vnode type. */
334         int             kf_sock_domain;         /* Socket domain. */
335         int             kf_sock_type;           /* Socket type. */
336         int             kf_sock_protocol;       /* Socket protocol. */
337         struct sockaddr_storage kf_sa_local;    /* Socket address. */
338         struct sockaddr_storage kf_sa_peer;     /* Peer address. */
339         union {
340                 struct {
341                         /* Address of so_pcb. */
342                         uint64_t        kf_sock_pcb;
343                         /* Address of inp_ppcb. */
344                         uint64_t        kf_sock_inpcb;
345                         /* Address of unp_conn. */
346                         uint64_t        kf_sock_unpconn;
347                         /* Send buffer state. */
348                         uint16_t        kf_sock_snd_sb_state;
349                         /* Receive buffer state. */
350                         uint16_t        kf_sock_rcv_sb_state;
351                         /* Round to 64 bit alignment. */
352                         uint32_t        kf_sock_pad0;
353                 } kf_sock;
354                 struct {
355                         /* Global file id. */
356                         uint64_t        kf_file_fileid;
357                         /* File size. */
358                         uint64_t        kf_file_size;
359                         /* Vnode filesystem id. */
360                         uint32_t        kf_file_fsid;
361                         /* File device. */
362                         uint32_t        kf_file_rdev;
363                         /* File mode. */
364                         uint16_t        kf_file_mode;
365                         /* Round to 64 bit alignment. */
366                         uint16_t        kf_file_pad0;
367                         uint32_t        kf_file_pad1;
368                 } kf_file;
369                 struct {
370                         uint32_t        kf_sem_value;
371                         uint16_t        kf_sem_mode;
372                 } kf_sem;
373                 struct {
374                         uint64_t        kf_pipe_addr;
375                         uint64_t        kf_pipe_peer;
376                         uint32_t        kf_pipe_buffer_cnt;
377                         /* Round to 64 bit alignment. */
378                         uint32_t        kf_pipe_pad0[3];
379                 } kf_pipe;
380                 struct {
381                         uint32_t        kf_pts_dev;
382                         /* Round to 64 bit alignment. */
383                         uint32_t        kf_pts_pad0[7];
384                 } kf_pts;
385                 struct {
386                         pid_t           kf_pid;
387                 } kf_proc;
388         } kf_un;
389         uint16_t        kf_status;              /* Status flags. */
390         uint16_t        kf_pad1;                /* Round to 32 bit alignment. */
391         int             _kf_ispare0;            /* Space for more stuff. */
392         cap_rights_t    kf_cap_rights;          /* Capability rights. */
393         int             _kf_ispare[4];          /* Space for more stuff. */
394         /* Truncated before copyout in sysctl */
395         char            kf_path[PATH_MAX];      /* Path to file, if any. */
396 };
397
398 /*
399  * The KERN_PROC_VMMAP sysctl allows a process to dump the VM layout of
400  * another process as a series of entries.
401  */
402 #define KVME_TYPE_NONE          0
403 #define KVME_TYPE_DEFAULT       1
404 #define KVME_TYPE_VNODE         2
405 #define KVME_TYPE_SWAP          3
406 #define KVME_TYPE_DEVICE        4
407 #define KVME_TYPE_PHYS          5
408 #define KVME_TYPE_DEAD          6
409 #define KVME_TYPE_SG            7
410 #define KVME_TYPE_UNKNOWN       255
411
412 #define KVME_PROT_READ          0x00000001
413 #define KVME_PROT_WRITE         0x00000002
414 #define KVME_PROT_EXEC          0x00000004
415
416 #define KVME_FLAG_COW           0x00000001
417 #define KVME_FLAG_NEEDS_COPY    0x00000002
418 #define KVME_FLAG_NOCOREDUMP    0x00000004
419 #define KVME_FLAG_SUPER         0x00000008
420 #define KVME_FLAG_GROWS_UP      0x00000010
421 #define KVME_FLAG_GROWS_DOWN    0x00000020
422
423 #if defined(__amd64__)
424 #define KINFO_OVMENTRY_SIZE     1168
425 #endif
426 #if defined(__i386__)
427 #define KINFO_OVMENTRY_SIZE     1128
428 #endif
429
430 struct kinfo_ovmentry {
431         int      kve_structsize;                /* Size of kinfo_vmmapentry. */
432         int      kve_type;                      /* Type of map entry. */
433         void    *kve_start;                     /* Starting address. */
434         void    *kve_end;                       /* Finishing address. */
435         int      kve_flags;                     /* Flags on map entry. */
436         int      kve_resident;                  /* Number of resident pages. */
437         int      kve_private_resident;          /* Number of private pages. */
438         int      kve_protection;                /* Protection bitmask. */
439         int      kve_ref_count;                 /* VM obj ref count. */
440         int      kve_shadow_count;              /* VM obj shadow count. */
441         char     kve_path[PATH_MAX];            /* Path to VM obj, if any. */
442         void    *_kve_pspare[8];                /* Space for more stuff. */
443         off_t    kve_offset;                    /* Mapping offset in object */
444         uint64_t kve_fileid;                    /* inode number if vnode */
445         dev_t    kve_fsid;                      /* dev_t of vnode location */
446         int      _kve_ispare[3];                /* Space for more stuff. */
447 };
448
449 #if defined(__amd64__) || defined(__i386__)
450 #define KINFO_VMENTRY_SIZE      1160
451 #endif
452
453 struct kinfo_vmentry {
454         int      kve_structsize;                /* Variable size of record. */
455         int      kve_type;                      /* Type of map entry. */
456         uint64_t kve_start;                     /* Starting address. */
457         uint64_t kve_end;                       /* Finishing address. */
458         uint64_t kve_offset;                    /* Mapping offset in object */
459         uint64_t kve_vn_fileid;                 /* inode number if vnode */
460         uint32_t kve_vn_fsid;                   /* dev_t of vnode location */
461         int      kve_flags;                     /* Flags on map entry. */
462         int      kve_resident;                  /* Number of resident pages. */
463         int      kve_private_resident;          /* Number of private pages. */
464         int      kve_protection;                /* Protection bitmask. */
465         int      kve_ref_count;                 /* VM obj ref count. */
466         int      kve_shadow_count;              /* VM obj shadow count. */
467         int      kve_vn_type;                   /* Vnode type. */
468         uint64_t kve_vn_size;                   /* File size. */
469         uint32_t kve_vn_rdev;                   /* Device id if device. */
470         uint16_t kve_vn_mode;                   /* File mode. */
471         uint16_t kve_status;                    /* Status flags. */
472         int      _kve_ispare[12];               /* Space for more stuff. */
473         /* Truncated before copyout in sysctl */
474         char     kve_path[PATH_MAX];            /* Path to VM obj, if any. */
475 };
476
477 /*
478  * The KERN_PROC_KSTACK sysctl allows a process to dump the kernel stacks of
479  * another process as a series of entries.  Each stack is represented by a
480  * series of symbol names and offsets as generated by stack_sbuf_print(9).
481  */
482 #define KKST_MAXLEN     1024
483
484 #define KKST_STATE_STACKOK      0               /* Stack is valid. */
485 #define KKST_STATE_SWAPPED      1               /* Stack swapped out. */
486 #define KKST_STATE_RUNNING      2               /* Stack ephemeral. */
487
488 #if defined(__amd64__) || defined(__i386__)
489 #define KINFO_KSTACK_SIZE       1096
490 #endif
491
492 struct kinfo_kstack {
493         lwpid_t  kkst_tid;                      /* ID of thread. */
494         int      kkst_state;                    /* Validity of stack. */
495         char     kkst_trace[KKST_MAXLEN];       /* String representing stack. */
496         int      _kkst_ispare[16];              /* Space for more stuff. */
497 };
498
499 #ifdef _KERNEL
500 /* Flags for kern_proc_out function. */
501 #define KERN_PROC_NOTHREADS     0x1
502 #define KERN_PROC_MASK32        0x2
503
504 struct sbuf;
505
506 /*
507  * The kern_proc out functions are helper functions to dump process
508  * miscellaneous kinfo structures to sbuf.  The main consumers are KERN_PROC
509  * sysctls but they may also be used by other kernel subsystems.
510  *
511  * The functions manipulate the process locking state and expect the process
512  * to be locked on enter.  On return the process is unlocked.
513  */
514
515 int     kern_proc_filedesc_out(struct proc *p, struct sbuf *sb, ssize_t maxlen);
516 int     kern_proc_out(struct proc *p, struct sbuf *sb, int flags);
517 int     kern_proc_vmmap_out(struct proc *p, struct sbuf *sb);
518
519 int     vntype_to_kinfo(int vtype);
520 #endif /* !_KERNEL */
521
522 #endif