4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
30 * Copyright 2018 Joyent, Inc.
33 #ifndef _SYS_PROC_PRDATA_H
34 #define _SYS_PROC_PRDATA_H
36 #include <sys/isa_defs.h>
38 #include <sys/vnode.h>
39 #include <sys/prsystm.h>
40 #include <sys/model.h>
49 * Test for thread being stopped, not on an event of interest,
50 * but with a directed stop in effect.
53 ((t)->t_state == TS_STOPPED && \
54 ((t)->t_proc_flag & TP_PRSTOP))
56 #define round4(r) (((r) + 3) & (~3))
57 #define round8(r) (((r) + 7) & (~7))
58 #define round16(r) (((r) + 15) & (~15))
59 #define roundlong(r) (((r) + sizeof (long) - 1) & (~(sizeof (long) - 1)))
61 #define PNSIZ 10 /* max size of /proc name entries */
62 #define PLNSIZ 10 /* max size of /proc lwp name entries */
65 * Common file object to which all /proc vnodes for a specific process
66 * or lwp refer. One for the process, one for each lwp.
68 typedef struct prcommon
{
69 kmutex_t prc_mutex
; /* to wait for the proc/lwp to stop */
70 kcondvar_t prc_wait
; /* to wait for the proc/lwp to stop */
71 ushort_t prc_flags
; /* flags */
72 uint_t prc_writers
; /* number of write opens of prnodes */
73 uint_t prc_selfopens
; /* number of write opens by self */
74 pid_t prc_pid
; /* process id */
75 model_t prc_datamodel
; /* data model of the process */
76 proc_t
*prc_proc
; /* process being traced */
77 kthread_t
*prc_thread
; /* thread (lwp) being traced */
78 int prc_slot
; /* procdir slot number */
79 id_t prc_tid
; /* thread (lwp) id */
80 int prc_tslot
; /* lwpdir slot number, -1 if reaped */
81 int prc_refcnt
; /* this structure's reference count */
82 struct pollhead prc_pollhead
; /* list of all pollers */
86 #define PRC_DESTROY 0x01 /* process or lwp is being destroyed */
87 #define PRC_LWP 0x02 /* structure refers to an lwp */
88 #define PRC_SYS 0x04 /* process is a system process */
89 #define PRC_POLL 0x08 /* poll() in progress on this process/lwp */
90 #define PRC_EXCL 0x10 /* exclusive access granted (old /proc) */
93 * Macros for mapping between i-numbers and pids.
95 #define pmkino(tslot, pslot, nodetype) \
96 (((((ino_t)(tslot) << nproc_highbit) | \
97 (ino_t)(pslot)) << 6) | \
100 /* for old /proc interface */
102 #define ptoi(n) ((int)(((n) + PRBIAS))) /* pid to i-number */
105 * Node types for /proc files (directories and files contained therein).
107 typedef enum prnodetype
{
108 PR_PROCDIR
, /* /proc */
109 PR_SELF
, /* /proc/self */
110 PR_PIDDIR
, /* /proc/<pid> */
111 PR_AS
, /* /proc/<pid>/as */
112 PR_CTL
, /* /proc/<pid>/ctl */
113 PR_STATUS
, /* /proc/<pid>/status */
114 PR_LSTATUS
, /* /proc/<pid>/lstatus */
115 PR_PSINFO
, /* /proc/<pid>/psinfo */
116 PR_LPSINFO
, /* /proc/<pid>/lpsinfo */
117 PR_MAP
, /* /proc/<pid>/map */
118 PR_RMAP
, /* /proc/<pid>/rmap */
119 PR_XMAP
, /* /proc/<pid>/xmap */
120 PR_CRED
, /* /proc/<pid>/cred */
121 PR_SIGACT
, /* /proc/<pid>/sigact */
122 PR_AUXV
, /* /proc/<pid>/auxv */
123 #if defined(__i386) || defined(__amd64)
124 PR_LDT
, /* /proc/<pid>/ldt */
126 PR_USAGE
, /* /proc/<pid>/usage */
127 PR_LUSAGE
, /* /proc/<pid>/lusage */
128 PR_PAGEDATA
, /* /proc/<pid>/pagedata */
129 PR_WATCH
, /* /proc/<pid>/watch */
130 PR_CURDIR
, /* /proc/<pid>/cwd */
131 PR_ROOTDIR
, /* /proc/<pid>/root */
132 PR_FDDIR
, /* /proc/<pid>/fd */
133 PR_FD
, /* /proc/<pid>/fd/nn */
134 PR_OBJECTDIR
, /* /proc/<pid>/object */
135 PR_OBJECT
, /* /proc/<pid>/object/xxx */
136 PR_LWPDIR
, /* /proc/<pid>/lwp */
137 PR_LWPIDDIR
, /* /proc/<pid>/lwp/<lwpid> */
138 PR_LWPCTL
, /* /proc/<pid>/lwp/<lwpid>/lwpctl */
139 PR_LWPNAME
, /* /proc/<pid>/lwp/<lwpid>/lwpname */
140 PR_LWPSTATUS
, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */
141 PR_LWPSINFO
, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */
142 PR_LWPUSAGE
, /* /proc/<pid>/lwp/<lwpid>/lwpusage */
143 PR_XREGS
, /* /proc/<pid>/lwp/<lwpid>/xregs */
144 PR_TMPLDIR
, /* /proc/<pid>/lwp/<lwpid>/templates */
145 PR_TMPL
, /* /proc/<pid>/lwp/<lwpid>/templates/<id> */
146 PR_SPYMASTER
, /* /proc/<pid>/lwp/<lwpid>/spymaster */
148 PR_GWINDOWS
, /* /proc/<pid>/lwp/<lwpid>/gwindows */
149 PR_ASRS
, /* /proc/<pid>/lwp/<lwpid>/asrs */
151 PR_PRIV
, /* /proc/<pid>/priv */
152 PR_PATHDIR
, /* /proc/<pid>/path */
153 PR_PATH
, /* /proc/<pid>/path/xxx */
154 PR_CTDIR
, /* /proc/<pid>/contracts */
155 PR_CT
, /* /proc/<pid>/contracts/<ctid> */
156 PR_SECFLAGS
, /* /proc/<pid>/secflags */
157 PR_PIDFILE
, /* old process file */
158 PR_LWPIDFILE
, /* old lwp file */
159 PR_OPAGEDATA
, /* old page data file */
160 PR_NFILES
/* number of /proc node types */
163 typedef struct prnode
{
164 vnode_t
*pr_next
; /* list of all vnodes for process */
165 uint_t pr_flags
; /* private flags */
166 kmutex_t pr_mutex
; /* locks pr_files and child pr_flags */
167 prnodetype_t pr_type
; /* node type */
168 mode_t pr_mode
; /* file mode */
169 ino_t pr_ino
; /* node id (for stat(2)) */
170 uint_t pr_hatid
; /* hat layer id for page data files */
171 prcommon_t
*pr_common
; /* common data structure */
172 prcommon_t
*pr_pcommon
; /* process common data structure */
173 vnode_t
*pr_parent
; /* parent directory */
174 vnode_t
**pr_files
; /* contained files array (directory) */
175 uint_t pr_index
; /* position within parent */
176 vnode_t
*pr_pidfile
; /* substitute vnode for old /proc */
177 vnode_t
*pr_realvp
; /* real vnode, file in object,fd dirs */
178 proc_t
*pr_owner
; /* the process that created this node */
179 vnode_t
*pr_vnode
; /* pointer to vnode */
180 struct contract
*pr_contract
; /* contract pointer */
181 int pr_cttype
; /* active template type */
185 * Values for pr_flags.
187 #define PR_INVAL 0x01 /* vnode is invalidated */
188 #define PR_ISSELF 0x02 /* vnode is a self-open */
189 #define PR_AOUT 0x04 /* vnode is for an a.out path */
190 #define PR_OFFMAX 0x08 /* vnode is a large file open */
195 #define VTOP(vp) ((struct prnode *)(vp)->v_data)
196 #define PTOV(pnp) ((pnp)->pr_vnode)
201 #define ZNO 0 /* Fail on encountering a zombie process. */
202 #define ZYES 1 /* Allow zombies. */
205 * Assign one set to another (possible different sizes).
207 * Assigning to a smaller set causes members to be lost.
208 * Assigning to a larger set causes extra members to be cleared.
210 #define prassignset(ap, sp) \
212 register int _i_ = sizeof (*(ap))/sizeof (uint32_t); \
214 ((uint32_t *)(ap))[_i_] = \
215 (_i_ >= sizeof (*(sp))/sizeof (uint32_t)) ? \
216 0 : ((uint32_t *)(sp))[_i_]; \
220 * Determine whether or not a set (of arbitrary size) is empty.
222 #define prisempty(sp) \
223 setisempty((uint32_t *)(sp), \
224 (uint_t)(sizeof (*(sp)) / sizeof (uint32_t)))
227 * Resource usage with times as hrtime_t rather than timestruc_t.
228 * Each member exactly matches the corresponding member in prusage_t.
229 * This is for convenience of internal computation.
231 typedef struct prhusage
{
232 id_t pr_lwpid
; /* lwp id. 0: process or defunct */
233 int pr_count
; /* number of contributing lwps */
234 hrtime_t pr_tstamp
; /* current time stamp */
235 hrtime_t pr_create
; /* process/lwp creation time stamp */
236 hrtime_t pr_term
; /* process/lwp termination time stamp */
237 hrtime_t pr_rtime
; /* total lwp real (elapsed) time */
238 hrtime_t pr_utime
; /* user level CPU time */
239 hrtime_t pr_stime
; /* system call CPU time */
240 hrtime_t pr_ttime
; /* other system trap CPU time */
241 hrtime_t pr_tftime
; /* text page fault sleep time */
242 hrtime_t pr_dftime
; /* data page fault sleep time */
243 hrtime_t pr_kftime
; /* kernel page fault sleep time */
244 hrtime_t pr_ltime
; /* user lock wait sleep time */
245 hrtime_t pr_slptime
; /* all other sleep time */
246 hrtime_t pr_wtime
; /* wait-cpu (latency) time */
247 hrtime_t pr_stoptime
; /* stopped time */
248 hrtime_t filltime
[6]; /* filler for future expansion */
249 uint64_t pr_minf
; /* minor page faults */
250 uint64_t pr_majf
; /* major page faults */
251 uint64_t pr_nswap
; /* swaps */
252 uint64_t pr_inblk
; /* input blocks */
253 uint64_t pr_oublk
; /* output blocks */
254 uint64_t pr_msnd
; /* messages sent */
255 uint64_t pr_mrcv
; /* messages received */
256 uint64_t pr_sigs
; /* signals received */
257 uint64_t pr_vctx
; /* voluntary context switches */
258 uint64_t pr_ictx
; /* involuntary context switches */
259 uint64_t pr_sysc
; /* system calls */
260 uint64_t pr_ioch
; /* chars read and written */
261 uint64_t filler
[10]; /* filler for future expansion */
266 /* Exclude system processes from this test */
267 #define PROCESS_NOT_32BIT(p) \
268 (!((p)->p_flag & SSYS) && (p)->p_as != &kas && \
269 (p)->p_model != DATAMODEL_ILP32)
271 extern int prnwatch
; /* number of supported watchpoints */
272 extern int nproc_highbit
; /* highbit(v.v_nproc) */
274 extern struct vnodeops
*prvnodeops
;
277 * Generic chained copyout buffers for procfs use.
278 * In order to prevent procfs from making huge oversize kmem_alloc calls,
279 * a list of smaller buffers can be concatenated and copied to userspace in
282 * The implementation is opaque.
284 * A user of this will perform the following steps:
289 * pr_iol_initlist(&listhead, sizeof (*mp), n);
291 * mp = pr_iol_newbuf(&listhead, sizeof (*mp);
296 * When done, depending on whether copyout() or uiomove() is supposed to
297 * be used for transferring the buffered data to userspace, call either:
299 * error = pr_iol_copyout_and_free(&listhead, &cmaddr, error);
303 * error = pr_iol_uiomove_and_free(&listhead, uiop, error);
305 * These two functions will in any case kmem_free() all list items, but
306 * if an error occurred before they will not perform the copyout/uiomove.
307 * If copyout/uiomove are done, the passed target address / uio_t
308 * are updated. The error returned will either be the one passed in, or
309 * the error that occurred during copyout/uiomove.
312 extern void pr_iol_initlist(list_t
*head
, size_t itemsize
, int nitems
);
313 extern void * pr_iol_newbuf(list_t
*head
, size_t itemsize
);
314 extern int pr_iol_copyout_and_free(list_t
*head
, caddr_t
*tgt
, int errin
);
315 extern int pr_iol_uiomove_and_free(list_t
*head
, uio_t
*uiop
, int errin
);
317 #if defined(_SYSCALL32_IMPL)
319 extern int prwritectl32(vnode_t
*, struct uio
*, cred_t
*);
320 extern void prgetaction32(proc_t
*, user_t
*, uint_t
, struct sigaction32
*);
321 extern void prcvtusage32(struct prhusage
*, prusage32_t
*);
323 #endif /* _SYSCALL32_IMPL */
325 /* kludge to support old /proc interface */
326 #if !defined(_SYS_OLD_PROCFS_H)
327 extern int prgetmap(proc_t
*, int, list_t
*);
328 extern int prgetxmap(proc_t
*, list_t
*);
329 #if defined(_SYSCALL32_IMPL)
330 extern int prgetmap32(proc_t
*, int, list_t
*);
331 extern int prgetxmap32(proc_t
*, list_t
*);
332 #endif /* _SYSCALL32_IMPL */
333 #endif /* !_SYS_OLD_PROCFS_H */
335 extern proc_t
*pr_p_lock(prnode_t
*);
336 extern kthread_t
*pr_thread(prnode_t
*);
337 extern void pr_stop(prnode_t
*);
338 extern int pr_wait_stop(prnode_t
*, time_t);
339 extern int pr_setrun(prnode_t
*, ulong_t
);
340 extern int pr_wait(prcommon_t
*, timestruc_t
*, int);
341 extern void pr_wait_die(prnode_t
*);
342 extern int pr_setsig(prnode_t
*, siginfo_t
*);
343 extern int pr_kill(prnode_t
*, int, cred_t
*);
344 extern int pr_unkill(prnode_t
*, int);
345 extern int pr_nice(proc_t
*, int, cred_t
*);
346 extern void pr_setentryexit(proc_t
*, sysset_t
*, int);
347 extern int pr_set(proc_t
*, long);
348 extern int pr_unset(proc_t
*, long);
349 extern void pr_sethold(prnode_t
*, sigset_t
*);
350 extern void pr_setfault(proc_t
*, fltset_t
*);
351 extern int prusrio(proc_t
*, enum uio_rw
, struct uio
*, int);
352 extern int prwritectl(vnode_t
*, struct uio
*, cred_t
*);
353 extern int prlock(prnode_t
*, int);
354 extern void prunmark(proc_t
*);
355 extern void prunlock(prnode_t
*);
356 extern size_t prpdsize(struct as
*);
357 extern int prpdread(proc_t
*, uint_t
, struct uio
*);
358 extern size_t oprpdsize(struct as
*);
359 extern int oprpdread(struct as
*, uint_t
, struct uio
*);
360 extern void prgetaction(proc_t
*, user_t
*, uint_t
, struct sigaction
*);
361 extern void prgetusage(kthread_t
*, struct prhusage
*);
362 extern void praddusage(kthread_t
*, struct prhusage
*);
363 extern void prcvtusage(struct prhusage
*, prusage_t
*);
364 extern void prscaleusage(prhusage_t
*);
365 extern kthread_t
*prchoose(proc_t
*);
366 extern void allsetrun(proc_t
*);
367 extern int setisempty(uint32_t *, uint_t
);
368 extern int pr_u32tos(uint32_t, char *, int);
369 extern vnode_t
*prlwpnode(prnode_t
*, uint_t
);
370 extern prnode_t
*prgetnode(vnode_t
*, prnodetype_t
);
371 extern void prfreenode(prnode_t
*);
372 extern void pr_object_name(char *, vnode_t
*, struct vattr
*);
373 extern int set_watched_area(proc_t
*, struct watched_area
*);
374 extern int clear_watched_area(proc_t
*, struct watched_area
*);
375 extern void pr_free_watchpoints(proc_t
*);
376 extern proc_t
*pr_cancel_watch(prnode_t
*);
377 extern struct seg
*break_seg(proc_t
*);
380 * Machine-dependent routines (defined in prmachdep.c).
382 extern void prgetprregs(klwp_t
*, prgregset_t
);
383 extern void prsetprregs(klwp_t
*, prgregset_t
, int);
385 #if defined(_SYSCALL32_IMPL)
386 extern void prgetprregs32(klwp_t
*, prgregset32_t
);
387 extern void prgregset_32ton(klwp_t
*, prgregset32_t
, prgregset_t
);
388 extern void prgetprfpregs32(klwp_t
*, prfpregset32_t
*);
389 extern void prsetprfpregs32(klwp_t
*, prfpregset32_t
*);
390 extern size_t prpdsize32(struct as
*);
391 extern int prpdread32(proc_t
*, uint_t
, struct uio
*);
392 extern size_t oprpdsize32(struct as
*);
393 extern int oprpdread32(struct as
*, uint_t
, struct uio
*);
394 #endif /* _SYSCALL32_IMPL */
396 extern void prpokethread(kthread_t
*t
);
397 extern int prgetrvals(klwp_t
*, long *, long *);
398 extern void prgetprfpregs(klwp_t
*, prfpregset_t
*);
399 extern void prsetprfpregs(klwp_t
*, prfpregset_t
*);
400 extern void prgetprxregs(klwp_t
*, caddr_t
);
401 extern void prsetprxregs(klwp_t
*, caddr_t
);
402 extern int prgetprxregsize(proc_t
*);
403 extern int prhasfp(void);
404 extern int prhasx(proc_t
*);
405 extern caddr_t
prgetstackbase(proc_t
*);
406 extern caddr_t
prgetpsaddr(proc_t
*);
407 extern int prisstep(klwp_t
*);
408 extern void prsvaddr(klwp_t
*, caddr_t
);
409 extern int prfetchinstr(klwp_t
*, ulong_t
*);
410 extern ushort_t
prgetpctcpu(uint64_t);
418 #endif /* _SYS_PROC_PRDATA_H */