xref: /openbsd-src/gnu/usr.bin/binutils/gdb/proc-flags.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
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