1*b725ae77Skettenis /* Machine independent support for SVR4 /proc (process file system) for GDB.
2*b725ae77Skettenis Copyright 1999, 2000 Free Software Foundation, Inc.
3*b725ae77Skettenis Written by Michael Snyder at Cygnus Solutions.
4*b725ae77Skettenis Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
5*b725ae77Skettenis
6*b725ae77Skettenis This file is part of GDB.
7*b725ae77Skettenis
8*b725ae77Skettenis This program is free software; you can redistribute it and/or modify
9*b725ae77Skettenis it under the terms of the GNU General Public License as published by
10*b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
11*b725ae77Skettenis (at your option) any later version.
12*b725ae77Skettenis
13*b725ae77Skettenis This program is distributed in the hope that it will be useful,
14*b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
15*b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*b725ae77Skettenis GNU General Public License for more details.
17*b725ae77Skettenis
18*b725ae77Skettenis You should have received a copy of the GNU General Public License
19*b725ae77Skettenis along with this program; if not, write to the Free Software Foundation,
20*b725ae77Skettenis Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21*b725ae77Skettenis
22*b725ae77Skettenis /*
23*b725ae77Skettenis * Pretty-print the prstatus flags.
24*b725ae77Skettenis *
25*b725ae77Skettenis * Arguments: unsigned long flags, int verbose
26*b725ae77Skettenis *
27*b725ae77Skettenis */
28*b725ae77Skettenis
29*b725ae77Skettenis #include "defs.h"
30*b725ae77Skettenis
31*b725ae77Skettenis #if defined (NEW_PROC_API)
32*b725ae77Skettenis #define _STRUCTURED_PROC 1
33*b725ae77Skettenis #endif
34*b725ae77Skettenis
35*b725ae77Skettenis #include <stdio.h>
36*b725ae77Skettenis #include <sys/types.h>
37*b725ae77Skettenis #include <sys/procfs.h>
38*b725ae77Skettenis
39*b725ae77Skettenis /* Much of the information used in the /proc interface, particularly for
40*b725ae77Skettenis printing status information, is kept as tables of structures of the
41*b725ae77Skettenis following form. These tables can be used to map numeric values to
42*b725ae77Skettenis their symbolic names and to a string that describes their specific use. */
43*b725ae77Skettenis
44*b725ae77Skettenis struct trans {
45*b725ae77Skettenis int value; /* The numeric value */
46*b725ae77Skettenis char *name; /* The equivalent symbolic value */
47*b725ae77Skettenis char *desc; /* Short description of value */
48*b725ae77Skettenis };
49*b725ae77Skettenis
50*b725ae77Skettenis /* Translate bits in the pr_flags member of the prstatus structure,
51*b725ae77Skettenis into the names and desc information. */
52*b725ae77Skettenis
53*b725ae77Skettenis static struct trans pr_flag_table[] =
54*b725ae77Skettenis {
55*b725ae77Skettenis #if defined (PR_STOPPED)
56*b725ae77Skettenis /* Sol2.5: lwp is stopped
57*b725ae77Skettenis * Sol2.6: lwp is stopped
58*b725ae77Skettenis * Sol2.7: lwp is stopped
59*b725ae77Skettenis * IRIX6: process is stopped
60*b725ae77Skettenis * OSF: task/thread is stopped
61*b725ae77Skettenis * UW: LWP is stopped
62*b725ae77Skettenis */
63*b725ae77Skettenis { PR_STOPPED, "PR_STOPPED", "Process (LWP) is stopped" },
64*b725ae77Skettenis #endif
65*b725ae77Skettenis #if defined (PR_ISTOP)
66*b725ae77Skettenis /* Sol2.5: lwp is stopped on an event of interest
67*b725ae77Skettenis * Sol2.6: lwp is stopped on an event of interest
68*b725ae77Skettenis * Sol2.7: lwp is stopped on an event of interest
69*b725ae77Skettenis * IRIX6: process is stopped on event of interest
70*b725ae77Skettenis * OSF: task/thread stopped on event of interest
71*b725ae77Skettenis * UW: LWP stopped on an event of interest
72*b725ae77Skettenis */
73*b725ae77Skettenis { PR_ISTOP, "PR_ISTOP", "Stopped on an event of interest" },
74*b725ae77Skettenis #endif
75*b725ae77Skettenis #if defined (PR_DSTOP)
76*b725ae77Skettenis /* Sol2.5: lwp has a stop directive in effect
77*b725ae77Skettenis * Sol2.6: lwp has a stop directive in effect
78*b725ae77Skettenis * Sol2.7: lwp has a stop directive in effect
79*b725ae77Skettenis * IRIX6: process has stop directive in effect
80*b725ae77Skettenis * OSF: task/thread has stop directive in effect
81*b725ae77Skettenis * UW: A stop directive is in effect
82*b725ae77Skettenis */
83*b725ae77Skettenis { PR_DSTOP, "PR_DSTOP", "A stop directive is in effect" },
84*b725ae77Skettenis #endif
85*b725ae77Skettenis #if defined (PR_STEP)
86*b725ae77Skettenis /* Sol2.5: lwp has a single-step directive in effect
87*b725ae77Skettenis * Sol2.6: lwp has a single-step directive in effect
88*b725ae77Skettenis * Sol2.7: lwp has a single-step directive in effect
89*b725ae77Skettenis * IRIX6: process has single step pending
90*b725ae77Skettenis */
91*b725ae77Skettenis { PR_STEP, "PR_STEP", "A single step directive is in effect" },
92*b725ae77Skettenis #endif
93*b725ae77Skettenis #if defined (PR_ASLEEP)
94*b725ae77Skettenis /* Sol2.5: lwp is sleeping in a system call
95*b725ae77Skettenis * Sol2.6: lwp is sleeping in a system call
96*b725ae77Skettenis * Sol2.7: lwp is sleeping in a system call
97*b725ae77Skettenis * IRIX6: process is in an interruptible sleep
98*b725ae77Skettenis * OSF: task/thread is asleep within a system call
99*b725ae77Skettenis * UW: LWP is sleep()ing in a system call
100*b725ae77Skettenis */
101*b725ae77Skettenis { PR_ASLEEP, "PR_ASLEEP", "Sleeping in an (interruptible) system call" },
102*b725ae77Skettenis #endif
103*b725ae77Skettenis #if defined (PR_PCINVAL)
104*b725ae77Skettenis /* Sol2.5: contents of pr_instr undefined
105*b725ae77Skettenis * Sol2.6: contents of pr_instr undefined
106*b725ae77Skettenis * Sol2.7: contents of pr_instr undefined
107*b725ae77Skettenis * IRIX6: current pc is invalid
108*b725ae77Skettenis * OSF: program counter contains invalid address
109*b725ae77Skettenis * UW: %pc refers to an invalid virtual address
110*b725ae77Skettenis */
111*b725ae77Skettenis { PR_PCINVAL, "PR_PCINVAL", "PC (pr_instr) is invalid" },
112*b725ae77Skettenis #endif
113*b725ae77Skettenis #if defined (PR_ASLWP)
114*b725ae77Skettenis /* Sol2.5: this lwp is the aslwp
115*b725ae77Skettenis * Sol2.6: this lwp is the aslwp
116*b725ae77Skettenis * Sol2.7: this lwp is the aslwp
117*b725ae77Skettenis */
118*b725ae77Skettenis { PR_ASLWP, "PR_ASLWP", "This is the asynchronous signal LWP" },
119*b725ae77Skettenis #endif
120*b725ae77Skettenis #if defined (PR_AGENT)
121*b725ae77Skettenis /* Sol2.6: this lwp is the /proc agent lwp
122*b725ae77Skettenis * Sol2.7: this lwp is the /proc agent lwp
123*b725ae77Skettenis */
124*b725ae77Skettenis { PR_AGENT, "PR_AGENT", "This is the /proc agent LWP" },
125*b725ae77Skettenis #endif
126*b725ae77Skettenis #if defined (PR_ISSYS)
127*b725ae77Skettenis /* Sol2.5: system process
128*b725ae77Skettenis * Sol2.6: this is a system process
129*b725ae77Skettenis * Sol2.7: this is a system process
130*b725ae77Skettenis * IRIX6: process is a system process
131*b725ae77Skettenis * OSF: task/thread is a system task/thread
132*b725ae77Skettenis * UW: System process
133*b725ae77Skettenis */
134*b725ae77Skettenis { PR_ISSYS, "PR_ISSYS", "Is a system process/thread" },
135*b725ae77Skettenis #endif
136*b725ae77Skettenis #if defined (PR_VFORKP)
137*b725ae77Skettenis /* Sol2.6: process is the parent of a vfork()d child
138*b725ae77Skettenis * Sol2.7: process is the parent of a vfork()d child
139*b725ae77Skettenis */
140*b725ae77Skettenis { PR_VFORKP, "PR_VFORKP", "Process is the parent of a vforked child" },
141*b725ae77Skettenis #endif
142*b725ae77Skettenis #ifdef PR_ORPHAN
143*b725ae77Skettenis /* Sol2.6: process's process group is orphaned
144*b725ae77Skettenis * Sol2.7: process's process group is orphaned
145*b725ae77Skettenis */
146*b725ae77Skettenis { PR_ORPHAN, "PR_ORPHAN", "Process's process group is orphaned" },
147*b725ae77Skettenis #endif
148*b725ae77Skettenis #if defined (PR_FORK)
149*b725ae77Skettenis /* Sol2.5: inherit-on-fork is in effect
150*b725ae77Skettenis * Sol2.6: inherit-on-fork is in effect
151*b725ae77Skettenis * Sol2.7: inherit-on-fork is in effect
152*b725ae77Skettenis * IRIX6: process has inherit-on-fork flag set
153*b725ae77Skettenis * OSF: task/thread has inherit-on-fork flag set
154*b725ae77Skettenis * UW: inherit-on-fork is in effect
155*b725ae77Skettenis */
156*b725ae77Skettenis { PR_FORK, "PR_FORK", "Inherit-on-fork is in effect" },
157*b725ae77Skettenis #endif
158*b725ae77Skettenis #if defined (PR_RLC)
159*b725ae77Skettenis /* Sol2.5: run-on-last-close is in effect
160*b725ae77Skettenis * Sol2.6: run-on-last-close is in effect
161*b725ae77Skettenis * Sol2.7: run-on-last-close is in effect
162*b725ae77Skettenis * IRIX6: process has run-on-last-close flag set
163*b725ae77Skettenis * OSF: task/thread has run-on-last-close flag set
164*b725ae77Skettenis * UW: Run-on-last-close is in effect
165*b725ae77Skettenis */
166*b725ae77Skettenis { PR_RLC, "PR_RLC", "Run-on-last-close is in effect" },
167*b725ae77Skettenis #endif
168*b725ae77Skettenis #if defined (PR_KLC)
169*b725ae77Skettenis /* Sol2.5: kill-on-last-close is in effect
170*b725ae77Skettenis * Sol2.6: kill-on-last-close is in effect
171*b725ae77Skettenis * Sol2.7: kill-on-last-close is in effect
172*b725ae77Skettenis * IRIX6: process has kill-on-last-close flag set
173*b725ae77Skettenis * OSF: kill-on-last-close, superceeds RLC
174*b725ae77Skettenis * UW: kill-on-last-close is in effect
175*b725ae77Skettenis */
176*b725ae77Skettenis { PR_KLC, "PR_KLC", "Kill-on-last-close is in effect" },
177*b725ae77Skettenis #endif
178*b725ae77Skettenis #if defined (PR_ASYNC)
179*b725ae77Skettenis /* Sol2.5: asynchronous-stop is in effect
180*b725ae77Skettenis * Sol2.6: asynchronous-stop is in effect
181*b725ae77Skettenis * Sol2.7: asynchronous-stop is in effect
182*b725ae77Skettenis * OSF: asynchronous stop mode is in effect
183*b725ae77Skettenis * UW: asynchronous stop mode is in effect
184*b725ae77Skettenis */
185*b725ae77Skettenis { PR_ASYNC, "PR_ASYNC", "Asynchronous stop is in effect" },
186*b725ae77Skettenis #endif
187*b725ae77Skettenis #if defined (PR_MSACCT)
188*b725ae77Skettenis /* Sol2.5: micro-state usage accounting is in effect
189*b725ae77Skettenis * Sol2.6: micro-state usage accounting is in effect
190*b725ae77Skettenis * Sol2.7: micro-state usage accounting is in effect
191*b725ae77Skettenis */
192*b725ae77Skettenis { PR_MSACCT, "PR_MSACCT", "Microstate accounting enabled" },
193*b725ae77Skettenis #endif
194*b725ae77Skettenis #if defined (PR_BPTADJ)
195*b725ae77Skettenis /* Sol2.5: breakpoint trap pc adjustment is in effect
196*b725ae77Skettenis * Sol2.6: breakpoint trap pc adjustment is in effect
197*b725ae77Skettenis * Sol2.7: breakpoint trap pc adjustment is in effect
198*b725ae77Skettenis */
199*b725ae77Skettenis { PR_BPTADJ, "PR_BPTADJ", "Breakpoint PC adjustment in effect" },
200*b725ae77Skettenis #endif
201*b725ae77Skettenis #if defined (PR_PTRACE)
202*b725ae77Skettenis /* Note: different meanings on Solaris and Irix 6
203*b725ae77Skettenis * Sol2.5: obsolete, never set in SunOS5.0
204*b725ae77Skettenis * Sol2.6: ptrace-compatibility mode is in effect
205*b725ae77Skettenis * Sol2.7: ptrace-compatibility mode is in effect
206*b725ae77Skettenis * IRIX6: process is traced with ptrace() too
207*b725ae77Skettenis * OSF: task/thread is being traced by ptrace
208*b725ae77Skettenis * UW: Process is being controlled by ptrace(2)
209*b725ae77Skettenis */
210*b725ae77Skettenis { PR_PTRACE, "PR_PTRACE", "Process is being controlled by ptrace" },
211*b725ae77Skettenis #endif
212*b725ae77Skettenis #if defined (PR_PCOMPAT)
213*b725ae77Skettenis /* Note: PCOMPAT on Sol2.5 means same thing as PTRACE on Sol2.6
214*b725ae77Skettenis * Sol2.5 (only): ptrace-compatibility mode is in effect
215*b725ae77Skettenis */
216*b725ae77Skettenis { PR_PCOMPAT, "PR_PCOMPAT", "Ptrace compatibility mode in effect" },
217*b725ae77Skettenis #endif
218*b725ae77Skettenis #ifdef PR_MSFORK
219*b725ae77Skettenis /* Sol2.6: micro-state accounting inherited on fork
220*b725ae77Skettenis * Sol2.7: micro-state accounting inherited on fork
221*b725ae77Skettenis */
222*b725ae77Skettenis { PR_MSFORK, "PR_PCOMPAT", "Micro-state accounting inherited on fork" },
223*b725ae77Skettenis #endif
224*b725ae77Skettenis
225*b725ae77Skettenis #ifdef PR_ISKTHREAD
226*b725ae77Skettenis /* Irix6: process is a kernel thread */
227*b725ae77Skettenis { PR_ISKTHREAD, "PR_KTHREAD", "Process is a kernel thread" },
228*b725ae77Skettenis #endif
229*b725ae77Skettenis
230*b725ae77Skettenis #ifdef PR_ABORT
231*b725ae77Skettenis /* OSF (only): abort the current stop condition */
232*b725ae77Skettenis { PR_ABORT, "PR_ABORT", "Abort the current stop condition" },
233*b725ae77Skettenis #endif
234*b725ae77Skettenis
235*b725ae77Skettenis #ifdef PR_TRACING
236*b725ae77Skettenis /* OSF: task is traced */
237*b725ae77Skettenis { PR_TRACING, "PR_TRACING", "Task is traced" },
238*b725ae77Skettenis #endif
239*b725ae77Skettenis
240*b725ae77Skettenis #ifdef PR_STOPFORK
241*b725ae77Skettenis /* OSF: stop child on fork */
242*b725ae77Skettenis { PR_STOPFORK, "PR_STOPFORK", "Stop child on fork" },
243*b725ae77Skettenis #endif
244*b725ae77Skettenis
245*b725ae77Skettenis #ifdef PR_STOPEXEC
246*b725ae77Skettenis /* OSF: stop on exec */
247*b725ae77Skettenis { PR_STOPEXEC, "PR_STOPEXEC", "Stop on exec" },
248*b725ae77Skettenis #endif
249*b725ae77Skettenis
250*b725ae77Skettenis #ifdef PR_STOPTERM
251*b725ae77Skettenis /* OSF: stop on task exit */
252*b725ae77Skettenis { PR_STOPTERM, "PR_STOPTERM", "Stop on task exit" },
253*b725ae77Skettenis #endif
254*b725ae77Skettenis
255*b725ae77Skettenis #ifdef PR_STOPTCR
256*b725ae77Skettenis /* OSF: stop on thread creation */
257*b725ae77Skettenis { PR_STOPTCR, "PR_STOPTCR", "Stop on thread creation" },
258*b725ae77Skettenis #endif
259*b725ae77Skettenis
260*b725ae77Skettenis #ifdef PR_STOPTTERM
261*b725ae77Skettenis /* OSF: stop on thread exit */
262*b725ae77Skettenis { PR_STOPTTERM, "PR_STOPTTERM", "Stop on thread exit" },
263*b725ae77Skettenis #endif
264*b725ae77Skettenis
265*b725ae77Skettenis #ifdef PR_USCHED
266*b725ae77Skettenis /* OSF: user level scheduling is in effect */
267*b725ae77Skettenis { PR_USCHED, "PR_USCHED", "User level scheduling is in effect" },
268*b725ae77Skettenis #endif
269*b725ae77Skettenis };
270*b725ae77Skettenis
271*b725ae77Skettenis void
proc_prettyfprint_flags(FILE * file,unsigned long flags,int verbose)272*b725ae77Skettenis proc_prettyfprint_flags (FILE *file, unsigned long flags, int verbose)
273*b725ae77Skettenis {
274*b725ae77Skettenis int i;
275*b725ae77Skettenis
276*b725ae77Skettenis for (i = 0; i < sizeof (pr_flag_table) / sizeof (pr_flag_table[0]); i++)
277*b725ae77Skettenis if (flags & pr_flag_table[i].value)
278*b725ae77Skettenis {
279*b725ae77Skettenis fprintf (file, "%s ", pr_flag_table[i].name);
280*b725ae77Skettenis if (verbose)
281*b725ae77Skettenis fprintf (file, "%s\n", pr_flag_table[i].desc);
282*b725ae77Skettenis }
283*b725ae77Skettenis if (!verbose)
284*b725ae77Skettenis fprintf (file, "\n");
285*b725ae77Skettenis }
286*b725ae77Skettenis
287*b725ae77Skettenis void
proc_prettyprint_flags(unsigned long flags,int verbose)288*b725ae77Skettenis proc_prettyprint_flags (unsigned long flags, int verbose)
289*b725ae77Skettenis {
290*b725ae77Skettenis proc_prettyfprint_flags (stdout, flags, verbose);
291*b725ae77Skettenis }
292