1*bbb1b6f9SApple OSS Distributions /* 2*bbb1b6f9SApple OSS Distributions * Copyright (c) 2005-2006 Apple Computer, Inc. All rights reserved. 3*bbb1b6f9SApple OSS Distributions * 4*bbb1b6f9SApple OSS Distributions * @APPLE_LICENSE_HEADER_START@ 5*bbb1b6f9SApple OSS Distributions * 6*bbb1b6f9SApple OSS Distributions * The contents of this file constitute Original Code as defined in and 7*bbb1b6f9SApple OSS Distributions * are subject to the Apple Public Source License Version 1.1 (the 8*bbb1b6f9SApple OSS Distributions * "License"). You may not use this file except in compliance with the 9*bbb1b6f9SApple OSS Distributions * License. Please obtain a copy of the License at 10*bbb1b6f9SApple OSS Distributions * http://www.apple.com/publicsource and read it before using this file. 11*bbb1b6f9SApple OSS Distributions * 12*bbb1b6f9SApple OSS Distributions * This Original Code and all software distributed under the License are 13*bbb1b6f9SApple OSS Distributions * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14*bbb1b6f9SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15*bbb1b6f9SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16*bbb1b6f9SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17*bbb1b6f9SApple OSS Distributions * License for the specific language governing rights and limitations 18*bbb1b6f9SApple OSS Distributions * under the License. 19*bbb1b6f9SApple OSS Distributions * 20*bbb1b6f9SApple OSS Distributions * @APPLE_LICENSE_HEADER_END@ 21*bbb1b6f9SApple OSS Distributions */ 22*bbb1b6f9SApple OSS Distributions 23*bbb1b6f9SApple OSS Distributions inline int UT_VFORK = 0x02000000; /* thread has vfork children */ 24*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" UT_VFORK 25*bbb1b6f9SApple OSS Distributions 26*bbb1b6f9SApple OSS Distributions inline uthread_t uthread = (mach_kernel`uthread_t)(&curthread[1]); /* ` */ 27*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" uthread 28*bbb1b6f9SApple OSS Distributions 29*bbb1b6f9SApple OSS Distributions inline struct proc * curproc = 30*bbb1b6f9SApple OSS Distributions ((struct proc *)(curthread->t_tro->tro_proc)) != NULL ? ((struct proc *)(curthread->t_tro->tro_proc)) : 31*bbb1b6f9SApple OSS Distributions mach_kernel`kernproc; /* ` */ 32*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" curproc 33*bbb1b6f9SApple OSS Distributions 34*bbb1b6f9SApple OSS Distributions /* 35*bbb1b6f9SApple OSS Distributions * curthread->thread_tag will have this set if the thread is the main thread 36*bbb1b6f9SApple OSS Distributions */ 37*bbb1b6f9SApple OSS Distributions inline uint32_t THREAD_TAG_MAINTHREAD = 0x1; 38*bbb1b6f9SApple OSS Distributions inline uint32_t THREAD_TAG_CALLOUT = 0x2; 39*bbb1b6f9SApple OSS Distributions inline uint32_t THREAD_TAG_IOWORKLOOP = 0x4; 40*bbb1b6f9SApple OSS Distributions 41*bbb1b6f9SApple OSS Distributions /* 42*bbb1b6f9SApple OSS Distributions * mach thread scheduler state 43*bbb1b6f9SApple OSS Distributions */ 44*bbb1b6f9SApple OSS Distributions inline int TH_WAIT = 0x01; 45*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_WAIT 46*bbb1b6f9SApple OSS Distributions inline int TH_SUSP = 0x02; 47*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_SUSP 48*bbb1b6f9SApple OSS Distributions inline int TH_RUN = 0x04; 49*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_RUN 50*bbb1b6f9SApple OSS Distributions inline int TH_UNINT = 0x08; 51*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_UNINT 52*bbb1b6f9SApple OSS Distributions inline int TH_TERMINATE = 0x10; 53*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_TERMINATE 54*bbb1b6f9SApple OSS Distributions inline int TH_TERMINATE2 = 0x20; 55*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_TERMINATE2 56*bbb1b6f9SApple OSS Distributions inline int TH_IDLE = 0x80; 57*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" TH_IDLE 58*bbb1b6f9SApple OSS Distributions 59*bbb1b6f9SApple OSS Distributions /* 60*bbb1b6f9SApple OSS Distributions * The following miscellaneous constants are used by the proc(4) translators 61*bbb1b6f9SApple OSS Distributions * defined below. 62*bbb1b6f9SApple OSS Distributions */ 63*bbb1b6f9SApple OSS Distributions inline char SIDL = 1; 64*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SIDL 65*bbb1b6f9SApple OSS Distributions inline char SRUN = 2; 66*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SRUN 67*bbb1b6f9SApple OSS Distributions inline char SSLEEP = 3; 68*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SSLEEP 69*bbb1b6f9SApple OSS Distributions inline char SSTOP = 4; 70*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SSTOP 71*bbb1b6f9SApple OSS Distributions inline char SZOMB = 5; 72*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SZOMB 73*bbb1b6f9SApple OSS Distributions /* 74*bbb1b6f9SApple OSS Distributions * SONPROC defined here for compatability with ported scripts 75*bbb1b6f9SApple OSS Distributions */ 76*bbb1b6f9SApple OSS Distributions inline char SONPROC = 6; 77*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SONPROC 78*bbb1b6f9SApple OSS Distributions 79*bbb1b6f9SApple OSS Distributions inline char SOBJ_NONE = 0; 80*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_NONE 81*bbb1b6f9SApple OSS Distributions /* 82*bbb1b6f9SApple OSS Distributions * SOBJ_* defined here for compatability with ported scripts 83*bbb1b6f9SApple OSS Distributions */ 84*bbb1b6f9SApple OSS Distributions inline char SOBJ_MUTEX = 1; 85*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_MUTEX 86*bbb1b6f9SApple OSS Distributions inline char SOBJ_RWLOCK = 2; 87*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_RWLOCK 88*bbb1b6f9SApple OSS Distributions inline char SOBJ_CV = 3; 89*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_CV 90*bbb1b6f9SApple OSS Distributions inline char SOBJ_SEMA = 4; 91*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_SEMA 92*bbb1b6f9SApple OSS Distributions inline char SOBJ_USER = 5; 93*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_USER 94*bbb1b6f9SApple OSS Distributions inline char SOBJ_USER_PI = 6; 95*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_USER_PI 96*bbb1b6f9SApple OSS Distributions inline char SOBJ_SHUTTLE = 7; 97*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" SOBJ_SHUTTLE 98*bbb1b6f9SApple OSS Distributions 99*bbb1b6f9SApple OSS Distributions inline char PR_MODEL_ILP32 = 1; 100*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_MODEL_ILP32 101*bbb1b6f9SApple OSS Distributions inline char PR_MODEL_LP64 = 2; 102*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_MODEL_LP64 103*bbb1b6f9SApple OSS Distributions 104*bbb1b6f9SApple OSS Distributions /* 105*bbb1b6f9SApple OSS Distributions * PR_* defined here for compatability with ported scripts 106*bbb1b6f9SApple OSS Distributions */ 107*bbb1b6f9SApple OSS Distributions inline int PR_STOPPED = 0x00000001; 108*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_STOPPED 109*bbb1b6f9SApple OSS Distributions inline int PR_ISTOP = 0x00000002; 110*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ISTOP 111*bbb1b6f9SApple OSS Distributions inline int PR_DSTOP = 0x00000004; 112*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_DSTOP 113*bbb1b6f9SApple OSS Distributions inline int PR_STEP = 0x00000008; 114*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_STEP 115*bbb1b6f9SApple OSS Distributions inline int PR_ASLEEP = 0x00000010; 116*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ASLEEP 117*bbb1b6f9SApple OSS Distributions inline int PR_PCINVAL = 0x00000020; 118*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_PCINVAL 119*bbb1b6f9SApple OSS Distributions inline int PR_ASLWP = 0x00000040; 120*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ASLWP 121*bbb1b6f9SApple OSS Distributions inline int PR_AGENT = 0x00000080; 122*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_AGENT 123*bbb1b6f9SApple OSS Distributions inline int PR_DETACH = 0x00000100; 124*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_DETACH 125*bbb1b6f9SApple OSS Distributions inline int PR_DAEMON = 0x00000200; 126*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_DAEMON 127*bbb1b6f9SApple OSS Distributions inline int PR_ISSYS = 0x00001000; 128*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ISSYS 129*bbb1b6f9SApple OSS Distributions inline int PR_VFORKP = 0x00002000; 130*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_VFORKP 131*bbb1b6f9SApple OSS Distributions inline int PR_ORPHAN = 0x00004000; 132*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ORPHAN 133*bbb1b6f9SApple OSS Distributions inline int PR_FORK = 0x00100000; 134*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_FORK 135*bbb1b6f9SApple OSS Distributions inline int PR_RLC = 0x00200000; 136*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_RLC 137*bbb1b6f9SApple OSS Distributions inline int PR_KLC = 0x00400000; 138*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_KLC 139*bbb1b6f9SApple OSS Distributions inline int PR_ASYNC = 0x00800000; 140*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_ASYNC 141*bbb1b6f9SApple OSS Distributions inline int PR_MSACCT = 0x01000000; 142*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_MSACCT 143*bbb1b6f9SApple OSS Distributions inline int PR_BPTADJ = 0x02000000; 144*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_BPTADJ 145*bbb1b6f9SApple OSS Distributions inline int PR_PTRACE = 0x04000000; 146*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_PTRACE 147*bbb1b6f9SApple OSS Distributions inline int PR_MSFORK = 0x08000000; 148*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_MSFORK 149*bbb1b6f9SApple OSS Distributions inline int PR_IDLE = 0x10000000; 150*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PR_IDLE 151*bbb1b6f9SApple OSS Distributions 152*bbb1b6f9SApple OSS Distributions /* 153*bbb1b6f9SApple OSS Distributions * Translate from the kernel's proc_t structure to a proc(4) psinfo_t struct. 154*bbb1b6f9SApple OSS Distributions * We do not provide support for pr_size, pr_rssize, pr_pctcpu, and pr_pctmem. 155*bbb1b6f9SApple OSS Distributions * We also do not fill in pr_lwp (the lwpsinfo_t for the representative LWP) 156*bbb1b6f9SApple OSS Distributions * because we do not have the ability to select and stop any representative. 157*bbb1b6f9SApple OSS Distributions * Also, for the moment, pr_wstat, pr_time, and pr_ctime are not supported, 158*bbb1b6f9SApple OSS Distributions * but these could be supported by DTrace in the future using subroutines. 159*bbb1b6f9SApple OSS Distributions * Note that any member added to this translator should also be added to the 160*bbb1b6f9SApple OSS Distributions * kthread_t-to-psinfo_t translator, below. 161*bbb1b6f9SApple OSS Distributions */ 162*bbb1b6f9SApple OSS Distributions typedef int taskid_t; 163*bbb1b6f9SApple OSS Distributions typedef int projid_t; 164*bbb1b6f9SApple OSS Distributions typedef int poolid_t; 165*bbb1b6f9SApple OSS Distributions typedef struct timespec timestruc_t; /* (SECONDS, NANOSECONDS) */ 166*bbb1b6f9SApple OSS Distributions 167*bbb1b6f9SApple OSS Distributions typedef struct psinfo { 168*bbb1b6f9SApple OSS Distributions int pr_nlwp; /* number of active lwps in the process */ 169*bbb1b6f9SApple OSS Distributions pid_t pr_pid; /* unique process id */ 170*bbb1b6f9SApple OSS Distributions pid_t pr_ppid; /* process id of parent */ 171*bbb1b6f9SApple OSS Distributions pid_t pr_pgid; /* pid of process group leader */ 172*bbb1b6f9SApple OSS Distributions pid_t pr_sid; /* session id */ 173*bbb1b6f9SApple OSS Distributions uid_t pr_uid; /* real user id */ 174*bbb1b6f9SApple OSS Distributions uid_t pr_euid; /* effective user id */ 175*bbb1b6f9SApple OSS Distributions gid_t pr_gid; /* real group id */ 176*bbb1b6f9SApple OSS Distributions gid_t pr_egid; /* effective group id */ 177*bbb1b6f9SApple OSS Distributions uintptr_t pr_addr; /* address of process */ 178*bbb1b6f9SApple OSS Distributions dev_t pr_ttydev; /* controlling tty device (or PRNODEV) */ 179*bbb1b6f9SApple OSS Distributions timestruc_t pr_start;/* process start time, DEPRECATED, see pr_start_tv below */ 180*bbb1b6f9SApple OSS Distributions char pr_fname[16]; /* name of execed file */ 181*bbb1b6f9SApple OSS Distributions char pr_psargs[80]; /* initial characters of arg list */ 182*bbb1b6f9SApple OSS Distributions int pr_argc; /* initial argument count */ 183*bbb1b6f9SApple OSS Distributions user_addr_t pr_argv; /* address of initial argument vector */ 184*bbb1b6f9SApple OSS Distributions user_addr_t pr_envp; /* address of initial environment vector */ 185*bbb1b6f9SApple OSS Distributions char pr_dmodel; /* data model of the process */ 186*bbb1b6f9SApple OSS Distributions taskid_t pr_taskid; /* task id */ 187*bbb1b6f9SApple OSS Distributions projid_t pr_projid; /* project id */ 188*bbb1b6f9SApple OSS Distributions poolid_t pr_poolid; /* pool id */ 189*bbb1b6f9SApple OSS Distributions zoneid_t pr_zoneid; /* zone id */ 190*bbb1b6f9SApple OSS Distributions 191*bbb1b6f9SApple OSS Distributions struct timeval pr_start_tv; /* process start time, from the epoch (SECONDS, MICROSECONDS) */ 192*bbb1b6f9SApple OSS Distributions } psinfo_t; 193*bbb1b6f9SApple OSS Distributions 194*bbb1b6f9SApple OSS Distributions inline int P_LP64 = 0x00000004; /* Process is LP64 */ 195*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" P_LP64 196*bbb1b6f9SApple OSS Distributions 197*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" translator 198*bbb1b6f9SApple OSS Distributions translator psinfo_t < struct proc * P > { 199*bbb1b6f9SApple OSS Distributions pr_nlwp = ((struct task *)(P->p_proc_ro->pr_task))->thread_count; 200*bbb1b6f9SApple OSS Distributions pr_pid = P->p_pid; 201*bbb1b6f9SApple OSS Distributions pr_ppid = P->p_ppid; 202*bbb1b6f9SApple OSS Distributions pr_pgid = P->p_pgrp.__smr_ptr->pg_id; 203*bbb1b6f9SApple OSS Distributions pr_sid = P->p_pgrp.__smr_ptr->pg_session->s_sid; 204*bbb1b6f9SApple OSS Distributions pr_uid = P->p_proc_ro->p_ucred.__smr_ptr->cr_posix.cr_ruid; 205*bbb1b6f9SApple OSS Distributions pr_euid = P->p_proc_ro->p_ucred.__smr_ptr->cr_posix.cr_uid; 206*bbb1b6f9SApple OSS Distributions pr_gid = P->p_proc_ro->p_ucred.__smr_ptr->cr_posix.cr_rgid; 207*bbb1b6f9SApple OSS Distributions pr_egid = P->p_proc_ro->p_ucred.__smr_ptr->cr_posix.cr_groups[0]; 208*bbb1b6f9SApple OSS Distributions pr_addr = (uintptr_t)P; 209*bbb1b6f9SApple OSS Distributions 210*bbb1b6f9SApple OSS Distributions pr_ttydev = (P->p_pgrp.__smr_ptr->pg_session->s_ttyvp == NULL) ? (dev_t)-1 : 211*bbb1b6f9SApple OSS Distributions P->p_pgrp.__smr_ptr->pg_session->s_ttyp->t_dev; 212*bbb1b6f9SApple OSS Distributions 213*bbb1b6f9SApple OSS Distributions /* 214*bbb1b6f9SApple OSS Distributions * timestruct_t (SECONDS, NANOSECONDS) is not available directly nor can a further translation 215*bbb1b6f9SApple OSS Distributions * be specified here. Zero the structure. Use pr_start_tv instead. 216*bbb1b6f9SApple OSS Distributions */ 217*bbb1b6f9SApple OSS Distributions pr_start = *((timestruc_t *)`dtrace_zero); /* ` */ 218*bbb1b6f9SApple OSS Distributions 219*bbb1b6f9SApple OSS Distributions pr_fname = P->p_comm; 220*bbb1b6f9SApple OSS Distributions pr_psargs = P->p_comm; /* XXX omits command line arguments XXX */ 221*bbb1b6f9SApple OSS Distributions pr_argc = P->p_argc; 222*bbb1b6f9SApple OSS Distributions pr_argv = P->p_dtrace_argv; 223*bbb1b6f9SApple OSS Distributions pr_envp = P->p_dtrace_envp; 224*bbb1b6f9SApple OSS Distributions 225*bbb1b6f9SApple OSS Distributions pr_dmodel = (P->p_flag & P_LP64) ? PR_MODEL_LP64 : PR_MODEL_ILP32; 226*bbb1b6f9SApple OSS Distributions 227*bbb1b6f9SApple OSS Distributions pr_taskid = 0; 228*bbb1b6f9SApple OSS Distributions pr_projid = 0; 229*bbb1b6f9SApple OSS Distributions pr_poolid = 0; 230*bbb1b6f9SApple OSS Distributions pr_zoneid = 0; 231*bbb1b6f9SApple OSS Distributions 232*bbb1b6f9SApple OSS Distributions /* 233*bbb1b6f9SApple OSS Distributions * pstats->pstart is a struct timeval: (SECONDS, MICROSECONDS). 234*bbb1b6f9SApple OSS Distributions */ 235*bbb1b6f9SApple OSS Distributions pr_start_tv = P->p_start; 236*bbb1b6f9SApple OSS Distributions }; 237*bbb1b6f9SApple OSS Distributions 238*bbb1b6f9SApple OSS Distributions /* 239*bbb1b6f9SApple OSS Distributions * Translate from the kernel's kthread_t structure to a proc(4) psinfo_t 240*bbb1b6f9SApple OSS Distributions * struct. Lacking a facility to define one translator only in terms of 241*bbb1b6f9SApple OSS Distributions * another, we explicitly define each member by using the proc_t-to-psinfo_t 242*bbb1b6f9SApple OSS Distributions * translator, above; any members added to that translator should also be 243*bbb1b6f9SApple OSS Distributions * added here. (The only exception to this is pr_start, which -- due to it 244*bbb1b6f9SApple OSS Distributions * being a structure -- cannot be defined in terms of a translator at all.) 245*bbb1b6f9SApple OSS Distributions */ 246*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" translator 247*bbb1b6f9SApple OSS Distributions translator psinfo_t < thread_t T > { 248*bbb1b6f9SApple OSS Distributions pr_nlwp = xlate <psinfo_t> (T->t_tro->tro_proc).pr_nlwp; 249*bbb1b6f9SApple OSS Distributions pr_pid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_pid; 250*bbb1b6f9SApple OSS Distributions pr_ppid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_ppid; 251*bbb1b6f9SApple OSS Distributions pr_pgid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_pgid; 252*bbb1b6f9SApple OSS Distributions pr_sid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_sid; 253*bbb1b6f9SApple OSS Distributions pr_uid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_uid; 254*bbb1b6f9SApple OSS Distributions pr_euid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_euid; 255*bbb1b6f9SApple OSS Distributions pr_gid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_gid; 256*bbb1b6f9SApple OSS Distributions pr_egid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_egid; 257*bbb1b6f9SApple OSS Distributions pr_addr = xlate <psinfo_t> (T->t_tro->tro_proc).pr_addr; 258*bbb1b6f9SApple OSS Distributions pr_ttydev = xlate <psinfo_t> (T->t_tro->tro_proc).pr_ttydev; 259*bbb1b6f9SApple OSS Distributions pr_start = xlate <psinfo_t> (T->t_tro->tro_proc).pr_start; 260*bbb1b6f9SApple OSS Distributions pr_fname = xlate <psinfo_t> (T->t_tro->tro_proc).pr_fname; 261*bbb1b6f9SApple OSS Distributions pr_psargs = xlate <psinfo_t> (T->t_tro->tro_proc).pr_psargs; /* XXX omits command line arguments XXX */ 262*bbb1b6f9SApple OSS Distributions pr_argc = xlate <psinfo_t> (T->t_tro->tro_proc).pr_argc; 263*bbb1b6f9SApple OSS Distributions pr_argv = xlate <psinfo_t> (T->t_tro->tro_proc).pr_argv; 264*bbb1b6f9SApple OSS Distributions pr_envp = xlate <psinfo_t> (T->t_tro->tro_proc).pr_envp; 265*bbb1b6f9SApple OSS Distributions pr_dmodel = xlate <psinfo_t> (T->t_tro->tro_proc).pr_dmodel; 266*bbb1b6f9SApple OSS Distributions pr_taskid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_taskid; 267*bbb1b6f9SApple OSS Distributions pr_projid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_projid; 268*bbb1b6f9SApple OSS Distributions pr_poolid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_poolid; 269*bbb1b6f9SApple OSS Distributions pr_zoneid = xlate <psinfo_t> (T->t_tro->tro_proc).pr_zoneid; 270*bbb1b6f9SApple OSS Distributions 271*bbb1b6f9SApple OSS Distributions pr_start_tv = xlate <psinfo_t> (T->t_tro->tro_proc).pr_start_tv; 272*bbb1b6f9SApple OSS Distributions }; 273*bbb1b6f9SApple OSS Distributions 274*bbb1b6f9SApple OSS Distributions /* 275*bbb1b6f9SApple OSS Distributions * Translate from the kernel's kthread_t structure to a proc(4) lwpsinfo_t. 276*bbb1b6f9SApple OSS Distributions * We do not provide support for pr_nice, pr_oldpri, pr_cpu, or pr_pctcpu. 277*bbb1b6f9SApple OSS Distributions * Also, for the moment, pr_start and pr_time are not supported, but these 278*bbb1b6f9SApple OSS Distributions * could be supported by DTrace in the future using subroutines. 279*bbb1b6f9SApple OSS Distributions */ 280*bbb1b6f9SApple OSS Distributions 281*bbb1b6f9SApple OSS Distributions inline processor_t PROCESSOR_NULL = ((processor_t) 0); 282*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" PROCESSOR_NULL 283*bbb1b6f9SApple OSS Distributions 284*bbb1b6f9SApple OSS Distributions typedef int psetid_t; 285*bbb1b6f9SApple OSS Distributions 286*bbb1b6f9SApple OSS Distributions typedef struct lwpsinfo { 287*bbb1b6f9SApple OSS Distributions int pr_flag; /* lwp flags (DEPRECATED; do not use) */ 288*bbb1b6f9SApple OSS Distributions id_t pr_lwpid; /* lwp id */ 289*bbb1b6f9SApple OSS Distributions uintptr_t pr_addr; /* internal address of lwp */ 290*bbb1b6f9SApple OSS Distributions uintptr_t pr_wchan; /* wait addr for sleeping lwp */ 291*bbb1b6f9SApple OSS Distributions char pr_stype; /* synchronization event type */ 292*bbb1b6f9SApple OSS Distributions char pr_state; /* numeric lwp state */ 293*bbb1b6f9SApple OSS Distributions char pr_sname; /* printable character for pr_state */ 294*bbb1b6f9SApple OSS Distributions short pr_syscall; /* system call number (if in syscall) */ 295*bbb1b6f9SApple OSS Distributions int pr_pri; /* priority, high value is high priority */ 296*bbb1b6f9SApple OSS Distributions char pr_clname[8]; /* scheduling class name */ 297*bbb1b6f9SApple OSS Distributions int pr_thstate; /* mach thread scheduler state */ 298*bbb1b6f9SApple OSS Distributions processorid_t pr_onpro; /* processor which last ran this lwp */ 299*bbb1b6f9SApple OSS Distributions processorid_t pr_bindpro; /* processor to which lwp is bound */ 300*bbb1b6f9SApple OSS Distributions psetid_t pr_bindpset; /* processor set to which lwp is bound */ 301*bbb1b6f9SApple OSS Distributions } lwpsinfo_t; 302*bbb1b6f9SApple OSS Distributions 303*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" translator 304*bbb1b6f9SApple OSS Distributions translator lwpsinfo_t < thread_t T > { 305*bbb1b6f9SApple OSS Distributions pr_flag = 0; /* lwp flags (DEPRECATED; do not use) */ 306*bbb1b6f9SApple OSS Distributions pr_lwpid = (id_t)T->thread_id; 307*bbb1b6f9SApple OSS Distributions pr_addr = (uintptr_t)T; 308*bbb1b6f9SApple OSS Distributions pr_wchan = (uintptr_t)(((uthread_t)&T[1])->uu_wchan); 309*bbb1b6f9SApple OSS Distributions 310*bbb1b6f9SApple OSS Distributions pr_stype = SOBJ_NONE; /* XXX Undefined synch object (or none) XXX */ 311*bbb1b6f9SApple OSS Distributions pr_state = curproc->p_stat; 312*bbb1b6f9SApple OSS Distributions pr_sname = (curproc->p_stat == SIDL) ? 'I' : 313*bbb1b6f9SApple OSS Distributions (curproc->p_stat == SRUN) ? 'R' : 314*bbb1b6f9SApple OSS Distributions (curproc->p_stat == SSLEEP) ? 'S' : 315*bbb1b6f9SApple OSS Distributions (curproc->p_stat == SSTOP) ? 'T' : 316*bbb1b6f9SApple OSS Distributions (curproc->p_stat == SZOMB) ? 'Z' : '?'; 317*bbb1b6f9SApple OSS Distributions 318*bbb1b6f9SApple OSS Distributions pr_syscall = ((uthread_t)&T[1])->uu_code; 319*bbb1b6f9SApple OSS Distributions pr_pri = T->sched_pri; 320*bbb1b6f9SApple OSS Distributions 321*bbb1b6f9SApple OSS Distributions pr_clname = (T->sched_mode & 0x0001) ? "RT" : 322*bbb1b6f9SApple OSS Distributions (T->sched_mode & 0x0002) ? "TS" : "SYS"; 323*bbb1b6f9SApple OSS Distributions 324*bbb1b6f9SApple OSS Distributions pr_onpro = (T->last_processor == PROCESSOR_NULL) ? -1 : T->last_processor->cpu_id; 325*bbb1b6f9SApple OSS Distributions pr_bindpro = -1; /* Darwin does not bind threads to processors. */ 326*bbb1b6f9SApple OSS Distributions pr_bindpset = -1; /* Darwin does not partition processors. */ 327*bbb1b6f9SApple OSS Distributions pr_thstate = T->state; 328*bbb1b6f9SApple OSS Distributions }; 329*bbb1b6f9SApple OSS Distributions 330*bbb1b6f9SApple OSS Distributions inline psinfo_t *curpsinfo = xlate <psinfo_t *> (curproc); 331*bbb1b6f9SApple OSS Distributions #pragma D attributes Stable/Stable/Common curpsinfo 332*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" curpsinfo 333*bbb1b6f9SApple OSS Distributions 334*bbb1b6f9SApple OSS Distributions inline lwpsinfo_t *curlwpsinfo = xlate <lwpsinfo_t *> (curthread); 335*bbb1b6f9SApple OSS Distributions #pragma D attributes Stable/Stable/Common curlwpsinfo 336*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" curlwpsinfo 337*bbb1b6f9SApple OSS Distributions 338*bbb1b6f9SApple OSS Distributions /* XXX Really want vn_getpath(curproc->p_fd.fd_cdir, , ) but that takes namecache_rw_lock XXX */ 339*bbb1b6f9SApple OSS Distributions inline string cwd = curproc->p_fd.fd_cdir->v_name == NULL ? 340*bbb1b6f9SApple OSS Distributions "<unknown>" : stringof(curproc->p_fd.fd_cdir->v_name); 341*bbb1b6f9SApple OSS Distributions #pragma D attributes Stable/Stable/Common cwd 342*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" cwd 343*bbb1b6f9SApple OSS Distributions 344*bbb1b6f9SApple OSS Distributions /* XXX Really want vn_getpath(curproc->p_fd.fd_rdir, , ) but that takes namecache_rw_lock XXX */ 345*bbb1b6f9SApple OSS Distributions inline string root = curproc->p_fd.fd_rdir == NULL ? "/" : 346*bbb1b6f9SApple OSS Distributions curproc->p_fd.fd_rdir->v_name == NULL ? "<unknown>" : 347*bbb1b6f9SApple OSS Distributions stringof(curproc->p_fd.fd_rdir->v_name); 348*bbb1b6f9SApple OSS Distributions #pragma D attributes Stable/Stable/Common root 349*bbb1b6f9SApple OSS Distributions #pragma D binding "1.0" root 350*bbb1b6f9SApple OSS Distributions 351*bbb1b6f9SApple OSS Distributions /* Used with livedump. */ 352*bbb1b6f9SApple OSS Distributions inline unsigned DT_HV = 0; 353*bbb1b6f9SApple OSS Distributions #pragma D binding "1.19" DT_HV 354