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]
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * This file defines the standard set of inlines and translators to be made
29 * available for all D programs to use to examine process model state.
32 #
pragma D depends_on
module procfs
35 * The following miscellaneous constants are used by the proc(4) translators
36 * defined below. These are assigned the latest values from the system .h's.
38 inline
char SSLEEP
= @SSLEEP@
;
39 #
pragma D binding
"1.0" SSLEEP
40 inline
char SRUN
= @SRUN@
;
41 #
pragma D binding
"1.0" SRUN
42 inline
char SZOMB
= @SZOMB@
;
43 #
pragma D binding
"1.0" SZOMB
44 inline
char SSTOP
= @SSTOP@
;
45 #
pragma D binding
"1.0" SSTOP
46 inline
char SIDL
= @SIDL@
;
47 #
pragma D binding
"1.0" SIDL
48 inline
char SONPROC
= @SONPROC@
;
49 #
pragma D binding
"1.0" SONPROC
50 inline
char SWAIT
= @SWAIT@
;
51 #
pragma D binding
"1.0" SWAIT
53 inline
int PR_STOPPED
= @PR_STOPPED@
;
54 #
pragma D binding
"1.0" PR_STOPPED
55 inline
int PR_ISTOP
= @PR_ISTOP@
;
56 #
pragma D binding
"1.0" PR_ISTOP
57 inline
int PR_DSTOP
= @PR_DSTOP@
;
58 #
pragma D binding
"1.0" PR_DSTOP
59 inline
int PR_STEP
= @PR_STEP@
;
60 #
pragma D binding
"1.0" PR_STEP
61 inline
int PR_ASLEEP
= @PR_ASLEEP@
;
62 #
pragma D binding
"1.0" PR_ASLEEP
63 inline
int PR_PCINVAL
= @PR_PCINVAL@
;
64 #
pragma D binding
"1.0" PR_PCINVAL
65 inline
int PR_ASLWP
= @PR_ASLWP@
;
66 #
pragma D binding
"1.0" PR_ASLWP
67 inline
int PR_AGENT
= @PR_AGENT@
;
68 #
pragma D binding
"1.0" PR_AGENT
69 inline
int PR_DETACH
= @PR_DETACH@
;
70 #
pragma D binding
"1.0" PR_DETACH
71 inline
int PR_DAEMON
= @PR_DAEMON@
;
72 #
pragma D binding
"1.0" PR_DAEMON
73 inline
int PR_IDLE
= @PR_IDLE@
;
74 #
pragma D binding
"1.4" PR_IDLE
75 inline
int PR_ISSYS
= @PR_ISSYS@
;
76 #
pragma D binding
"1.0" PR_ISSYS
77 inline
int PR_VFORKP
= @PR_VFORKP@
;
78 #
pragma D binding
"1.0" PR_VFORKP
79 inline
int PR_ORPHAN
= @PR_ORPHAN@
;
80 #
pragma D binding
"1.0" PR_ORPHAN
81 inline
int PR_NOSIGCHLD
= @PR_NOSIGCHLD@
;
82 #
pragma D binding
"1.4" PR_NOSIGCHLD
83 inline
int PR_WAITPID
= @PR_WAITPID@
;
84 #
pragma D binding
"1.4" PR_WAITPID
85 inline
int PR_FORK
= @PR_FORK@
;
86 #
pragma D binding
"1.0" PR_FORK
87 inline
int PR_RLC
= @PR_RLC@
;
88 #
pragma D binding
"1.0" PR_RLC
89 inline
int PR_KLC
= @PR_KLC@
;
90 #
pragma D binding
"1.0" PR_KLC
91 inline
int PR_ASYNC
= @PR_ASYNC@
;
92 #
pragma D binding
"1.0" PR_ASYNC
93 inline
int PR_MSACCT
= @PR_MSACCT@
;
94 #
pragma D binding
"1.0" PR_MSACCT
95 inline
int PR_BPTADJ
= @PR_BPTADJ@
;
96 #
pragma D binding
"1.0" PR_BPTADJ
97 inline
int PR_PTRACE
= @PR_PTRACE@
;
98 #
pragma D binding
"1.0" PR_PTRACE
99 inline
int PR_MSFORK
= @PR_MSFORK@
;
100 #
pragma D binding
"1.0" PR_MSFORK
102 inline
char PR_MODEL_ILP32
= @PR_MODEL_ILP32@
;
103 #
pragma D binding
"1.0" PR_MODEL_ILP32
104 inline
char PR_MODEL_LP64
= @PR_MODEL_LP64@
;
105 #
pragma D binding
"1.0" PR_MODEL_LP64
107 inline
char SOBJ_NONE
= @SOBJ_NONE@
;
108 #
pragma D binding
"1.0" SOBJ_NONE
109 inline
char SOBJ_MUTEX
= @SOBJ_MUTEX@
;
110 #
pragma D binding
"1.0" SOBJ_MUTEX
111 inline
char SOBJ_RWLOCK
= @SOBJ_RWLOCK@
;
112 #
pragma D binding
"1.0" SOBJ_RWLOCK
113 inline
char SOBJ_CV
= @SOBJ_CV@
;
114 #
pragma D binding
"1.0" SOBJ_CV
115 inline
char SOBJ_SEMA
= @SOBJ_SEMA@
;
116 #
pragma D binding
"1.0" SOBJ_SEMA
117 inline
char SOBJ_USER
= @SOBJ_USER@
;
118 #
pragma D binding
"1.0" SOBJ_USER
119 inline
char SOBJ_USER_PI
= @SOBJ_USER_PI@
;
120 #
pragma D binding
"1.0" SOBJ_USER_PI
121 inline
char SOBJ_SHUTTLE
= @SOBJ_SHUTTLE@
;
122 #
pragma D binding
"1.0" SOBJ_SHUTTLE
124 inline
int SI_USER
= @SI_USER@
;
125 #
pragma D binding
"1.0" SI_USER
126 inline
int SI_LWP
= @SI_LWP@
;
127 #
pragma D binding
"1.0" SI_LWP
128 inline
int SI_QUEUE
= @SI_QUEUE@
;
129 #
pragma D binding
"1.0" SI_QUEUE
130 inline
int SI_TIMER
= @SI_TIMER@
;
131 #
pragma D binding
"1.0" SI_TIMER
132 inline
int SI_ASYNCIO
= @SI_ASYNCIO@
;
133 #
pragma D binding
"1.0" SI_ASYNCIO
134 inline
int SI_MESGQ
= @SI_MESGQ@
;
135 #
pragma D binding
"1.0" SI_MESGQ
136 inline
int SI_RCTL
= @SI_RCTL@
;
137 #
pragma D binding
"1.0" SI_RCTL
138 inline
int ILL_ILLOPC
= @ILL_ILLOPC@
;
139 #
pragma D binding
"1.0" ILL_ILLOPC
140 inline
int ILL_ILLOPN
= @ILL_ILLOPN@
;
141 #
pragma D binding
"1.0" ILL_ILLOPN
142 inline
int ILL_ILLADR
= @ILL_ILLADR@
;
143 #
pragma D binding
"1.0" ILL_ILLADR
144 inline
int ILL_ILLTRP
= @ILL_ILLTRP@
;
145 #
pragma D binding
"1.0" ILL_ILLTRP
146 inline
int ILL_PRVOPC
= @ILL_PRVOPC@
;
147 #
pragma D binding
"1.0" ILL_PRVOPC
148 inline
int ILL_PRVREG
= @ILL_PRVREG@
;
149 #
pragma D binding
"1.0" ILL_PRVREG
150 inline
int ILL_COPROC
= @ILL_COPROC@
;
151 #
pragma D binding
"1.0" ILL_COPROC
152 inline
int ILL_BADSTK
= @ILL_BADSTK@
;
153 #
pragma D binding
"1.0" ILL_BADSTK
154 inline
int FPE_INTDIV
= @FPE_INTDIV@
;
155 #
pragma D binding
"1.0" FPE_INTDIV
156 inline
int FPE_INTOVF
= @FPE_INTOVF@
;
157 #
pragma D binding
"1.0" FPE_INTOVF
158 inline
int FPE_FLTDIV
= @FPE_FLTDIV@
;
159 #
pragma D binding
"1.0" FPE_FLTDIV
160 inline
int FPE_FLTOVF
= @FPE_FLTOVF@
;
161 #
pragma D binding
"1.0" FPE_FLTOVF
162 inline
int FPE_FLTUND
= @FPE_FLTUND@
;
163 #
pragma D binding
"1.0" FPE_FLTUND
164 inline
int FPE_FLTRES
= @FPE_FLTRES@
;
165 #
pragma D binding
"1.0" FPE_FLTRES
166 inline
int FPE_FLTINV
= @FPE_FLTINV@
;
167 #
pragma D binding
"1.0" FPE_FLTINV
168 inline
int FPE_FLTSUB
= @FPE_FLTSUB@
;
169 #
pragma D binding
"1.0" FPE_FLTSUB
170 inline
int SEGV_MAPERR
= @SEGV_MAPERR@
;
171 #
pragma D binding
"1.0" SEGV_MAPERR
172 inline
int SEGV_ACCERR
= @SEGV_ACCERR@
;
173 #
pragma D binding
"1.0" SEGV_ACCERR
174 inline
int BUS_ADRALN
= @BUS_ADRALN@
;
175 #
pragma D binding
"1.0" BUS_ADRALN
176 inline
int BUS_ADRERR
= @BUS_ADRERR@
;
177 #
pragma D binding
"1.0" BUS_ADRERR
178 inline
int BUS_OBJERR
= @BUS_OBJERR@
;
179 #
pragma D binding
"1.0" BUS_OBJERR
180 inline
int TRAP_BRKPT
= @TRAP_BRKPT@
;
181 #
pragma D binding
"1.0" TRAP_BRKPT
182 inline
int TRAP_TRACE
= @TRAP_TRACE@
;
183 #
pragma D binding
"1.0" TRAP_TRACE
184 inline
int CLD_EXITED
= @CLD_EXITED@
;
185 #
pragma D binding
"1.0" CLD_EXITED
186 inline
int CLD_KILLED
= @CLD_KILLED@
;
187 #
pragma D binding
"1.0" CLD_KILLED
188 inline
int CLD_DUMPED
= @CLD_DUMPED@
;
189 #
pragma D binding
"1.0" CLD_DUMPED
190 inline
int CLD_TRAPPED
= @CLD_TRAPPED@
;
191 #
pragma D binding
"1.0" CLD_TRAPPED
192 inline
int CLD_STOPPED
= @CLD_STOPPED@
;
193 #
pragma D binding
"1.0" CLD_STOPPED
194 inline
int CLD_CONTINUED
= @CLD_CONTINUED@
;
195 #
pragma D binding
"1.0" CLD_CONTINUED
196 inline
int POLL_IN
= @POLL_IN@
;
197 #
pragma D binding
"1.0" POLL_IN
198 inline
int POLL_OUT
= @POLL_OUT@
;
199 #
pragma D binding
"1.0" POLL_OUT
200 inline
int POLL_MSG
= @POLL_MSG@
;
201 #
pragma D binding
"1.0" POLL_MSG
202 inline
int POLL_ERR
= @POLL_ERR@
;
203 #
pragma D binding
"1.0" POLL_ERR
204 inline
int POLL_PRI
= @POLL_PRI@
;
205 #
pragma D binding
"1.0" POLL_PRI
206 inline
int POLL_HUP
= @POLL_HUP@
;
207 #
pragma D binding
"1.0" POLL_HUP
210 * Translate from the kernel's proc_t structure to a proc(4) psinfo_t struct.
211 * We do not provide support for pr_size, pr_rssize, pr_pctcpu, and pr_pctmem.
212 * We also do not fill in pr_lwp (the lwpsinfo_t for the representative LWP)
213 * because we do not have the ability to select and stop any representative.
214 * Also, for the moment, pr_wstat, pr_time, and pr_ctime are not supported,
215 * but these could be supported by DTrace in the future using subroutines.
216 * Note that any member added to this translator should also be added to the
217 * kthread_t-to-psinfo_t translator, below.
219 #
pragma D binding
"1.0" translator
220 translator psinfo_t
< proc_t
*T
> {
221 pr_nlwp
= T
->p_lwpcnt
;
222 pr_pid
= T
->p_pidp
->pid_id
;
224 pr_pgid
= T
->p_pgidp
->pid_id
;
225 pr_sid
= T
->p_sessp
->s_sidp
->pid_id
;
226 pr_uid
= T
->p_cred
->cr_ruid
;
227 pr_euid
= T
->p_cred
->cr_uid
;
228 pr_gid
= T
->p_cred
->cr_rgid
;
229 pr_egid
= T
->p_cred
->cr_gid
;
230 pr_addr
= (uintptr_t
)T
;
232 pr_ttydev
= (T
->p_sessp
->s_vp
== NULL
) ?
(dev_t
)-1 :
233 (T
->p_sessp
->s_dev
== `rwsconsdev) ? `uconsdev
:
234 (T
->p_sessp
->s_dev
== `rconsdev) ? `uconsdev
: T
->p_sessp
->s_dev
;
236 pr_start
= T
->p_user
.u_start
;
237 pr_fname
= T
->p_user
.u_comm
;
238 pr_psargs
= T
->p_user
.u_psargs
;
239 pr_argc
= T
->p_user
.u_argc
;
240 pr_argv
= T
->p_user
.u_argv
;
241 pr_envp
= T
->p_user
.u_envp
;
243 pr_dmodel
= (T
->p_model
== @DATAMODEL_ILP32@
) ?
244 PR_MODEL_ILP32
: PR_MODEL_LP64
;
246 pr_taskid
= T
->p_task
->tk_tkid
;
247 pr_projid
= T
->p_task
->tk_proj
->kpj_id
;
248 pr_poolid
= T
->p_pool
->pool_id
;
249 pr_zoneid
= T
->p_zone
->zone_id
;
250 pr_contract
= (T
->p_ct_process
== NULL
) ?
-1 :
251 T
->p_ct_process
->conp_contract
.ct_id
;
255 * Translate from the kernel's kthread_t structure to a proc(4) psinfo_t
256 * struct. Lacking a facility to define one translator only in terms of
257 * another, we explicitly define each member by using the proc_t-to-psinfo_t
258 * translator, above; any members added to that translator should also be
259 * added here. (The only exception to this is pr_start, which -- due to it
260 * being a structure -- cannot be defined in terms of a translator at all.)
262 #
pragma D binding
"1.0" translator
263 translator psinfo_t
< kthread_t
*T
> {
264 pr_nlwp
= xlate
<psinfo_t
> (T
->t_procp
).pr_nlwp
;
265 pr_pid
= xlate
<psinfo_t
> (T
->t_procp
).pr_pid
;
266 pr_ppid
= xlate
<psinfo_t
> (T
->t_procp
).pr_ppid
;
267 pr_pgid
= xlate
<psinfo_t
> (T
->t_procp
).pr_pgid
;
268 pr_sid
= xlate
<psinfo_t
> (T
->t_procp
).pr_sid
;
269 pr_uid
= xlate
<psinfo_t
> (T
->t_procp
).pr_uid
;
270 pr_euid
= xlate
<psinfo_t
> (T
->t_procp
).pr_euid
;
271 pr_gid
= xlate
<psinfo_t
> (T
->t_procp
).pr_gid
;
272 pr_egid
= xlate
<psinfo_t
> (T
->t_procp
).pr_egid
;
273 pr_addr
= xlate
<psinfo_t
> (T
->t_procp
).pr_addr
;
274 pr_ttydev
= xlate
<psinfo_t
> (T
->t_procp
).pr_ttydev
;
275 pr_start
= (timestruc_t
)xlate
<psinfo_t
> (T
->t_procp
).pr_start
;
276 pr_fname
= xlate
<psinfo_t
> (T
->t_procp
).pr_fname
;
277 pr_psargs
= xlate
<psinfo_t
> (T
->t_procp
).pr_psargs
;
278 pr_argc
= xlate
<psinfo_t
> (T
->t_procp
).pr_argc
;
279 pr_argv
= xlate
<psinfo_t
> (T
->t_procp
).pr_argv
;
280 pr_envp
= xlate
<psinfo_t
> (T
->t_procp
).pr_envp
;
281 pr_dmodel
= xlate
<psinfo_t
> (T
->t_procp
).pr_dmodel
;
282 pr_taskid
= xlate
<psinfo_t
> (T
->t_procp
).pr_taskid
;
283 pr_projid
= xlate
<psinfo_t
> (T
->t_procp
).pr_projid
;
284 pr_poolid
= xlate
<psinfo_t
> (T
->t_procp
).pr_poolid
;
285 pr_zoneid
= xlate
<psinfo_t
> (T
->t_procp
).pr_zoneid
;
286 pr_contract
= xlate
<psinfo_t
> (T
->t_procp
).pr_contract
;
290 * Translate from the kernel's kthread_t structure to a proc(4) lwpsinfo_t.
291 * We do not provide support for pr_nice, pr_oldpri, pr_cpu, or pr_pctcpu.
292 * Also, for the moment, pr_start and pr_time are not supported, but these
293 * could be supported by DTrace in the future using subroutines.
295 #
pragma D binding
"1.0" translator
296 translator lwpsinfo_t
< kthread_t
*T
> {
297 pr_flag
= ((T
->t_state
== @TS_STOPPED@
) ?
(PR_STOPPED |
298 ((!(T
->t_schedflag
& @TS_PSTART@
)) ? PR_ISTOP
: 0)) :
299 ((T
->t_proc_flag
& @TP_PRVSTOP@
) ? PR_STOPPED | PR_ISTOP
: 0)) |
300 ((T
== T
->t_procp
->p_agenttp
) ? PR_AGENT
: 0) |
301 ((!(T
->t_proc_flag
& @TP_TWAIT@
)) ? PR_DETACH
: 0) |
302 ((T
->t_proc_flag
& @TP_DAEMON@
) ? PR_DAEMON
: 0) |
303 ((T
->t_procp
->p_pidflag
& @CLDNOSIGCHLD@
) ? PR_NOSIGCHLD
: 0) |
304 ((T
->t_procp
->p_pidflag
& @CLDWAITPID@
) ? PR_WAITPID
: 0) |
305 ((T
->t_procp
->p_proc_flag
& @P_PR_FORK@
) ? PR_FORK
: 0) |
306 ((T
->t_procp
->p_proc_flag
& @P_PR_RUNLCL@
) ? PR_RLC
: 0) |
307 ((T
->t_procp
->p_proc_flag
& @P_PR_KILLCL@
) ? PR_KLC
: 0) |
308 ((T
->t_procp
->p_proc_flag
& @P_PR_ASYNC@
) ? PR_ASYNC
: 0) |
309 ((T
->t_procp
->p_proc_flag
& @P_PR_BPTADJ@
) ? PR_BPTADJ
: 0) |
310 ((T
->t_procp
->p_proc_flag
& @P_PR_PTRACE@
) ? PR_PTRACE
: 0) |
311 ((T
->t_procp
->p_flag
& @SMSACCT@
) ? PR_MSACCT
: 0) |
312 ((T
->t_procp
->p_flag
& @SMSFORK@
) ? PR_MSFORK
: 0) |
313 ((T
->t_procp
->p_flag
& @SVFWAIT@
) ? PR_VFORKP
: 0) |
314 (((T
->t_procp
->p_flag
& @SSYS@
) ||
315 (T
->t_procp
->p_as
== &`kas)) ? PR_ISSYS : 0) |
316 ((T == T->t_cpu->cpu_idle_thread) ? PR_IDLE : 0);
319 pr_addr = (uintptr_t)T;
320 pr_wchan = (uintptr_t)T->t_lwpchan.lc_wchan;
321 pr_stype = T->t_sobj_ops ? T->t_sobj_ops->sobj_type : 0;
323 pr_state = (T->t_proc_flag & @TP_PRVSTOP@) ? SSTOP :
324 (T->t_state == @TS_SLEEP@) ? SSLEEP :
325 (T->t_state == @TS_RUN@) ? SRUN :
326 (T->t_state == @TS_ONPROC@) ? SONPROC :
327 (T->t_state == @TS_ZOMB@) ? SZOMB :
328 (T->t_state == @TS_STOPPED@) ? SSTOP :
329 (T->t_state == @TS_WAIT@) ? SWAIT : 0;
331 pr_sname = (T->t_proc_flag & @TP_PRVSTOP@) ? 'T' :
332 (T->t_state == @TS_SLEEP@) ? 'S' :
333 (T->t_state == @TS_RUN@) ? 'R' :
334 (T->t_state == @TS_ONPROC@) ? 'O' :
335 (T->t_state == @TS_ZOMB@) ? 'Z' :
336 (T->t_state == @TS_STOPPED@) ? 'T' :
337 (T->t_state == @TS_WAIT@) ? 'W' : '?';
339 pr_syscall = T->t_sysnum;
341 pr_clname = `sclass
[T
->t_cid
].cl_name
;
342 pr_onpro
= T
->t_cpu
->cpu_id
;
343 pr_bindpro
= T
->t_bind_cpu
;
344 pr_bindpset
= T
->t_bind_pset
;
345 pr_lgrp
= T
->t_lpl
->lpl_lgrpid
;
348 inline psinfo_t
*curpsinfo
= xlate
<psinfo_t
*> (curthread
->t_procp
);
349 #
pragma D attributes Stable
/Stable
/Common curpsinfo
350 #
pragma D binding
"1.0" curpsinfo
352 inline lwpsinfo_t
*curlwpsinfo
= xlate
<lwpsinfo_t
*> (curthread
);
353 #
pragma D attributes Stable
/Stable
/Common curlwpsinfo
354 #
pragma D binding
"1.0" curlwpsinfo
356 inline string
cwd = curthread
->t_procp
->p_user
.u_cdir
->v_path
== NULL ?
357 "<unknown>" : stringof(curthread
->t_procp
->p_user
.u_cdir
->v_path
);
358 #
pragma D attributes Stable
/Stable
/Common
cwd
359 #
pragma D binding
"1.0" cwd
361 inline string root
= curthread
->t_procp
->p_user
.u_rdir
== NULL ?
"/" :
362 curthread
->t_procp
->p_user
.u_rdir
->v_path
== NULL ?
"<unknown>" :
363 stringof(curthread
->t_procp
->p_user
.u_rdir
->v_path
);
364 #
pragma D attributes Stable
/Stable
/Common root
365 #
pragma D binding
"1.0" root