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