72c28e1c276c9b6cea5436d67795d598df081835
[platform/upstream/gdb.git] / gdb / proc-why.c
1 /* Machine-independent support for SVR4 /proc (process file system)
2
3    Copyright (C) 1999-2014 Free Software Foundation, Inc.
4
5    Written by Michael Snyder at Cygnus Solutions.
6    Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
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 3 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, see <http://www.gnu.org/licenses/>.  */
20
21 #include "defs.h"
22
23 #ifdef NEW_PROC_API
24 #define _STRUCTURED_PROC 1
25 #endif
26
27 #include <stdio.h>
28 #include <sys/types.h>
29 #include <sys/procfs.h>
30
31 #include "proc-utils.h"
32
33 /* Much of the information used in the /proc interface, particularly
34    for printing status information, is kept as tables of structures of
35    the following form.  These tables can be used to map numeric values
36    to their symbolic names and to a string that describes their
37    specific use.  */
38
39 struct trans
40 {
41   int value;                    /* The numeric value.  */
42   char *name;                   /* The equivalent symbolic value.  */
43   char *desc;                   /* Short description of value.  */
44 };
45
46 /* Translate values in the pr_why field of a `struct prstatus' or
47    `struct lwpstatus'.  */
48
49 static struct trans pr_why_table[] =
50 {
51 #if defined (PR_REQUESTED)
52   /* All platforms.  */
53   { PR_REQUESTED, "PR_REQUESTED", 
54     "Directed to stop by debugger via P(IO)CSTOP or P(IO)CWSTOP" },
55 #endif
56 #if defined (PR_SIGNALLED)
57   /* All platforms.  */
58   { PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
59 #endif
60 #if defined (PR_SYSENTRY)
61   /* All platforms.  */
62   { PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
63 #endif
64 #if defined (PR_SYSEXIT)
65   /* All platforms.  */
66   { PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
67 #endif
68 #if defined (PR_JOBCONTROL)
69   /* All platforms.  */
70   { PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
71 #endif
72 #if defined (PR_FAULTED)
73   /* All platforms.  */
74   { PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
75 #endif
76 #if defined (PR_SUSPENDED)
77   /* Solaris only.  */
78   { PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
79 #endif
80 #if defined (PR_CHECKPOINT)
81   /* Solaris only.  */
82   { PR_CHECKPOINT, "PR_CHECKPOINT", "Process stopped at checkpoint" },
83 #endif
84 #if defined (PR_FORKSTOP)
85   /* OSF/1 only.  */
86   { PR_FORKSTOP, "PR_FORKSTOP", "Process stopped at end of fork call" },
87 #endif
88 #if defined (PR_TCRSTOP)
89   /* OSF/1 only.  */
90   { PR_TCRSTOP, "PR_TCRSTOP", "Process stopped on thread creation" },
91 #endif
92 #if defined (PR_TTSTOP)
93   /* OSF/1 only.  */
94   { PR_TTSTOP, "PR_TTSTOP", "Process stopped on thread termination" },
95 #endif
96 #if defined (PR_DEAD)
97   /* OSF/1 only.  */
98   { PR_DEAD, "PR_DEAD", "Process stopped in exit system call" },
99 #endif
100 };
101
102 /* Pretty-print the pr_why field of a `struct prstatus' or `struct
103    lwpstatus'.  */
104
105 void
106 proc_prettyfprint_why (FILE *file, unsigned long why, unsigned long what,
107                        int verbose)
108 {
109   int i;
110
111   if (why == 0)
112     return;
113
114   for (i = 0; i < ARRAY_SIZE (pr_why_table); i++)
115     if (why == pr_why_table[i].value)
116       {
117         fprintf (file, "%s ", pr_why_table[i].name);
118         if (verbose)
119           fprintf (file, ": %s ", pr_why_table[i].desc);
120
121         switch (why) {
122 #ifdef PR_REQUESTED
123         case PR_REQUESTED:
124           break;                /* Nothing more to print.  */
125 #endif
126 #ifdef PR_SIGNALLED
127         case PR_SIGNALLED:
128           proc_prettyfprint_signal (file, what, verbose);
129           break;
130 #endif
131 #ifdef PR_FAULTED
132         case PR_FAULTED:
133           proc_prettyfprint_fault (file, what, verbose);
134           break;
135 #endif
136 #ifdef PR_SYSENTRY
137         case PR_SYSENTRY:
138           fprintf (file, "Entry to ");
139           proc_prettyfprint_syscall (file, what, verbose);
140           break;
141 #endif
142 #ifdef PR_SYSEXIT
143         case PR_SYSEXIT:
144           fprintf (file, "Exit from ");
145           proc_prettyfprint_syscall (file, what, verbose);
146           break;
147 #endif
148 #ifdef PR_JOBCONTROL
149         case PR_JOBCONTROL:
150           proc_prettyfprint_signal (file, what, verbose);
151           break;
152 #endif
153 #ifdef PR_DEAD
154         case PR_DEAD:
155           fprintf (file, "Exit status: %ld\n", what);
156           break;
157 #endif
158         default:
159           fprintf (file, "Unknown why %ld, what %ld\n", why, what);
160           break;
161         }
162         fprintf (file, "\n");
163
164         return;
165       }
166
167   fprintf (file, "Unknown pr_why.\n");
168 }
169
170 void
171 proc_prettyprint_why (unsigned long why, unsigned long what, int verbose)
172 {
173   proc_prettyfprint_why (stdout, why, what, verbose);
174 }